[v2,01/10] config: change ABI versioning for global

Message ID 6b0a64dba971a8d244271f36e283813814412efc.1571229052.git.anatoly.burakov@intel.com (mailing list archive)
State Superseded, archived
Headers
Series Implement the new ABI policy and add helper scripts |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/iol-compilation success Compile Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/Intel-compilation success Compilation OK

Commit Message

Burakov, Anatoly Oct. 16, 2019, 12:43 p.m. UTC
  From: Marcin Baran <marcinx.baran@intel.com>

The libraries should be maintained using global
ABI versioning. The changes includes adding global
ABI version support for both makefile and meson
build system. Experimental libraries should be
marked as 0.

Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
 buildtools/meson.build |  2 ++
 config/ABI_VERSION     |  1 +
 config/meson.build     |  3 ++-
 drivers/meson.build    | 20 ++++++++++++++------
 lib/meson.build        | 18 +++++++++++++-----
 meson_options.txt      |  2 --
 mk/rte.lib.mk          | 19 +++++++++++--------
 7 files changed, 43 insertions(+), 22 deletions(-)
 create mode 100644 config/ABI_VERSION
  

Comments

Bruce Richardson Oct. 16, 2019, 1:22 p.m. UTC | #1
On Wed, Oct 16, 2019 at 01:43:16PM +0100, Anatoly Burakov wrote:
> From: Marcin Baran <marcinx.baran@intel.com>
> 
> The libraries should be maintained using global
> ABI versioning. The changes includes adding global
> ABI version support for both makefile and meson
> build system. Experimental libraries should be
> marked as 0.
> 
> Signed-off-by: Marcin Baran <marcinx.baran@intel.com>
> Signed-off-by: Pawel Modrak <pawelx.modrak@intel.com>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> ---

Some comments inline below.

/Bruce

>  buildtools/meson.build |  2 ++
>  config/ABI_VERSION     |  1 +
>  config/meson.build     |  3 ++-
>  drivers/meson.build    | 20 ++++++++++++++------
>  lib/meson.build        | 18 +++++++++++++-----
>  meson_options.txt      |  2 --
>  mk/rte.lib.mk          | 19 +++++++++++--------
>  7 files changed, 43 insertions(+), 22 deletions(-)
>  create mode 100644 config/ABI_VERSION
> 
> diff --git a/buildtools/meson.build b/buildtools/meson.build
> index 32c79c1308..78ce69977d 100644
> --- a/buildtools/meson.build
> +++ b/buildtools/meson.build
> @@ -12,3 +12,5 @@ if python3.found()
>  else
>  	map_to_def_cmd = ['meson', 'runpython', files('map_to_def.py')]
>  endif
> +
> +is_experimental_cmd = [find_program('grep', 'findstr'), '^DPDK_']
> diff --git a/config/ABI_VERSION b/config/ABI_VERSION
> new file mode 100644
> index 0000000000..9a7c1e503f
> --- /dev/null
> +++ b/config/ABI_VERSION
> @@ -0,0 +1 @@
> +20.0
> diff --git a/config/meson.build b/config/meson.build
> index a27f731f85..25ecf928e4 100644
> --- a/config/meson.build
> +++ b/config/meson.build
> @@ -17,7 +17,8 @@ endforeach
>  # set the major version, which might be used by drivers and libraries
>  # depending on the configuration options
>  pver = meson.project_version().split('.')
> -major_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
> +major_version = run_command(find_program('cat', 'more'),
> +	files('ABI_VERSION')).stdout().strip()
>  

I wonder if we should rename this to abi_version rather than major_version?

>  # extract all version information into the build configuration
>  dpdk_conf.set('RTE_VER_YEAR', pver.get(0).to_int())
> diff --git a/drivers/meson.build b/drivers/meson.build
> index 2ed2e95411..5c5fe87c7e 100644
> --- a/drivers/meson.build
> +++ b/drivers/meson.build
> @@ -110,9 +110,20 @@ foreach class:dpdk_driver_classes
>  					output: out_filename,
>  					depends: [pmdinfogen, tmp_lib])
>  
> -			if get_option('per_library_versions')
> -				lib_version = '@0@.1'.format(version)
> -				so_version = '@0@'.format(version)
> +			version_map = '@0@/@1@/@2@_version.map'.format(
> +					meson.current_source_dir(),
> +					drv_path, lib_name)
> +
> +			if is_windows
> +				version_map = '\\'.join(version_map.split('/'))
> +			endif

Don't think this block should be needed. Windows generally supports using
"/" as a separator, even if traditionally "\" was used.

> +
> +			is_experimental = run_command(is_experimental_cmd,
> +				files(version_map)).returncode()
> +
> +			if is_experimental != 0
> +				lib_version = '0.1'
> +				so_version = '0'
>  			else
>  				lib_version = major_version
>  				so_version = major_version
> @@ -128,9 +139,6 @@ foreach class:dpdk_driver_classes
>  				install: true)
>  
>  			# now build the shared driver
> -			version_map = '@0@/@1@/@2@_version.map'.format(
> -					meson.current_source_dir(),
> -					drv_path, lib_name)
>  			shared_lib = shared_library(lib_name,
>  				sources,
>  				objects: objs,
> diff --git a/lib/meson.build b/lib/meson.build
> index e5ff838934..3892c16e8f 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -97,9 +97,19 @@ foreach l:libraries
>  				cflags += '-DALLOW_EXPERIMENTAL_API'
>  			endif
>  
> -			if get_option('per_library_versions')
> -				lib_version = '@0@.1'.format(version)
> -				so_version = '@0@'.format(version)
> +			version_map = '@0@/@1@/rte_@2@_version.map'.format(
> +					meson.current_source_dir(), dir_name, name)
> +
> +			if is_windows
> +				version_map = '\\'.join(version_map.split('/'))
> +			endif
As above.

> +
> +			is_experimental = run_command(is_experimental_cmd,
> +					files(version_map)).returncode()
> +
> +			if is_experimental != 0
> +				lib_version = '0.1'
> +				so_version = '0'
>  			else
>  				lib_version = major_version
>  				so_version = major_version
> @@ -120,8 +130,6 @@ foreach l:libraries
>  			# then use pre-build objects to build shared lib
>  			sources = []
>  			objs += static_lib.extract_all_objects(recursive: false)
> -			version_map = '@0@/@1@/rte_@2@_version.map'.format(
> -					meson.current_source_dir(), dir_name, name)
>  			implib = dir_name + '.dll.a'
>  
>  			def_file = custom_target(name + '_def',
> diff --git a/meson_options.txt b/meson_options.txt
> index 448f3e63dc..000e38fd98 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -28,8 +28,6 @@ option('max_lcores', type: 'integer', value: 128,
>  	description: 'maximum number of cores/threads supported by EAL')
>  option('max_numa_nodes', type: 'integer', value: 4,
>  	description: 'maximum number of NUMA nodes supported by EAL')
> -option('per_library_versions', type: 'boolean', value: true,
> -	description: 'true: each lib gets its own version number, false: DPDK version used for each lib')
>  option('tests', type: 'boolean', value: true,
>  	description: 'build unit tests')
>  option('use_hpet', type: 'boolean', value: false,
> diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
> index 4df8849a08..f84161c6d5 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -11,20 +11,23 @@ EXTLIB_BUILD ?= n
>  # VPATH contains at least SRCDIR
>  VPATH += $(SRCDIR)
>  
> -ifneq ($(CONFIG_RTE_MAJOR_ABI),)
> -ifneq ($(LIBABIVER),)
> -LIBABIVER := $(CONFIG_RTE_MAJOR_ABI)
> +ifeq ($(OS), Windows_NT)
> +search_cmd = findstr
> +print_cmd = more
> +else
> +search_cmd = grep
> +print_cmd = cat
We don't support make on windows, so no need for using findstr.

>  endif
> +
> +ifneq ($(shell $(search_cmd) "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),)
> +LIBABIVER := $(shell $(print_cmd) $(RTE_SRCDIR)/config/ABI_VERSION)
> +else
> +LIBABIVER := 0
>  endif
>  
>  ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
>  LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
>  ifeq ($(EXTLIB_BUILD),n)
> -ifeq ($(CONFIG_RTE_MAJOR_ABI),)
> -ifeq ($(CONFIG_RTE_NEXT_ABI),y)
> -LIB := $(LIB).1
> -endif
> -endif
>  CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
>  endif
>  endif
> -- 
> 2.17.1
  

Patch

diff --git a/buildtools/meson.build b/buildtools/meson.build
index 32c79c1308..78ce69977d 100644
--- a/buildtools/meson.build
+++ b/buildtools/meson.build
@@ -12,3 +12,5 @@  if python3.found()
 else
 	map_to_def_cmd = ['meson', 'runpython', files('map_to_def.py')]
 endif
+
+is_experimental_cmd = [find_program('grep', 'findstr'), '^DPDK_']
diff --git a/config/ABI_VERSION b/config/ABI_VERSION
new file mode 100644
index 0000000000..9a7c1e503f
--- /dev/null
+++ b/config/ABI_VERSION
@@ -0,0 +1 @@ 
+20.0
diff --git a/config/meson.build b/config/meson.build
index a27f731f85..25ecf928e4 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -17,7 +17,8 @@  endforeach
 # set the major version, which might be used by drivers and libraries
 # depending on the configuration options
 pver = meson.project_version().split('.')
-major_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
+major_version = run_command(find_program('cat', 'more'),
+	files('ABI_VERSION')).stdout().strip()
 
 # extract all version information into the build configuration
 dpdk_conf.set('RTE_VER_YEAR', pver.get(0).to_int())
diff --git a/drivers/meson.build b/drivers/meson.build
index 2ed2e95411..5c5fe87c7e 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -110,9 +110,20 @@  foreach class:dpdk_driver_classes
 					output: out_filename,
 					depends: [pmdinfogen, tmp_lib])
 
-			if get_option('per_library_versions')
-				lib_version = '@0@.1'.format(version)
-				so_version = '@0@'.format(version)
+			version_map = '@0@/@1@/@2@_version.map'.format(
+					meson.current_source_dir(),
+					drv_path, lib_name)
+
+			if is_windows
+				version_map = '\\'.join(version_map.split('/'))
+			endif
+
+			is_experimental = run_command(is_experimental_cmd,
+				files(version_map)).returncode()
+
+			if is_experimental != 0
+				lib_version = '0.1'
+				so_version = '0'
 			else
 				lib_version = major_version
 				so_version = major_version
@@ -128,9 +139,6 @@  foreach class:dpdk_driver_classes
 				install: true)
 
 			# now build the shared driver
-			version_map = '@0@/@1@/@2@_version.map'.format(
-					meson.current_source_dir(),
-					drv_path, lib_name)
 			shared_lib = shared_library(lib_name,
 				sources,
 				objects: objs,
diff --git a/lib/meson.build b/lib/meson.build
index e5ff838934..3892c16e8f 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -97,9 +97,19 @@  foreach l:libraries
 				cflags += '-DALLOW_EXPERIMENTAL_API'
 			endif
 
-			if get_option('per_library_versions')
-				lib_version = '@0@.1'.format(version)
-				so_version = '@0@'.format(version)
+			version_map = '@0@/@1@/rte_@2@_version.map'.format(
+					meson.current_source_dir(), dir_name, name)
+
+			if is_windows
+				version_map = '\\'.join(version_map.split('/'))
+			endif
+
+			is_experimental = run_command(is_experimental_cmd,
+					files(version_map)).returncode()
+
+			if is_experimental != 0
+				lib_version = '0.1'
+				so_version = '0'
 			else
 				lib_version = major_version
 				so_version = major_version
@@ -120,8 +130,6 @@  foreach l:libraries
 			# then use pre-build objects to build shared lib
 			sources = []
 			objs += static_lib.extract_all_objects(recursive: false)
-			version_map = '@0@/@1@/rte_@2@_version.map'.format(
-					meson.current_source_dir(), dir_name, name)
 			implib = dir_name + '.dll.a'
 
 			def_file = custom_target(name + '_def',
diff --git a/meson_options.txt b/meson_options.txt
index 448f3e63dc..000e38fd98 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -28,8 +28,6 @@  option('max_lcores', type: 'integer', value: 128,
 	description: 'maximum number of cores/threads supported by EAL')
 option('max_numa_nodes', type: 'integer', value: 4,
 	description: 'maximum number of NUMA nodes supported by EAL')
-option('per_library_versions', type: 'boolean', value: true,
-	description: 'true: each lib gets its own version number, false: DPDK version used for each lib')
 option('tests', type: 'boolean', value: true,
 	description: 'build unit tests')
 option('use_hpet', type: 'boolean', value: false,
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 4df8849a08..f84161c6d5 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -11,20 +11,23 @@  EXTLIB_BUILD ?= n
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
 
-ifneq ($(CONFIG_RTE_MAJOR_ABI),)
-ifneq ($(LIBABIVER),)
-LIBABIVER := $(CONFIG_RTE_MAJOR_ABI)
+ifeq ($(OS), Windows_NT)
+search_cmd = findstr
+print_cmd = more
+else
+search_cmd = grep
+print_cmd = cat
 endif
+
+ifneq ($(shell $(search_cmd) "^DPDK_" $(SRCDIR)/$(EXPORT_MAP)),)
+LIBABIVER := $(shell $(print_cmd) $(RTE_SRCDIR)/config/ABI_VERSION)
+else
+LIBABIVER := 0
 endif
 
 ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 ifeq ($(EXTLIB_BUILD),n)
-ifeq ($(CONFIG_RTE_MAJOR_ABI),)
-ifeq ($(CONFIG_RTE_NEXT_ABI),y)
-LIB := $(LIB).1
-endif
-endif
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 endif
 endif