From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 5D8E02C72 for ; Tue, 28 Aug 2018 17:45:27 +0200 (CEST) X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Aug 2018 08:45:26 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,299,1531810800"; d="scan'208";a="258747654" Received: from bricha3-mobl.ger.corp.intel.com ([10.237.221.107]) by fmsmga006.fm.intel.com with SMTP; 28 Aug 2018 08:45:04 -0700 Received: by (sSMTP sendmail emulation); Tue, 28 Aug 2018 16:45:01 +0100 Date: Tue, 28 Aug 2018 16:45:00 +0100 From: Bruce Richardson To: Nelio Laranjeiro Cc: dev@dpdk.org, Yongseok Koh , Shahaf Shuler , Matan Azrad Message-ID: <20180828154500.GA4208@bricha3-MOBL.ger.corp.intel.com> References: <7812af2267017898332783e934bef9478814ae96.1535361299.git.nelio.laranjeiro@6wind.com> <85a2b398fecdf917dc22810ea0974a91ccca1d13.1535373640.git.nelio.laranjeiro@6wind.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <85a2b398fecdf917dc22810ea0974a91ccca1d13.1535373640.git.nelio.laranjeiro@6wind.com> Organization: Intel Research and Development Ireland Ltd. User-Agent: Mutt/1.10.1 (2018-07-13) Subject: Re: [dpdk-dev] [PATCH v2] net/mlx: add meson build support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 28 Aug 2018 15:45:28 -0000 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 > > --- > > 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.