From: Bruce Richardson Date: Fri, 3 Nov 2017 17:27:32 +0000 (+0000) Subject: build: build as both static and shared libs X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=3e5c3d58e1dbbcdc803ca87ebf1d26129645d70a;p=dpdk.git build: build as both static and shared libs 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 Acked-by: Luca Boccassi --- diff --git a/app/test-pmd/meson.build b/app/test-pmd/meson.build index 44f50b270e..f4c1d957f1 100644 --- a/app/test-pmd/meson.build +++ b/app/test-pmd/meson.build @@ -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 = [] diff --git a/drivers/meson.build b/drivers/meson.build index 451abac9a7..c5c5611b27 100644 --- a/drivers/meson.build +++ b/drivers/meson.build @@ -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 diff --git a/drivers/net/e1000/base/meson.build b/drivers/net/e1000/base/meson.build index 7c0710ec93..dfd2b914c2 100644 --- a/drivers/net/e1000/base/meson.build +++ b/drivers/net/e1000/base/meson.build @@ -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() diff --git a/drivers/net/fm10k/base/meson.build b/drivers/net/fm10k/base/meson.build index 8a371b6ca5..490f649183 100644 --- a/drivers/net/fm10k/base/meson.build +++ b/drivers/net/fm10k/base/meson.build @@ -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() diff --git a/drivers/net/i40e/base/meson.build b/drivers/net/i40e/base/meson.build index 8b491ad897..9128a9c619 100644 --- a/drivers/net/i40e/base/meson.build +++ b/drivers/net/i40e/base/meson.build @@ -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() diff --git a/drivers/net/ixgbe/base/meson.build b/drivers/net/ixgbe/base/meson.build index 1781f2eb33..3d0404bd0a 100644 --- a/drivers/net/ixgbe/base/meson.build +++ b/drivers/net/ixgbe/base/meson.build @@ -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() diff --git a/examples/meson.build b/examples/meson.build index 8ee33c1055..32d911c387 100644 --- a/examples/meson.build +++ b/examples/meson.build @@ -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' diff --git a/lib/meson.build b/lib/meson.build index d7836d7175..6daa8166dc 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -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 diff --git a/meson.build b/meson.build index 8c084367c0..df10f5f9e7 100644 --- a/meson.build +++ b/meson.build @@ -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)]