DPDK-dev Archive on lore.kernel.org
 help / color / Atom feed
From: Bruce Richardson <bruce.richardson@intel.com>
To: dev@dpdk.org
Cc: Andrzej Ostruszka <amo@semihalf.com>,
	Thomas Monjalon <thomas@monjalon.net>,
	Ray Kinsella <mdr@ashroe.eu>, Neil Horman <nhorman@tuxdriver.com>,
	bluca@debian.org, Bruce Richardson <bruce.richardson@intel.com>
Subject: [dpdk-dev] [PATCH v2 2/2] build: support building ABI versioned files twice
Date: Fri, 27 Sep 2019 21:59:31 +0100
Message-ID: <20190927205931.23022-3-bruce.richardson@intel.com> (raw)
In-Reply-To: <20190927205931.23022-1-bruce.richardson@intel.com>

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(-)

diff --git a/config/common_base b/config/common_base
index 8ef75c203..655258a97 100644
--- a/config/common_base
+++ b/config/common_base
@@ -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.
diff --git a/config/rte_config.h b/config/rte_config.h
index 0bbbe274f..b63a2fdea 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 449b33494..e95a1a2be 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 dba7e3b2a..5149f9bf5 100644
--- a/lib/librte_distributor/meson.build
+++ b/lib/librte_distributor/meson.build
@@ -9,3 +9,4 @@ else
 endif
 headers = files('rte_distributor.h')
 deps += ['mbuf']
+use_function_versioning = true
diff --git a/lib/librte_eal/common/include/rte_function_versioning.h b/lib/librte_eal/common/include/rte_function_versioning.h
index ce963d4b1..55e88ffae 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 <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
 
 /*
diff --git a/lib/librte_lpm/meson.build b/lib/librte_lpm/meson.build
index a5176d8ae..4e3920660 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 d3b828ce9..b7edfe2e7 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 e5ff83893..1b0ed767c 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 = []
@@ -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'
-- 
2.21.0


  parent reply index

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-27 19:49 [dpdk-dev] [PATCH 0/2] Improve function versioning meson support Bruce Richardson
2019-09-27 19:49 ` [dpdk-dev] [PATCH 1/2] eal: split compat header file Bruce Richardson
2019-09-27 20:48   ` Bruce Richardson
2019-09-27 19:49 ` [dpdk-dev] [PATCH 2/2] build: support building ABI versioned files twice Bruce Richardson
2019-09-27 20:59 ` [dpdk-dev] [PATCH v2 0/2] Improve function versioning meson support Bruce Richardson
2019-09-27 20:59   ` [dpdk-dev] [PATCH v2 1/2] eal: split compat header file Bruce Richardson
2019-09-27 20:59   ` Bruce Richardson [this message]
2019-10-01 13:23     ` [dpdk-dev] [PATCH v2 2/2] build: support building ABI versioned files twice Andrzej Ostruszka
2019-10-01 16:53       ` Bruce Richardson
2019-10-07 15:57         ` Bruce Richardson
2019-10-07 15:45 ` [dpdk-dev] [PATCH v3 0/2] Improve function versioning meson support Bruce Richardson
2019-10-07 15:45   ` [dpdk-dev] [PATCH v3 1/2] eal: split compat header file Bruce Richardson
2019-10-27  9:49     ` Thomas Monjalon
2019-10-07 15:45   ` [dpdk-dev] [PATCH v3 2/2] build: support building ABI versioned files twice Bruce Richardson
2019-10-23 10:19   ` [dpdk-dev] [PATCH v3 0/2] Improve function versioning meson support Andrzej Ostruszka
2019-10-27 10:26     ` Thomas Monjalon
2019-10-09 22:59 ` [dpdk-dev] [PATCH " Stephen Hemminger

Reply instructions:

You may reply publically to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190927205931.23022-3-bruce.richardson@intel.com \
    --to=bruce.richardson@intel.com \
    --cc=amo@semihalf.com \
    --cc=bluca@debian.org \
    --cc=dev@dpdk.org \
    --cc=mdr@ashroe.eu \
    --cc=nhorman@tuxdriver.com \
    --cc=thomas@monjalon.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

DPDK-dev Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/dpdk-dev/0 dpdk-dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dpdk-dev dpdk-dev/ https://lore.kernel.org/dpdk-dev \
		dev@dpdk.org
	public-inbox-index dpdk-dev

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git