From a5d4ea594307c77af393386212a434c63e9dd96b Mon Sep 17 00:00:00 2001 From: Bruce Richardson Date: Mon, 7 Oct 2019 16:45:50 +0100 Subject: [PATCH] build: support building ABI versioned files twice Any file with ABI versioned functions needs different macros for shared and static builds, so we need to accommodate 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 global CFLAGS. 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 Acked-by: Stephen Hemminger Tested-by: Andrzej Ostruszka Reviewed-by: Andrzej Ostruszka --- 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 +++++++++++++--- mk/target/generic/rte.vars.mk | 8 ++++++++ 8 files changed, 35 insertions(+), 6 deletions(-) diff --git a/config/rte_config.h b/config/rte_config.h index 895475a44d..d30786bc08 100644 --- a/config/rte_config.h +++ b/config/rte_config.h @@ -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 diff --git a/doc/guides/contributing/coding_style.rst b/doc/guides/contributing/coding_style.rst index 449b33494b..e95a1a2be2 100644 --- a/doc/guides/contributing/coding_style.rst +++ b/doc/guides/contributing/coding_style.rst @@ -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 diff --git a/lib/librte_distributor/meson.build b/lib/librte_distributor/meson.build index 26577dbc19..c9617d7b14 100644 --- a/lib/librte_distributor/meson.build +++ b/lib/librte_distributor/meson.build @@ -9,6 +9,7 @@ else endif headers = files('rte_distributor.h') deps += ['mbuf'] +use_function_versioning = true # for clang 32-bit compiles we need libatomic for 64-bit atomic ops if cc.get_id() == 'clang' and dpdk_conf.get('RTE_ARCH_64') == false diff --git a/lib/librte_eal/common/include/rte_function_versioning.h b/lib/librte_eal/common/include/rte_function_versioning.h index ce963d4b12..55e88ffae6 100644 --- a/lib/librte_eal/common/include/rte_function_versioning.h +++ b/lib/librte_eal/common/include/rte_function_versioning.h @@ -7,6 +7,10 @@ #define _RTE_FUNCTION_VERSIONING_H_ #include +#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 /* diff --git a/lib/librte_lpm/meson.build b/lib/librte_lpm/meson.build index a5176d8aef..4e3920660b 100644 --- a/lib/librte_lpm/meson.build +++ b/lib/librte_lpm/meson.build @@ -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 diff --git a/lib/librte_timer/meson.build b/lib/librte_timer/meson.build index d3b828ce9d..b7edfe2e7d 100644 --- a/lib/librte_timer/meson.build +++ b/lib/librte_timer/meson.build @@ -4,3 +4,4 @@ sources = files('rte_timer.c') headers = files('rte_timer.h') allow_experimental_apis = true +use_function_versioning = true diff --git a/lib/meson.build b/lib/meson.build index 8ea3671c04..f29eb415ee 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -47,6 +47,7 @@ foreach l:libraries name = l version = 1 allow_experimental_apis = false + use_function_versioning = false sources = [] headers = [] includes = [] @@ -99,6 +100,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) @@ -120,9 +124,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' diff --git a/mk/target/generic/rte.vars.mk b/mk/target/generic/rte.vars.mk index 5f00a0bfaf..374722173d 100644 --- a/mk/target/generic/rte.vars.mk +++ b/mk/target/generic/rte.vars.mk @@ -90,6 +90,14 @@ ASFLAGS += $(TARGET_ASFLAGS) CFLAGS += -I$(RTE_OUTPUT)/include LDFLAGS += -L$(RTE_OUTPUT)/lib +# add in flag for supporting function versioning. The define is used in meson +# builds to ensure that the user has properly flagged the unit in question as +# using function versioning so it can be built twice - once for static lib and +# then a second time for the shared lib. Since make only builds one library +# type at a time, such precautions aren't necessary, so we can globally define +# the flag +CFLAGS += -DRTE_USE_FUNCTION_VERSIONING + # always include rte_config.h: the one in $(RTE_OUTPUT)/include is # the configuration of SDK when $(BUILDING_RTE_SDK) is true, or the # configuration of the application if $(BUILDING_RTE_SDK) is not -- 2.20.1