mbox series

[0/2] Improve function versioning meson support

Message ID 20190927194932.22197-1-bruce.richardson@intel.com (mailing list archive)
Headers
Series Improve function versioning meson support |

Message

Bruce Richardson Sept. 27, 2019, 7:49 p.m. UTC
  Adding support for LTO has exposed some issues with how the functions
versioning was supported by meson, which was always set to build both
shared and static libraries.

For plain C code, so long as the -fPIC compiler flag was passed, the
output is identical whether or not the code is to be included in a
static library or a dynamic one. Unfortunately, when using function
versioning that no longer held as different macros were used for the
versioned functions depending on which type of build it was. This means
that any files that use versioning need to be built twice, with
different defines in each case.

While the trivial solution here is just to rebuild everything twice,
that involves a lot of unnecessary work when building DPDK. A better
option is to identify those files or components which need multiple
builds and rebuild only those. To do this, we add a new meson.build
setting for libraries "use_function_versioning" and when that is set, we
rebuild all source files twice, initially for static library and then
with -DRTE_BUILD_SHARED_LIB for the shared library.

If the flag is not set, then the static versioning setting only is used,
which could lead to the build succeeding but later causing problems. To
avoid that, we add a new define which must be set when the versioning
header is included. This addition while solving 1 problem raises 2
other, more minor problems:
* what to do with make builds? since make only builds one library type,
  we can just always define the new value.
* what about files that include rte_compat.h for the macro for
  "experimental"? To solve this, we can split compat.h in two, since the
  versioning macro should be internal only to DPDK (as no public header
  should expose anything but the latest APIs), while the experimental
  macros are primarily for public use.

Bruce Richardson (2):
  eal: split compat header file
  build: support building ABI versioned files twice

 config/common_base                            |  1 +
 config/rte_config.h                           |  3 ---
 doc/api/doxy-api-index.md                     |  3 ++-
 doc/guides/contributing/coding_style.rst      |  7 ++++++
 doc/guides/contributing/versioning.rst        |  4 ++--
 lib/librte_distributor/meson.build            |  1 +
 lib/librte_distributor/rte_distributor.c      |  2 +-
 lib/librte_distributor/rte_distributor_v20.c  |  2 +-
 lib/librte_eal/common/Makefile                |  1 +
 ...rte_compat.h => rte_function_versioning.h} | 23 ++++++-------------
 lib/librte_lpm/meson.build                    |  1 +
 lib/librte_lpm/rte_lpm.c                      |  1 +
 lib/librte_lpm/rte_lpm.h                      |  1 -
 lib/librte_lpm/rte_lpm6.c                     |  1 +
 lib/librte_timer/meson.build                  |  1 +
 lib/librte_timer/rte_timer.c                  |  2 +-
 lib/meson.build                               | 16 ++++++++++---
 17 files changed, 41 insertions(+), 29 deletions(-)
 rename lib/librte_eal/common/include/{rte_compat.h => rte_function_versioning.h} (89%)
  

Comments

Stephen Hemminger Oct. 9, 2019, 10:59 p.m. UTC | #1
On Fri, 27 Sep 2019 20:49:30 +0100
Bruce Richardson <bruce.richardson@intel.com> wrote:

> Adding support for LTO has exposed some issues with how the functions
> versioning was supported by meson, which was always set to build both
> shared and static libraries.
> 
> For plain C code, so long as the -fPIC compiler flag was passed, the
> output is identical whether or not the code is to be included in a
> static library or a dynamic one. Unfortunately, when using function
> versioning that no longer held as different macros were used for the
> versioned functions depending on which type of build it was. This means
> that any files that use versioning need to be built twice, with
> different defines in each case.
> 
> While the trivial solution here is just to rebuild everything twice,
> that involves a lot of unnecessary work when building DPDK. A better
> option is to identify those files or components which need multiple
> builds and rebuild only those. To do this, we add a new meson.build
> setting for libraries "use_function_versioning" and when that is set, we
> rebuild all source files twice, initially for static library and then
> with -DRTE_BUILD_SHARED_LIB for the shared library.
> 
> If the flag is not set, then the static versioning setting only is used,
> which could lead to the build succeeding but later causing problems. To
> avoid that, we add a new define which must be set when the versioning
> header is included. This addition while solving 1 problem raises 2
> other, more minor problems:
> * what to do with make builds? since make only builds one library type,
>   we can just always define the new value.
> * what about files that include rte_compat.h for the macro for
>   "experimental"? To solve this, we can split compat.h in two, since the
>   versioning macro should be internal only to DPDK (as no public header
>   should expose anything but the latest APIs), while the experimental
>   macros are primarily for public use.
> 
> Bruce Richardson (2):
>   eal: split compat header file
>   build: support building ABI versioned files twice
> 
>  config/common_base                            |  1 +
>  config/rte_config.h                           |  3 ---
>  doc/api/doxy-api-index.md                     |  3 ++-
>  doc/guides/contributing/coding_style.rst      |  7 ++++++
>  doc/guides/contributing/versioning.rst        |  4 ++--
>  lib/librte_distributor/meson.build            |  1 +
>  lib/librte_distributor/rte_distributor.c      |  2 +-
>  lib/librte_distributor/rte_distributor_v20.c  |  2 +-
>  lib/librte_eal/common/Makefile                |  1 +
>  ...rte_compat.h => rte_function_versioning.h} | 23 ++++++-------------
>  lib/librte_lpm/meson.build                    |  1 +
>  lib/librte_lpm/rte_lpm.c                      |  1 +
>  lib/librte_lpm/rte_lpm.h                      |  1 -
>  lib/librte_lpm/rte_lpm6.c                     |  1 +
>  lib/librte_timer/meson.build                  |  1 +
>  lib/librte_timer/rte_timer.c                  |  2 +-
>  lib/meson.build                               | 16 ++++++++++---
>  17 files changed, 41 insertions(+), 29 deletions(-)
>  rename lib/librte_eal/common/include/{rte_compat.h => rte_function_versioning.h} (89%)
> 

Looks fine.
Acked-by: Stephen Hemminger <stephen@networkplumber.org>