[dpdk-dev] [PATCH v2] net/mlx: add meson build support

Bruce Richardson bruce.richardson at intel.com
Tue Aug 28 17:45:00 CEST 2018


Thanks for this, comments inline below.

/Bruce

On Mon, Aug 27, 2018 at 02:42:25PM +0200, Nelio Laranjeiro wrote:
> Mellanox drivers remains un-compiled by default due to third party
> libraries dependencies.  They can be enabled through:
> - enable_driver_mlx{4,5}=true or
> - enable_driver_mlx{4,5}_glue=true
> depending on the needs.

The big reason why we wanted a new build system was to move away from this
sort of static configuration. Instead, detect if the requirements as
present and build the driver if you can.

> 
> To avoid modifying the whole sources and keep the compatibility with
> current build systems (e.g. make), the mlx{4,5}_autoconf.h is still
> generated by invoking DPDK scripts though meson's run_command() instead
> of using has_types, has_members, ... commands.
> 
> Meson will try to find the required external libraries.  When they are
> not installed system wide, they can be provided though CFLAGS, LDFLAGS
> and LD_LIBRARY_PATH environment variables, example (considering
> RDMA-Core is installed in /tmp/rdma-core):
> 
>  # CLFAGS=-I/tmp/rdma-core/build/include \
>    LDFLAGS=-L/tmp/rdma-core/build/lib \
>    LD_LIBRARY_PATH=/tmp/rdma-core/build/lib \
>    meson -Denable_driver_mlx4=true output
> 
>  # CLFAGS=-I/tmp/rdma-core/build/include \
>    LDFLAGS=-L/tmp/rdma-core/build/lib \
>    LD_LIBRARY_PATH=/tmp/rdma-core/build/lib \
>    ninja -C output install

Once the CFLAGS/LDFLAGS are passed to meson, they should not be needed for
ninja. The LD_LIBRARY_PATH might be - I'm not sure about that one! :-)

> 
> Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro at 6wind.com>
> 
> ---
> 
> Changes in v2:
> 
> - dropped patch https://patches.dpdk.org/patch/43897/
> - remove extra_{cflags,ldflags} as already honored by meson through
> environment variables.
> ---
>  drivers/net/meson.build      |   2 +
>  drivers/net/mlx4/meson.build |  94 ++++++
>  drivers/net/mlx5/meson.build | 545 +++++++++++++++++++++++++++++++++++
>  meson_options.txt            |   8 +
>  4 files changed, 649 insertions(+)
>  create mode 100644 drivers/net/mlx4/meson.build
>  create mode 100644 drivers/net/mlx5/meson.build
> 
> diff --git a/drivers/net/meson.build b/drivers/net/meson.build
> index 9c28ed4da..c7a2d0e7d 100644
> --- a/drivers/net/meson.build
> +++ b/drivers/net/meson.build
> @@ -18,6 +18,8 @@ drivers = ['af_packet',
>  	'ixgbe',
>  	'kni',
>  	'liquidio',
> +	'mlx4',
> +	'mlx5',
>  	'mvpp2',
>  	'netvsc',
>  	'nfp',
> diff --git a/drivers/net/mlx4/meson.build b/drivers/net/mlx4/meson.build
> new file mode 100644
> index 000000000..debaca5b6
> --- /dev/null
> +++ b/drivers/net/mlx4/meson.build
> @@ -0,0 +1,94 @@
> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright 2018 6WIND S.A.
> +# Copyright 2018 Mellanox Technologies, Ltd
> +
> +# As there is no more configuration file to activate/configure the PMD it will
> +# use some variables here to configure it.
> +pmd_dlopen = get_option('enable_driver_mlx4_glue')
> +build = get_option('enable_driver_mlx4') or pmd_dlopen

As stated above, I believe this should be based upon whether you find the
"mnl", "mlx4" and "ibverbs" libraries. If we start adding back in static
options for every driver, then we'll be back to having a mass of config
options like we had before.

> +# dpdk_conf.set('RTE_LIBRTE_MLX4_DEBUG', 1)
> +# Glue configuratin
> +LIB_GLUE_BASE = 'librte_pmd_mlx4_glue.so'
> +LIB_GLUE_VERSION = '18.02.0'
> +LIB_GLUE = LIB_GLUE_BASE + '.' + LIB_GLUE_VERSION
> +if pmd_dlopen
> +        dpdk_conf.set('RTE_LIBRTE_MLX4_DLOPEN_DEPS', 1)
> +        cflags += [
> +                '-DMLX4_GLUE="@0@"'.format(LIB_GLUE),
> +                '-DMLX4_GLUE_VERSION="@0@"'.format(LIB_GLUE_VERSION),
> +                '-ldl',
> +        ]

Is the '-ldl' flag necessary, given that for Linux it is added as a
standard linker flag in config/meson.build? If it is needed, does it get
passed through to the pkgconfig file etc. appropriately.

> +endif
> +# Compile PMD
> +if build

If you make the build value depend on the results of the find_library
calls, you can remove this conditional and de-dent the rest of the code,
since the assigned values will be ignored at the higher level.

> +        allow_experimental_apis = true
> +        ext_deps += [
> +                cc.find_library('mnl'),
> +                cc.find_library('mlx4'),
> +                cc.find_library('ibverbs'),
> +        ]
> +        sources = files(
> +               'mlx4.c',
> +               'mlx4_ethdev.c',
> +               'mlx4_flow.c',
> +               'mlx4_intr.c',
> +               'mlx4_mr.c',
> +               'mlx4_rxq.c',
> +               'mlx4_rxtx.c',
> +               'mlx4_txq.c',
> +               'mlx4_utils.c',
> +        )
> +        if not pmd_dlopen
> +                sources += files('mlx4_glue.c')
> +        endif
> +        cflags += [
> +               '-O3',
> +               '-Wall',
> +               '-Wextra',
> +               '-g',

Please don't add these flags into your driver build. The optimization and
debug flags are controlled instead at the project level via the meson
build-in "buildtype" option.

> +               '-std=c11',
> +               '-I.',

Unnecessary, the current build directory is always present in the include
path.

> +               '-D_BSD_SOURCE',
> +               '-D_DEFAULT_SOURCE',
> +               '-D_XOPEN_SOURCE=600',
> +               '-Wno-strict-prototypes',
> +        ]

For safety, it's advisable to have compiler flags checked via
cc.has_option() before adding them to cflags. [The -D options shouldn't
need checking though]

> +        if dpdk_conf.has('RTE_LIBRTE_MLX4_DEBUG')
> +                cflags += [ '-pedantic', '-UNDEBUG', '-DPEDANTIC' ]
> +        else
> +                cflags += [ '-DNDEBUG', '-UPEDANTIC' ]
> +        endif

Rather than having your own separate debug option flag, why not set these
based on the "buildtype" option e.g. if buildtype is set to "debug".

> +        # To maintain the compatibility with the make build system
> +        # mlx4_autoconf.h file is still generated.
> +        r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                        'mlx4_autoconf.h',
> +                        'HAVE_IBV_MLX4_WQE_LSO_SEG',
> +                        'infiniband/mlx4dv.h',
> +                        'type', 'struct mlx4_wqe_lso_seg')
> +        if r.returncode() != 0
> +                error('autoconfiguration fail')
> +        endif

Just to check that you are ok with this only being run at configure time?
If any changes are made to the inputs, ninja won't pick them up. To have it
tracked for input changes, "custom_target" should be used instead of
run_command.

> +endif
> +# Build Glue Library
> +if pmd_dlopen
> +        dlopen_name = 'mlx4_glue'
> +        dlopen_lib_name = driver_name_fmt.format(dlopen_name)
> +        dlopen_so_version = LIB_GLUE_VERSION
> +        dlopen_sources = files('mlx4_glue.c')
> +        dlopen_install_dir = [ eal_pmd_path + '-glue' ]
> +        shared_lib = shared_library(
> +               dlopen_lib_name,
> +               dlopen_sources,
> +               include_directories: global_inc,
> +               c_args: cflags,
> +               link_args: [
> +                       '-Wl,-export-dynamic',
> +                       '-Wl,-h, at 0@'.format(LIB_GLUE),
> +                       '-lmlx4',
> +                       '-libverbs',

While this works, the recommended approach is to save the return value from
cc.find_library() above, and pass that as a dependency directly, rather
than as a linker flag.

> +                       ],
> +               soversion: dlopen_so_version,
> +               install: true,
> +               install_dir: dlopen_install_dir,
> +        )
> +endif

> diff --git a/drivers/net/mlx5/meson.build b/drivers/net/mlx5/meson.build
> new file mode 100644
> index 000000000..b918ca437
> --- /dev/null
> +++ b/drivers/net/mlx5/meson.build

I believe most of the comments above for the mlx4 driver would apply below
also. I'll just note any additional things I spot.

> @@ -0,0 +1,545 @@
> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright 2018 6WIND S.A.
> +# Copyright 2018 Mellanox Technologies, Ltd
> +
> +# As there is no more configuration file to activate/configure the PMD it will
> +# use some variables here to configure it.
> +pmd_dlopen = get_option('enable_driver_mlx5_glue')
> +build = get_option('enable_driver_mlx5') or pmd_dlopen
> +# dpdk_conf.set('RTE_LIBRTE_MLX5_DEBUG', 1)
> +# Glue configuratin
> +LIB_GLUE_BASE = 'librte_pmd_mlx5_glue.so'
> +LIB_GLUE_VERSION = '18.05.0'
> +LIB_GLUE = LIB_GLUE_BASE + '.' + LIB_GLUE_VERSION
> +if pmd_dlopen
> +        dpdk_conf.set('RTE_LIBRTE_MLX5_DLOPEN_DEPS', 1)
> +        cflags += [
> +                '-DMLX5_GLUE="@0@"'.format(LIB_GLUE),
> +                '-DMLX5_GLUE_VERSION="@0@"'.format(LIB_GLUE_VERSION),
> +                '-ldl',
> +        ]
> +endif
> +# Compile PMD
> +if build
> +        allow_experimental_apis = true
> +        ext_deps += [
> +                cc.find_library('mnl'),
> +                cc.find_library('mlx5'),
> +                cc.find_library('ibverbs'),
> +        ]
> +        sources = files(
> +                'mlx5.c',
> +                'mlx5_ethdev.c',
> +                'mlx5_flow.c',
> +                'mlx5_mac.c',
> +                'mlx5_mr.c',
> +                'mlx5_nl.c',
> +                'mlx5_nl_flow.c',
> +                'mlx5_rss.c',
> +                'mlx5_rxmode.c',
> +                'mlx5_rxq.c',
> +                'mlx5_rxtx.c',
> +                'mlx5_socket.c',
> +                'mlx5_stats.c',
> +                'mlx5_trigger.c',
> +                'mlx5_txq.c',
> +                'mlx5_vlan.c',
> +        )
> +        if dpdk_conf.has('RTE_ARCH_X86_64') or dpdk_conf.has('RTE_ARCH_ARM64')
> +                sources += files('mlx5_rxtx_vec.c')
> +        endif
> +        if not pmd_dlopen
> +                sources += files('mlx5_glue.c')
> +        endif
> +        cflags += [
> +               '-O3',
> +               '-Wall',
> +               '-Wextra',
> +               '-g',
> +               '-std=c11',
> +               '-I.',
> +               '-D_BSD_SOURCE',
> +               '-D_DEFAULT_SOURCE',
> +               '-D_XOPEN_SOURCE=600',
> +               '-Wno-strict-prototypes',
> +       ]
> +       if dpdk_conf.has('RTE_LIBRTE_MLX5_DEBUG')
> +               cflags += [ '-pedantic', '-UNDEBUG', '-DPEDANTIC' ]
> +       else
> +               cflags += [ '-DNDEBUG', '-UPEDANTIC' ]
> +       endif
> +       # To maintain the compatibility with the make build system
> +       # mlx5_autoconf.h file is still generated.
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_IBV_DEVICE_STRIDING_RQ_SUPPORT',
> +                       'infiniband/mlx5dv.h',
> +                       'enum', 'MLX5DV_CQE_RES_FORMAT_CSUM_STRIDX')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_IBV_DEVICE_TUNNEL_SUPPORT',
> +                       'infiniband/mlx5dv.h',
> +                       'enum', 'MLX5DV_CONTEXT_MASK_TUNNEL_OFFLOADS')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_IBV_DEVICE_MPLS_SUPPORT',
> +                       'infiniband/verbs.h',
> +                       'enum', 'IBV_FLOW_SPEC_MPLS')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_IBV_WQ_FLAG_RX_END_PADDING',
> +                       'infiniband/verbs.h',
> +                       'enum', 'IBV_WQ_FLAG_RX_END_PADDING')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_IBV_MLX5_MOD_SWP',
> +                       'infiniband/mlx5dv.h',
> +                       'type', 'struct mlx5dv_sw_parsing_caps')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_IBV_MLX5_MOD_MPW',
> +                       'infiniband/mlx5dv.h',
> +                       'enum', 'MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_IBV_MLX5_MOD_CQE_128B_COMP',
> +                       'infiniband/mlx5dv.h',
> +                       'enum', 'MLX5DV_CONTEXT_FLAGS_CQE_128B_COMP')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_ETHTOOL_LINK_MODE_25G',
> +                       '/usr/include/linux/ethtool.h',
> +                       'enum', 'ETHTOOL_LINK_MODE_25000baseCR_Full_BIT')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_ETHTOOL_LINK_MODE_50G',
> +                       '/usr/include/linux/ethtool.h',
> +                       'enum', 'ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_ETHTOOL_LINK_MODE_100G',
> +                       '/usr/include/linux/ethtool.h',
> +                       'enum', 'ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT',
> +                       'infiniband/verbs.h',
> +                       'type', 'struct ibv_counter_set_init_attr')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_RDMA_NL_NLDEV',
> +                       'rdma/rdma_netlink.h',
> +                       'enum', 'RDMA_NL_NLDEV')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_RDMA_NLDEV_CMD_GET',
> +                       'rdma/rdma_netlink.h',
> +                       'enum', 'RDMA_NLDEV_CMD_GET')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_RDMA_NLDEV_CMD_PORT_GET',
> +                       'rdma/rdma_netlink.h',
> +                       'enum', 'RDMA_NLDEV_CMD_PORT_GET')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_RDMA_NLDEV_ATTR_DEV_INDEX',
> +                       'rdma/rdma_netlink.h',
> +                       'enum', 'RDMA_NLDEV_ATTR_DEV_INDEX')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_RDMA_NLDEV_ATTR_DEV_NAME',
> +                       'rdma/rdma_netlink.h',
> +                       'enum', 'RDMA_NLDEV_ATTR_DEV_NAME')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_RDMA_NLDEV_ATTR_PORT_INDEX',
> +                       'rdma/rdma_netlink.h',
> +                       'enum', 'RDMA_NLDEV_ATTR_PORT_INDEX')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_RDMA_NLDEV_ATTR_NDEV_INDEX',
> +                       'rdma/rdma_netlink.h',
> +                       'enum', 'RDMA_NLDEV_ATTR_NDEV_INDEX')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_IFLA_PHYS_SWITCH_ID',
> +                       'linux/if_link.h',
> +                       'enum', 'IFLA_PHYS_SWITCH_ID')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_IFLA_PHYS_PORT_NAME',
> +                       'linux/if_link.h',
> +                       'enum', 'IFLA_PHYS_PORT_NAME')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_ACT',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_ACT')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_FLAGS',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_FLAGS')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_ETH_TYPE',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_ETH_TYPE')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_ETH_DST',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_ETH_DST')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_ETH_DST_MASK',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_ETH_DST_MASK')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_ETH_SRC',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_ETH_SRC')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_ETH_SRC_MASK',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_ETH_SRC_MASK')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_IP_PROTO',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_IP_PROTO')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_IPV4_SRC',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_IPV4_SRC')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_IPV4_SRC_MASK',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_IPV4_SRC_MASK')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_IPV4_DST',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_IPV4_DST')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_IPV4_DST_MASK',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_IPV4_DST_MASK')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_IPV6_SRC',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_IPV6_SRC')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_IPV6_SRC_MASK',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_IPV6_SRC_MASK')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_IPV6_DST',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_IPV6_DST')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_IPV6_DST_MASK',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_IPV6_DST_MASK')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_TCP_SRC',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_TCP_SRC')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_TCP_SRC_MASK',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_TCP_SRC_MASK')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_TCP_DST',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_TCP_DST')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_TCP_DST_MASK',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_TCP_DST_MASK')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_UDP_SRC',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_UDP_SRC')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_UDP_SRC_MASK',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_UDP_SRC_MASK')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_UDP_DST',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_UDP_DST')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_UDP_DST_MASK',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_UDP_DST_MASK')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_VLAN_ID',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_VLAN_ID')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_VLAN_PRIO',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_VLAN_PRIO')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TCA_FLOWER_KEY_VLAN_ETH_TYPE',
> +                       'linux/pkt_cls.h',
> +                       'enum', 'TCA_FLOWER_KEY_VLAN_ETH_TYPE')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_TC_ACT_VLAN',
> +                       'linux/tc_act/tc_vlan.h',
> +                       'enum', 'TCA_VLAN_PUSH_VLAN_PRIORITY')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_SUPPORTED_40000baseKR4_Full',
> +                       '/usr/include/linux/ethtool.h',
> +                       'define', 'SUPPORTED_40000baseKR4_Full')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_SUPPORTED_40000baseCR4_Full',
> +                       '/usr/include/linux/ethtool.h',
> +                       'define', 'SUPPORTED_40000baseCR4_Full')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_SUPPORTED_40000baseSR4_Full',
> +                       '/usr/include/linux/ethtool.h',
> +                       'define', 'SUPPORTED_40000baseSR4_Full')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_SUPPORTED_40000baseLR4_Full',
> +                       '/usr/include/linux/ethtool.h',
> +                       'define', 'SUPPORTED_40000baseLR4_Full')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_SUPPORTED_56000baseKR4_Full',
> +                       '/usr/include/linux/ethtool.h',
> +                       'define', 'SUPPORTED_56000baseKR4_Full')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_SUPPORTED_56000baseCR4_Full',
> +                       '/usr/include/linux/ethtool.h',
> +                       'define', 'SUPPORTED_56000baseCR4_Full')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_SUPPORTED_56000baseSR4_Full',
> +                       '/usr/include/linux/ethtool.h',
> +                       'define', 'SUPPORTED_56000baseSR4_Full')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif
> +       r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                       'mlx5_autoconf.h',
> +                       'HAVE_SUPPORTED_56000baseLR4_Full',
> +                       '/usr/include/linux/ethtool.h',
> +                       'define', 'SUPPORTED_56000baseLR4_Full')
> +       if r.returncode() != 0
> +               error('autoconfiguration fail')
> +       endif

That's a huge number of run_commands, have you investigated putting it into
a foreach loop (or loops) and having it based off arrays as input?
Alternatively, it could all be put into a single script, if you didn't want
to clutter up the build file.

> +endif
> +# Build Glue Library
> +if pmd_dlopen
> +        dlopen_name = 'mlx5_glue'
> +        dlopen_lib_name = driver_name_fmt.format(dlopen_name)
> +        dlopen_so_version = LIB_GLUE_VERSION
> +        dlopen_sources = files('mlx5_glue.c')
> +        dlopen_install_dir = [ eal_pmd_path + '-glue' ]
> +        shared_lib = shared_library(
> +                dlopen_lib_name,
> +                dlopen_sources,
> +                include_directories: global_inc,
> +                c_args: cflags,
> +                link_args: [
> +                        '-Wl,-export-dynamic',
> +                        '-Wl,-h, at 0@'.format(LIB_GLUE),
> +                        '-lmlx5',
> +                        '-libverbs',
> +                        ],
> +                soversion: dlopen_so_version,
> +                install: true,
> +                install_dir: dlopen_install_dir,
> +        )
> +endif
> diff --git a/meson_options.txt b/meson_options.txt
> index c84327858..a1ae0cabc 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -22,3 +22,11 @@ option('use_hpet', type: 'boolean', value: false,
>  	description: 'use HPET timer in EAL')
>  option('tests', type: 'boolean', value: true,
>  	description: 'build unit tests')
> +option('enable_driver_mlx5', type: 'boolean', value: false,
> +	description: 'Enable Mellanox PMD for ConnectX-4/5 NIC')
> +option('enable_driver_mlx5_glue', type: 'boolean', value: false,
> +	description: 'Enable Mellanox PMD for ConnectX-4/5 NIC glue library')
> +option('enable_driver_mlx4', type: 'boolean', value: false,
> +	description: 'Enable Mellanox PMD for ConnectX-3 NIC')
> +option('enable_driver_mlx4_glue', type: 'boolean', value: false,
> +	description: 'Enable Mellanox PMD for ConnectX-3 NIC glue library')

As well as dropping the two build options, I'd also suggest merging the
glue library options into 1, on the assumption that users either want glue
libs or don't. 
Also, the options should be kept in alphabetical order.



More information about the dev mailing list