[2/2] build: support building ABI versioned files twice
Checks
Commit Message
Any file with ABI versioned functions needs different macros for shared and
static builds, so we need to accomodate that. Rather than building
everything twice, we just flag to the build system which libraries need
that handling, by setting use_function_versioning in the meson.build files.
To ensure we don't get silent errors at build time due to this meson flag
being missed, we add an explicit error to the function versioning header
file if a known C macro is not defined. Since "make" builds always only
build one of shared or static libraries, this define can be always set, and
so is added to the common_base file. For meson, the build flag - and
therefore the C define - is set for the three libraries that need the
function versioning: "distributor", "lpm" and "timer".
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
config/common_base | 1 +
config/rte_config.h | 3 ---
doc/guides/contributing/coding_style.rst | 7 +++++++
lib/librte_distributor/meson.build | 1 +
.../common/include/rte_function_versioning.h | 4 ++++
lib/librte_lpm/meson.build | 1 +
lib/librte_timer/meson.build | 1 +
lib/meson.build | 16 +++++++++++++---
8 files changed, 28 insertions(+), 6 deletions(-)
@@ -111,6 +111,7 @@ CONFIG_RTE_MAX_VFIO_CONTAINERS=64
CONFIG_RTE_MALLOC_DEBUG=n
CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=n
CONFIG_RTE_USE_LIBBSD=n
+CONFIG_RTE_USE_FUNCTION_VERSIONING=y
#
# Recognize/ignore the AVX/AVX512 CPU flags for performance/power testing.
@@ -31,9 +31,6 @@
/****** library defines ********/
-/* compat defines */
-#define RTE_BUILD_SHARED_LIB
-
/* EAL defines */
#define RTE_MAX_HEAPS 32
#define RTE_MAX_MEMSEG_LISTS 128
@@ -948,6 +948,13 @@ reason
built. For missing dependencies this should be of the form
``'missing dependency, "libname"'``.
+use_function_versioning
+ **Default Value = false**.
+ Specifies if the library in question has ABI versioned functions. If it
+ has, this value should be set to ensure that the C files are compiled
+ twice with suitable parameters for each of shared or static library
+ builds.
+
version
**Default Value = 1**.
Specifies the ABI version of the library, and is used as the major
@@ -9,3 +9,4 @@ else
endif
headers = files('rte_distributor.h')
deps += ['mbuf']
+use_function_versioning = true
@@ -7,6 +7,10 @@
#define _RTE_FUNCTION_VERSIONING_H_
#include <rte_common.h>
+#ifndef RTE_USE_FUNCTION_VERSIONING
+#error Use of function versioning disabled, is "use_function_versioning=true" in meson.build?
+#endif
+
#ifdef RTE_BUILD_SHARED_LIB
/*
@@ -8,3 +8,4 @@ headers = files('rte_lpm.h', 'rte_lpm6.h')
# without worrying about which architecture we actually need
headers += files('rte_lpm_altivec.h', 'rte_lpm_neon.h', 'rte_lpm_sse.h')
deps += ['hash']
+use_function_versioning = true
@@ -4,3 +4,4 @@
sources = files('rte_timer.c')
headers = files('rte_timer.h')
allow_experimental_apis = true
+use_function_versioning = true
@@ -47,6 +47,7 @@ foreach l:libraries
name = l
version = 1
allow_experimental_apis = false
+ use_function_versioning = false
sources = []
headers = []
includes = []
@@ -96,6 +97,9 @@ foreach l:libraries
if allow_experimental_apis
cflags += '-DALLOW_EXPERIMENTAL_API'
endif
+ if use_function_versioning
+ cflags += '-DRTE_USE_FUNCTION_VERSIONING'
+ endif
if get_option('per_library_versions')
lib_version = '@0@.1'.format(version)
@@ -117,9 +121,15 @@ foreach l:libraries
include_directories: includes,
dependencies: static_deps)
- # then use pre-build objects to build shared lib
- sources = []
- objs += static_lib.extract_all_objects(recursive: false)
+ if not use_function_versioning
+ # use pre-build objects to build shared lib
+ sources = []
+ objs += static_lib.extract_all_objects(recursive: false)
+ else
+ # for compat we need to rebuild with
+ # RTE_BUILD_SHARED_LIB defined
+ cflags += '-DRTE_BUILD_SHARED_LIB'
+ endif
version_map = '@0@/@1@/rte_@2@_version.map'.format(
meson.current_source_dir(), dir_name, name)
implib = dir_name + '.dll.a'