build: build as both static and shared libs
authorBruce Richardson <bruce.richardson@intel.com>
Fri, 3 Nov 2017 17:27:32 +0000 (17:27 +0000)
committerBruce Richardson <bruce.richardson@intel.com>
Tue, 30 Jan 2018 20:58:59 +0000 (21:58 +0100)
This patch changes the build process to group all .o files for a driver or
library into a static archive first, and then link the .o files together
into a shared library. This eliminates the need for separate static or
shared object builds when packaging, for instance.

The "default_library" configuration option now only affects the apps and
examples, which are either linked against the static or shared library
versions depending on the value of the option.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Luca Boccassi <bluca@debian.org>
app/test-pmd/meson.build
drivers/meson.build
drivers/net/e1000/base/meson.build
drivers/net/fm10k/base/meson.build
drivers/net/i40e/base/meson.build
drivers/net/ixgbe/base/meson.build
examples/meson.build
lib/meson.build
meson.build

index 44f50b2..f4c1d95 100644 (file)
@@ -46,7 +46,7 @@ sources = files('cmdline.c',
        'testpmd.c',
        'txonly.c')
 
-deps = ['ethdev', 'gro', 'gso', 'cmdline', 'metrics', 'meter']
+deps = ['ethdev', 'gro', 'gso', 'cmdline', 'metrics', 'meter', 'bus_pci']
 if dpdk_conf.has('RTE_LIBRTE_PDUMP')
        deps += 'pdump'
 endif
@@ -63,7 +63,7 @@ endif
 
 dep_objs = []
 foreach d:deps
-       dep_objs += get_variable('dep_rte_' + d)
+       dep_objs += get_variable(get_option('default_library') + '_rte_' + d)
 endforeach
 
 link_libs = []
index 451abac..c5c5611 100644 (file)
@@ -74,11 +74,14 @@ foreach class:driver_classes
                        endif
 
                        # get dependency objs from strings
-                       dep_objs = []
+                       shared_objs = []
+                       static_objs = []
                        foreach d:deps
-                               dep_objs += [get_variable('dep_rte_' + d)]
+                               shared_objs += [get_variable('shared_rte_' + d)]
+                               static_objs += [get_variable('static_rte_' + d)]
                        endforeach
-                       dep_objs += ext_deps
+                       shared_objs += ext_deps
+                       static_objs += ext_deps
                        dpdk_extra_ldflags += pkgconfig_extra_libs
 
                        # generate pmdinfo sources
@@ -88,7 +91,7 @@ foreach class:driver_classes
                                out_filename = '@0@.pmd.c'.format(src.split('/')[-1])
                                tmp_lib = static_library('tmp_@0@'.format(src.underscorify()),
                                        src, include_directories: includes,
-                                       dependencies: dep_objs,
+                                       dependencies: static_objs,
                                        c_args: cflags)
                                sources += custom_target(out_filename,
                                                command: [pmdinfo, tmp_lib.full_path(),
@@ -107,16 +110,27 @@ foreach class:driver_classes
                                so_version = lib_version
                        endif
 
-                       # now build the driver itself, and add to the drivers list
+                       # now build the static driver
                        lib_name = driver_name_fmt.format(name)
+                       static_lib = static_library(lib_name,
+                               sources,
+                               objects: objs,
+                               include_directories: includes,
+                               dependencies: static_objs,
+                               c_args: cflags,
+                               install: true)
+
+                       # now build the shared driver
+                       sources = []
+                       objs += static_lib.extract_all_objects()
                        version_map = '@0@/@1@/@2@_version.map'.format(
                                        meson.current_source_dir(),
                                        drv_path, lib_name)
-                       lib = library(lib_name,
+                       shared_lib = shared_library(lib_name,
                                sources,
                                objects: objs,
                                include_directories: includes,
-                               dependencies: dep_objs,
+                               dependencies: shared_objs,
                                c_args: cflags,
                                link_args: '-Wl,--version-script=' + version_map,
                                link_depends: version_map,
@@ -125,14 +139,19 @@ foreach class:driver_classes
                                install: true,
                                install_dir: driver_install_path)
 
-                       dpdk_drivers += lib
-
                        # create a dependency object and add it to the global dictionary so
                        # testpmd or other built-in apps can find it if necessary
-                       set_variable('dep_@0@'.format(lib_name),
-                                       declare_dependency(link_with: lib,
+                       shared_dep = declare_dependency(link_with: shared_lib,
+                                       include_directories: includes,
+                                       dependencies: shared_objs)
+                       static_dep = declare_dependency(link_with: static_lib,
                                        include_directories: includes,
-                                       dependencies: dep_objs))
+                                       dependencies: static_objs)
+
+                       dpdk_drivers += static_lib
+
+                       set_variable('shared_@0@'.format(lib_name), shared_dep)
+                       set_variable('static_@0@'.format(lib_name), static_dep)
                endif # build
        endforeach
 endforeach
index 7c0710e..dfd2b91 100644 (file)
@@ -60,6 +60,6 @@ foreach flag: error_cflags
 endforeach
 
 base_lib = static_library('e1000_base', sources,
-       dependencies: dep_rte_eal,
+       dependencies: static_rte_eal,
        c_args: c_args)
 base_objs = base_lib.extract_all_objects()
index 8a371b6..490f649 100644 (file)
@@ -50,6 +50,6 @@ foreach flag: error_cflags
 endforeach
 
 base_lib = static_library('fm10k_base', sources,
-       dependencies: dep_rte_eal,
+       dependencies: static_rte_eal,
        c_args: c_args)
 base_objs = base_lib.extract_all_objects()
index 8b491ad..9128a9c 100644 (file)
@@ -51,6 +51,6 @@ foreach flag: error_cflags
 endforeach
 
 base_lib = static_library('i40e_base', sources,
-       dependencies: dep_rte_eal,
+       dependencies: static_rte_eal,
        c_args: c_args)
 base_objs = base_lib.extract_all_objects()
index 1781f2e..3d0404b 100644 (file)
@@ -55,6 +55,6 @@ foreach flag: error_cflags
 endforeach
 
 base_lib = static_library('ixgbe_base', sources,
-       dependencies: dep_rte_eal,
+       dependencies: static_rte_eal,
        c_args: c_args)
 base_objs = base_lib.extract_all_objects()
index 8ee33c1..32d911c 100644 (file)
@@ -46,7 +46,7 @@ foreach example: get_option('examples').split(',')
 
        dep_objs = ext_deps
        foreach d:deps
-               dep_objs += [get_variable('dep_rte_' + d)]
+               dep_objs += [get_variable(get_option('default_library') + '_rte_' + d)]
        endforeach
        if allow_experimental_apis
                cflags += '-DALLOW_EXPERIMENTAL_API'
index d7836d7..6daa816 100644 (file)
@@ -85,11 +85,14 @@ foreach l:libraries
 
                if sources.length() == 0
                        # if no C files, just set a dependency on header path
-                       dep = declare_dependency(include_directories: includes)
+                       shared_dep = declare_dependency(include_directories: includes)
+                       static_dep = shared_dep
                else
-                       dep_objs = ext_deps
+                       shared_deps = ext_deps
+                       static_deps = ext_deps
                        foreach d:deps
-                               dep_objs += [get_variable('dep_rte_' + d)]
+                               shared_deps += [get_variable('shared_rte_' + d)]
+                               static_deps += [get_variable('static_rte_' + d)]
                        endforeach
 
                        if allow_experimental_apis
@@ -106,26 +109,42 @@ foreach l:libraries
                                so_version = lib_version
                        endif
 
+                       # first build static lib
+                       static_lib = static_library(libname,
+                                       sources,
+                                       objects: objs,
+                                       c_args: cflags,
+                                       dependencies: static_deps,
+                                       include_directories: includes,
+                                       install: true)
+                       static_dep = declare_dependency(link_with: static_lib,
+                                       include_directories: includes,
+                                       dependencies: static_deps)
+
+                       # then use pre-build objects to build shared lib
+                       sources = []
+                       objs += static_lib.extract_all_objects()
                        version_map = '@0@/@1@/rte_@2@_version.map'.format(
                                        meson.current_source_dir(), dir_name, name)
-                       lib = library(libname,
+                       shared_lib = shared_library(libname,
                                        sources,
                                        objects: objs,
                                        c_args: cflags,
-                                       dependencies: dep_objs,
+                                       dependencies: shared_deps,
                                        include_directories: includes,
                                        link_args: '-Wl,--version-script=' + version_map,
                                        link_depends: version_map,
                                        version: lib_version,
                                        soversion: so_version,
                                        install: true)
-                       dep = declare_dependency(link_with: lib,
+                       shared_dep = declare_dependency(link_with: shared_lib,
                                        include_directories: includes,
-                                       dependencies: dep_objs)
+                                       dependencies: shared_deps)
 
-                       dpdk_libraries = [lib] + dpdk_libraries
+                       dpdk_libraries = [shared_lib] + dpdk_libraries
                endif # sources.length() > 0
 
-               set_variable('dep_' + libname, dep)
+               set_variable('shared_' + libname, shared_dep)
+               set_variable('static_' + libname, static_dep)
        endif # if build
 endforeach
index 8c08436..df10f5f 100644 (file)
@@ -43,15 +43,8 @@ dpdk_libraries = []
 dpdk_drivers = []
 dpdk_extra_ldflags = []
 
-# for static libs, treat the drivers as regular libraries, otherwise
-# for shared libs, put them in a driver folder
-if get_option('default_library') == 'static'
-       driver_install_path = get_option('libdir')
-       eal_pmd_path = ''
-else
-       driver_install_path = join_paths(get_option('libdir'), 'dpdk/drivers')
-       eal_pmd_path = join_paths(get_option('prefix'), driver_install_path)
-endif
+driver_install_path = join_paths(get_option('libdir'), 'dpdk/drivers')
+eal_pmd_path = join_paths(get_option('prefix'), driver_install_path)
 
 # configure the build, and make sure configs here and in config folder are
 # able to be included in any file. We also store a global array of include dirs
@@ -80,18 +73,17 @@ configure_file(output: build_cfg,
                install_dir: join_paths(get_option('includedir'),
                                get_option('include_subdir_arch')))
 
-# for static builds, include the drivers as libs, and also any
-# other dependent libs that DPDK needs to link against
-if get_option('default_library') == 'static'
-       dpdk_drivers = ['-Wl,--whole-archive'] + dpdk_drivers + ['-Wl,--no-whole-archive']
-       dpdk_libraries = dpdk_drivers + dpdk_libraries + dpdk_extra_ldflags
-endif
+# for static builds, include the drivers as libs and we need to "whole-archive"
+# them.
+dpdk_drivers = ['-Wl,--whole-archive'] + dpdk_drivers + ['-Wl,--no-whole-archive']
 
 pkg = import('pkgconfig')
 pkg.generate(name: meson.project_name(),
        filebase: 'lib' + meson.project_name().to_lower(),
        version: meson.project_version(),
        libraries: dpdk_libraries,
+       libraries_private: dpdk_drivers + dpdk_libraries +
+                       ['-Wl,-Bdynamic'] + dpdk_extra_ldflags,
        description: 'The Data Plane Development Kit (DPDK)',
        subdirs: [get_option('include_subdir_arch'), '.'],
        extra_cflags: ['-include', 'rte_config.h', '-march=@0@'.format(machine)]