[dpdk-dev] [PATCH 3/6] build: build all libs and drivers as both static and shared

Bruce Richardson bruce.richardson at intel.com
Tue Dec 12 17:59:37 CET 2017


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 at intel.com>
---
 app/test-pmd/meson.build           |  4 ++--
 drivers/meson.build                | 43 +++++++++++++++++++++++++++-----------
 drivers/net/e1000/base/meson.build |  2 +-
 drivers/net/fm10k/base/meson.build |  2 +-
 drivers/net/i40e/base/meson.build  |  2 +-
 drivers/net/ixgbe/base/meson.build |  2 +-
 examples/meson.build               |  2 +-
 lib/meson.build                    | 37 ++++++++++++++++++++++++--------
 meson.build                        | 22 +++++++------------
 9 files changed, 73 insertions(+), 43 deletions(-)

diff --git a/app/test-pmd/meson.build b/app/test-pmd/meson.build
index 3e591683d..b1820c77d 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 889058d19..bb9a23523 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -69,11 +69,14 @@ foreach class:driver_classes
 			dpdk_conf.set(config_flag_fmt.format(name.to_upper()),1)
 
 			# 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
@@ -83,7 +86,7 @@ foreach class:driver_classes
 				out_filename = '@0 at .pmd.c'.format(src.split('/')[-1])
 				tmp_lib = static_library('tmp_ at 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(),
@@ -102,16 +105,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 at _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,
@@ -120,14 +134,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_ at 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_ at 0@'.format(lib_name), shared_dep)
+			set_variable('static_ at 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 7c0710ec9..dfd2b914c 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 8a371b6ca..490f64918 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 8b491ad89..9128a9c61 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 1781f2eb3..3d0404bd0 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 a17241817..d5397cdd0 100644
--- a/examples/meson.build
+++ b/examples/meson.build
@@ -45,7 +45,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
 	executable('dpdk-' + name, sources,
 		include_directories: includes,
diff --git a/lib/meson.build b/lib/meson.build
index 76cac1023..d12816f55 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -83,11 +83,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 get_option('per_library_versions')
@@ -100,26 +103,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_ at 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 ad9eabb0f..28d37ff7a 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)]
-- 
2.14.3



More information about the dev mailing list