[v2] net/mlx: add meson build support

Message ID 85a2b398fecdf917dc22810ea0974a91ccca1d13.1535373640.git.nelio.laranjeiro@6wind.com (mailing list archive)
State Superseded, archived
Delegated to: Shahaf Shuler
Headers
Series [v2] net/mlx: add meson build support |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Nélio Laranjeiro Aug. 27, 2018, 12:42 p.m. UTC
  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.

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

Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@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
  

Comments

Bruce Richardson Aug. 28, 2018, 3:45 p.m. UTC | #1
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@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,@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,@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.
  
Nélio Laranjeiro Aug. 29, 2018, 9:34 a.m. UTC | #2
Hi Bruce,

Thanks for your comments I have address almost all of them in the v3 by
doing what you suggest, I still have some comments, please see below,

On Tue, Aug 28, 2018 at 04:45:00PM +0100, Bruce Richardson wrote:
> 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.

Ok, I am letting only the glue option for both drivers as suggested at
the end of your answer.

> > 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! :-)

CFLAGS/LDFLAGS are correctly evaluated and inserted in the build.ninja
file, for the LD_LIBRARY_PATH, it is necessary for the run_command stuff
generating the mlx*_autoconf.h

>[...] 
> 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.

It seems to not be possible to have several custom_target on the same
output file has this last is used as the target identifier in ninja.

This limitation is acceptable for now, when meson will be the default
build system, then such autoconf can be removed to use meson built-in
functions.

> > +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,@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.

I tried it, but:

 drivers/net/mlx5/meson.build:216:8: ERROR:  Link_args arguments must be
 strings.

find_library returns a compiler object, I did not found anyway to use
directly the output of the find_library which works in places.

Thanks,
  
Luca Boccassi Aug. 29, 2018, 10 a.m. UTC | #3
On Tue, 2018-08-28 at 16:45 +0100, Bruce Richardson wrote:
> 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@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.

BTW, slightly related to that: ibverbs doesn't ship pkg-config files at
the moment which makes the detection slightly more awkward that it
could be, so I've sent a PR upstream to add that:

https://github.com/linux-rdma/rdma-core/pull/373

Hope this can be useful!
  
Bruce Richardson Aug. 29, 2018, 10:01 a.m. UTC | #4
On Wed, Aug 29, 2018 at 11:34:10AM +0200, Nélio Laranjeiro wrote:
> Hi Bruce,
> 
> Thanks for your comments I have address almost all of them in the v3 by
> doing what you suggest, I still have some comments, please see below,
> 

Thanks.

> On Tue, Aug 28, 2018 at 04:45:00PM +0100, Bruce Richardson wrote:
> > 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.
> 
> Ok, I am letting only the glue option for both drivers as suggested at
> the end of your answer.
> 
> > > 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! :-)
> 
> CFLAGS/LDFLAGS are correctly evaluated and inserted in the build.ninja
> file, for the LD_LIBRARY_PATH, it is necessary for the run_command stuff
> generating the mlx*_autoconf.h
> 

Just realised there is another issue which you should address. The
mlx*_autoconf.h files are being written into a source folder rather than
into the destination folder. This could cause problems if we are enabling
mlx for cross-compile builds. Perhaps inside the auto-config-h.sh script
you can check for $MESON_BUILD_ROOT value, and use that (and possibly
$MESON_SUBDIR) to put the header file in the build directory.

> >[...] 
> > 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.
> 
> It seems to not be possible to have several custom_target on the same
> output file has this last is used as the target identifier in ninja.
> 
> This limitation is acceptable for now, when meson will be the default
> build system, then such autoconf can be removed to use meson built-in
> functions.
> 
> > > +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,@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.
> 
> I tried it, but:
> 
>  drivers/net/mlx5/meson.build:216:8: ERROR:  Link_args arguments must be
>  strings.
> 

It needs to be passed using "dependencies" rather than as a link_arg. [See
list of possible arguments to library and executable objects here:
http://mesonbuild.com/Reference-manual.html#executable]

/Bruce
  
Nélio Laranjeiro Aug. 29, 2018, 11:59 a.m. UTC | #5
On Wed, Aug 29, 2018 at 11:00:54AM +0100, Luca Boccassi wrote:
> On Tue, 2018-08-28 at 16:45 +0100, Bruce Richardson wrote:
> > 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@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.
> 
> BTW, slightly related to that: ibverbs doesn't ship pkg-config files at
> the moment which makes the detection slightly more awkward that it
> could be, so I've sent a PR upstream to add that:
> 
> https://github.com/linux-rdma/rdma-core/pull/373
> 
> Hope this can be useful!

Thanks Luca, I was also searching for it, you save me some time, I hope
this can be backported down to RDMA-Core's stable version v15 of
RDMA-Core it would fully help.
  
Luca Boccassi Aug. 29, 2018, 12:28 p.m. UTC | #6
On Wed, 2018-08-29 at 13:59 +0200, Nélio Laranjeiro wrote:
> On Wed, Aug 29, 2018 at 11:00:54AM +0100, Luca Boccassi wrote:
> > On Tue, 2018-08-28 at 16:45 +0100, Bruce Richardson wrote:
> > > 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@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.
> > 
> > BTW, slightly related to that: ibverbs doesn't ship pkg-config
> > files at
> > the moment which makes the detection slightly more awkward that it
> > could be, so I've sent a PR upstream to add that:
> > 
> > https://github.com/linux-rdma/rdma-core/pull/373
> > 
> > Hope this can be useful!
> 
> Thanks Luca, I was also searching for it, you save me some time, I
> hope
> this can be backported down to RDMA-Core's stable version v15 of
> RDMA-Core it would fully help.

With a quick glance at the v15 branch, the CMake files look similar
enough that it should be pretty straightforward to backport.
  
Nélio Laranjeiro Aug. 29, 2018, 12:44 p.m. UTC | #7
On Wed, Aug 29, 2018 at 11:01:15AM +0100, Bruce Richardson wrote:
> On Wed, Aug 29, 2018 at 11:34:10AM +0200, Nélio Laranjeiro wrote:
> > Hi Bruce,
> > 
> > Thanks for your comments I have address almost all of them in the v3 by
> > doing what you suggest, I still have some comments, please see below,
> > 
> 
> Thanks.
> 
> > On Tue, Aug 28, 2018 at 04:45:00PM +0100, Bruce Richardson wrote:
> > > 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.
> > 
> > Ok, I am letting only the glue option for both drivers as suggested at
> > the end of your answer.
> > 
> > > > 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! :-)
> > 
> > CFLAGS/LDFLAGS are correctly evaluated and inserted in the build.ninja
> > file, for the LD_LIBRARY_PATH, it is necessary for the run_command stuff
> > generating the mlx*_autoconf.h
> > 
> 
> Just realised there is another issue which you should address. The
> mlx*_autoconf.h files are being written into a source folder rather than
> into the destination folder. This could cause problems if we are enabling
> mlx for cross-compile builds. Perhaps inside the auto-config-h.sh script
> you can check for $MESON_BUILD_ROOT value, and use that (and possibly
> $MESON_SUBDIR) to put the header file in the build directory.

Indeed, I was searching also for a solution, I finally found it without
modifying the shell script by using meson.current_build_dir() which
contains the same path has $MESON_BUILD_ROOT/$MESON_SUBDIR.

> > >[...] 
> > > 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.
> > 
> > It seems to not be possible to have several custom_target on the same
> > output file has this last is used as the target identifier in ninja.
> > 
> > This limitation is acceptable for now, when meson will be the default
> > build system, then such autoconf can be removed to use meson built-in
> > functions.
> > 
> > > > +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,@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.
> > 
> > I tried it, but:
> > 
> >  drivers/net/mlx5/meson.build:216:8: ERROR:  Link_args arguments must be
> >  strings.
> > 
> 
> It needs to be passed using "dependencies" rather than as a link_arg. [See
> list of possible arguments to library and executable objects here:
> http://mesonbuild.com/Reference-manual.html#executable]

Thanks this works with the dependencies.
  
Luca Boccassi Aug. 31, 2018, 4:24 p.m. UTC | #8
On Wed, 2018-08-29 at 13:59 +0200, Nélio Laranjeiro wrote:
> On Wed, Aug 29, 2018 at 11:00:54AM +0100, Luca Boccassi wrote:
> > On Tue, 2018-08-28 at 16:45 +0100, Bruce Richardson wrote:
> > > 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@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.
> > 
> > BTW, slightly related to that: ibverbs doesn't ship pkg-config
> > files at
> > the moment which makes the detection slightly more awkward that it
> > could be, so I've sent a PR upstream to add that:
> > 
> > https://github.com/linux-rdma/rdma-core/pull/373
> > 
> > Hope this can be useful!
> 
> Thanks Luca, I was also searching for it, you save me some time, I
> hope
> this can be backported down to RDMA-Core's stable version v15 of
> RDMA-Core it would fully help.

This was merged now, so if you want it backported you can ask the
maintainers if it would be fine to do so.
  

Patch

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
+# 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',
+        ]
+endif
+# Compile PMD
+if build
+        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',
+               '-std=c11',
+               '-I.',
+               '-D_BSD_SOURCE',
+               '-D_DEFAULT_SOURCE',
+               '-D_XOPEN_SOURCE=600',
+               '-Wno-strict-prototypes',
+        ]
+        if dpdk_conf.has('RTE_LIBRTE_MLX4_DEBUG')
+                cflags += [ '-pedantic', '-UNDEBUG', '-DPEDANTIC' ]
+        else
+                cflags += [ '-DNDEBUG', '-UPEDANTIC' ]
+        endif
+        # 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
+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,@0@'.format(LIB_GLUE),
+                       '-lmlx4',
+                       '-libverbs',
+                       ],
+               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
@@ -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
+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,@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')