[v5] net/mlx: add meson build support

Message ID 20180905114746.117936-1-shahafs@mellanox.com (mailing list archive)
State Superseded, archived
Headers
Series [v5] net/mlx: add meson build support |

Checks

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

Commit Message

Shahaf Shuler Sept. 5, 2018, 11:47 a.m. UTC
  From: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>

Compile Mellanox drivers when their external dependencies are met.  A
glue version of the driver can still be requested by using the
-Denable_driver_mlx_glue=true

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.

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 output
 # LD_LIBRARY_PATH=/tmp/rdma-core/build/lib \
   ninja -C output install

Note: LD_LIBRARY_PATH before ninja is necessary when the meson
configuration has changed (e.g. meson configure has been called), in
such situation the LD_LIBRARY_PATH is necessary to invoke the
autoconfiguration script.

Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
Changes in v5:

- use meson tool to generate Mellanox config file instead of DPDK custom scripts.

Changes in v4:

- remove implicit -Wall flag (set by default by meson),
- add item information in the autoconfiguration failure error message,
- reword the help for the glue library option,

Changes in v3:

Sanitize the build files:
- remove enable_driver_mlx{4,5} options,
- test cflags capabilities before using them,
- remove old autoconfiguration file,
- use an array for autoconfiguration and put them in the build directory,
- use dependencies in shared_library for link arguments.

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 | 110 +++++++++++++++++++++
 drivers/net/mlx5/meson.build | 231 +++++++++++++++++++++++++++++++++++++++++++
 meson_options.txt            |   2 +
 4 files changed, 345 insertions(+)
 create mode 100644 drivers/net/mlx4/meson.build
 create mode 100644 drivers/net/mlx5/meson.build
  

Comments

Bruce Richardson Sept. 7, 2018, 10:34 a.m. UTC | #1
On Wed, Sep 05, 2018 at 02:47:46PM +0300, Shahaf Shuler wrote:
> From: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> 
> Compile Mellanox drivers when their external dependencies are met.  A
> glue version of the driver can still be requested by using the
> -Denable_driver_mlx_glue=true
> 
> 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.
> 
> 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 output
>  # LD_LIBRARY_PATH=/tmp/rdma-core/build/lib \
>    ninja -C output install
> 
> Note: LD_LIBRARY_PATH before ninja is necessary when the meson
> configuration has changed (e.g. meson configure has been called), in
> such situation the LD_LIBRARY_PATH is necessary to invoke the
> autoconfiguration script.
> 
> Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
> Changes in v5:
> 
> - use meson tool to generate Mellanox config file instead of DPDK custom scripts.
> 

<snip>

> +        # To maintain the compatibility with the make build system
> +        # mlx5_autoconf.h file is still generated.
> +        # input array for meson symbol search:
> +        # [ "MACRO to define if found", "header for the search",
> +        #   "type/enum/define", "symbol to search",
> +        #   "struct member to search (type only)]
> +        #
> +        args = [
> +                [ 'HAVE_IBV_DEVICE_STRIDING_RQ_SUPPORT', 'infiniband/mlx5dv.h',
> +                  'enum', 'MLX5DV_CQE_RES_FORMAT_CSUM_STRIDX' ],
> +                [ 'HAVE_IBV_DEVICE_TUNNEL_SUPPORT', 'infiniband/mlx5dv.h',
> +                  'enum', 'MLX5DV_CONTEXT_MASK_TUNNEL_OFFLOADS' ],
> +                [ 'HAVE_IBV_MLX5_MOD_MPW', 'infiniband/mlx5dv.h',
> +                  'enum', 'MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED' ],
> +                [ 'HAVE_IBV_MLX5_MOD_SWP', 'infiniband/mlx5dv.h',
> +                  'type', 'struct mlx5dv_sw_parsing_caps',
> +                  'sw_parsing_offloads' ],
> +                [ 'HAVE_IBV_MLX5_MOD_CQE_128B_COMP', 'infiniband/mlx5dv.h',
> +                  'enum', 'MLX5DV_CONTEXT_FLAGS_CQE_128B_COMP' ],
> +                [ 'HAVE_IBV_DEVICE_MPLS_SUPPORT', 'infiniband/verbs.h',
> +                  'enum', 'IBV_FLOW_SPEC_MPLS' ],
> +                [ 'HAVE_IBV_WQ_FLAG_RX_END_PADDING', 'infiniband/verbs.h',
> +                  'enum', 'IBV_WQ_FLAG_RX_END_PADDING' ],
> +                [ 'HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT', 'infiniband/verbs.h',
> +                  'type', 'struct ibv_counter_set_init_attr',
> +                  'counter_set_id' ],
> +                [ 'HAVE_SUPPORTED_40000baseKR4_Full', 'linux/ethtool.h',
> +                  'define', 'SUPPORTED_40000baseKR4_Full' ],
> +                [ 'HAVE_SUPPORTED_40000baseCR4_Full', 'linux/ethtool.h',
> +                  'define', 'SUPPORTED_40000baseCR4_Full' ],
> +                [ 'HAVE_SUPPORTED_40000baseSR4_Full', 'linux/ethtool.h',
> +                  'define', 'SUPPORTED_40000baseSR4_Full' ],
> +                [ 'HAVE_SUPPORTED_40000baseLR4_Full', 'linux/ethtool.h',
> +                  'define', 'SUPPORTED_40000baseLR4_Full' ],
> +                [ 'HAVE_SUPPORTED_56000baseKR4_Full', 'linux/ethtool.h',
> +                  'define', 'SUPPORTED_56000baseKR4_Full' ],
> +                [ 'HAVE_SUPPORTED_56000baseCR4_Full', 'linux/ethtool.h',
> +                  'define', 'SUPPORTED_56000baseCR4_Full' ],
> +                [ 'HAVE_SUPPORTED_56000baseSR4_Full', 'linux/ethtool.h',
> +                  'define', 'SUPPORTED_56000baseSR4_Full' ],
> +                [ 'HAVE_SUPPORTED_56000baseLR4_Full', 'linux/ethtool.h',
> +                  'define', 'SUPPORTED_56000baseLR4_Full' ],
> +                [ 'HAVE_ETHTOOL_LINK_MODE_25G', 'linux/ethtool.h',
> +                  'enum', 'ETHTOOL_LINK_MODE_25000baseCR_Full_BIT' ],
> +                [ 'HAVE_ETHTOOL_LINK_MODE_50G', 'linux/ethtool.h',
> +                  'enum', 'ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT' ],
> +                [ 'HAVE_ETHTOOL_LINK_MODE_100G', 'linux/ethtool.h',
> +                  'enum', 'ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT' ],
> +                [ 'HAVE_IFLA_PHYS_SWITCH_ID', 'linux/if_link.h',
> +                  'enum', 'IFLA_PHYS_SWITCH_ID' ],
> +                [ 'HAVE_IFLA_PHYS_PORT_NAME', 'linux/if_link.h',
> +                  'enum', 'IFLA_PHYS_PORT_NAME' ],
> +                [ 'HAVE_TCA_FLOWER_ACT', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_ACT' ],
> +                [ 'HAVE_TCA_FLOWER_FLAGS', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_FLAGS' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_ETH_TYPE', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_ETH_TYPE' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_ETH_DST', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_ETH_DST' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_ETH_DST_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_ETH_DST_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_ETH_SRC', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_ETH_SRC' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_ETH_SRC_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_ETH_SRC_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IP_PROTO', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IP_PROTO' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_SRC', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV4_SRC' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_SRC_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV4_SRC_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_DST', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV4_DST' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_DST_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV4_DST_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_SRC', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV6_SRC' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_SRC_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV6_SRC_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_DST', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV6_DST' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_DST_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV6_DST_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_TCP_SRC', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_TCP_SRC' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_TCP_SRC_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_TCP_SRC_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_TCP_DST', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_TCP_DST' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_TCP_DST_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_TCP_DST_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_UDP_SRC', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_UDP_SRC' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_UDP_SRC_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_UDP_SRC_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_UDP_DST', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_UDP_DST' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_UDP_DST_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_UDP_DST_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_VLAN_ID', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_VLAN_ID' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_VLAN_PRIO', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_VLAN_PRIO' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_VLAN_ETH_TYPE', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_VLAN_ETH_TYPE' ],
> +                [ 'HAVE_TC_ACT_VLAN', 'linux/tc_act/tc_vlan.h', 'enum',
> +                  'TCA_VLAN_PUSH_VLAN_PRIORITY' ],
> +                [ 'HAVE_RDMA_NL_NLDEV', 'rdma/rdma_netlink.h', 'enum',
> +                  'RDMA_NL_NLDEV' ],
> +                [ 'HAVE_RDMA_NLDEV_CMD_GET', 'rdma/rdma_netlink.h', 'enum',
> +                  'RDMA_NLDEV_CMD_GET' ],
> +                [ 'HAVE_RDMA_NLDEV_CMD_PORT_GET', 'rdma/rdma_netlink.h',
> +                  'enum', 'RDMA_NLDEV_CMD_PORT_GET' ],
> +                [ 'HAVE_RDMA_NLDEV_ATTR_DEV_INDEX', 'rdma/rdma_netlink.h',
> +                  'enum', 'RDMA_NLDEV_ATTR_DEV_INDEX' ],
> +                [ 'HAVE_RDMA_NLDEV_ATTR_DEV_NAME', 'rdma/rdma_netlink.h',
> +                  'enum', 'RDMA_NLDEV_ATTR_DEV_NAME' ],
> +                [ 'HAVE_RDMA_NLDEV_ATTR_PORT_INDEX', 'rdma/rdma_netlink.h',
> +                  'enum', 'RDMA_NLDEV_ATTR_PORT_INDEX' ],
> +                [ 'HAVE_RDMA_NLDEV_ATTR_NDEV_INDEX', 'rdma/rdma_netlink.h',
> +                  'enum', 'RDMA_NLDEV_ATTR_NDEV_INDEX' ],
> +        ]
> +        run_command('rm', '-f', meson.current_build_dir() + '/mlx5_autoconf.h')
> +        config = configuration_data()
> +        foreach arg:args
> +		if arg[2] == 'type'
> +			file_prefix = '#include<' + arg[1] + '>'
> +			has = cc.has_member(arg[3], arg[4], prefix : file_prefix)
> +		else
> +			has = cc.has_header_symbol(arg[1], arg[3])
> +		endif
> +		if has
> +			config.set(arg[0], 1)
> +		endif
> +        endforeach
> +        configure_file(output : 'mlx5_autoconf.h', configuration : config)
> +endif

couple of minor points:
* These new additions use tab rather than space for indent. The standard
  with meson I think is normally spaces, but I (inadvertently) added all
  other DPDK meson.build files with tabs, so for consistency I think it
  would be good if the whole file used tabs i.e. change all the other lines
  apart from your new ones in v5.

* is the "rm" command really necessary? I would expect the configure_file()
  function to just do the right thing here when replacing the file.

* Would you consider splitting the args array into two arrays, one for the
  "type" values and another for the enum/define ones? This would mean
  having two loops, but the loops themselves would be clearer and shorter -
  as would the arrays.  Especially since according to
  http://mesonbuild.com/Configuration.html
  a boolean false converts to an "undef", rather than a 0/1 value.
  For example:

	foreach arg:has_sym_args
		config.set(arg[0], cc.has_header_symbol(arg[1], arg[3]))
	endforeach
 
* Very minor suggestion: is it neater to use "args: '-include ' + arg[1]",
  instead of using prefix with the #include syntax? [Assuming the former
  works]

Thanks,
/Bruce
  
Bruce Richardson Sept. 13, 2018, 9:22 a.m. UTC | #2
On Fri, Sep 07, 2018 at 11:34:29AM +0100, Bruce Richardson wrote:
> On Wed, Sep 05, 2018 at 02:47:46PM +0300, Shahaf Shuler wrote:
> > From: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> > 
> > Compile Mellanox drivers when their external dependencies are met.  A
> > glue version of the driver can still be requested by using the
> > -Denable_driver_mlx_glue=true
> > 
> > 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.
> > 
> > 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 output
> >  # LD_LIBRARY_PATH=/tmp/rdma-core/build/lib \
> >    ninja -C output install
> > 
> > Note: LD_LIBRARY_PATH before ninja is necessary when the meson
> > configuration has changed (e.g. meson configure has been called), in
> > such situation the LD_LIBRARY_PATH is necessary to invoke the
> > autoconfiguration script.
> > 
> > Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> > Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
> > Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> > ---
> > Changes in v5:
> > 
> > - use meson tool to generate Mellanox config file instead of DPDK custom scripts.
> > 
> 
> <snip>
> 
> > +        # To maintain the compatibility with the make build system
> > +        # mlx5_autoconf.h file is still generated.
> > +        # input array for meson symbol search:
> > +        # [ "MACRO to define if found", "header for the search",
> > +        #   "type/enum/define", "symbol to search",
> > +        #   "struct member to search (type only)]
> > +        #
> > +        args = [
> > +                [ 'HAVE_IBV_DEVICE_STRIDING_RQ_SUPPORT', 'infiniband/mlx5dv.h',
> > +                  'enum', 'MLX5DV_CQE_RES_FORMAT_CSUM_STRIDX' ],
> > +                [ 'HAVE_IBV_DEVICE_TUNNEL_SUPPORT', 'infiniband/mlx5dv.h',
> > +                  'enum', 'MLX5DV_CONTEXT_MASK_TUNNEL_OFFLOADS' ],
> > +                [ 'HAVE_IBV_MLX5_MOD_MPW', 'infiniband/mlx5dv.h',
> > +                  'enum', 'MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED' ],
> > +                [ 'HAVE_IBV_MLX5_MOD_SWP', 'infiniband/mlx5dv.h',
> > +                  'type', 'struct mlx5dv_sw_parsing_caps',
> > +                  'sw_parsing_offloads' ],
> > +                [ 'HAVE_IBV_MLX5_MOD_CQE_128B_COMP', 'infiniband/mlx5dv.h',
> > +                  'enum', 'MLX5DV_CONTEXT_FLAGS_CQE_128B_COMP' ],
> > +                [ 'HAVE_IBV_DEVICE_MPLS_SUPPORT', 'infiniband/verbs.h',
> > +                  'enum', 'IBV_FLOW_SPEC_MPLS' ],
> > +                [ 'HAVE_IBV_WQ_FLAG_RX_END_PADDING', 'infiniband/verbs.h',
> > +                  'enum', 'IBV_WQ_FLAG_RX_END_PADDING' ],
> > +                [ 'HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT', 'infiniband/verbs.h',
> > +                  'type', 'struct ibv_counter_set_init_attr',
> > +                  'counter_set_id' ],
> > +                [ 'HAVE_SUPPORTED_40000baseKR4_Full', 'linux/ethtool.h',
> > +                  'define', 'SUPPORTED_40000baseKR4_Full' ],
> > +                [ 'HAVE_SUPPORTED_40000baseCR4_Full', 'linux/ethtool.h',
> > +                  'define', 'SUPPORTED_40000baseCR4_Full' ],
> > +                [ 'HAVE_SUPPORTED_40000baseSR4_Full', 'linux/ethtool.h',
> > +                  'define', 'SUPPORTED_40000baseSR4_Full' ],
> > +                [ 'HAVE_SUPPORTED_40000baseLR4_Full', 'linux/ethtool.h',
> > +                  'define', 'SUPPORTED_40000baseLR4_Full' ],
> > +                [ 'HAVE_SUPPORTED_56000baseKR4_Full', 'linux/ethtool.h',
> > +                  'define', 'SUPPORTED_56000baseKR4_Full' ],
> > +                [ 'HAVE_SUPPORTED_56000baseCR4_Full', 'linux/ethtool.h',
> > +                  'define', 'SUPPORTED_56000baseCR4_Full' ],
> > +                [ 'HAVE_SUPPORTED_56000baseSR4_Full', 'linux/ethtool.h',
> > +                  'define', 'SUPPORTED_56000baseSR4_Full' ],
> > +                [ 'HAVE_SUPPORTED_56000baseLR4_Full', 'linux/ethtool.h',
> > +                  'define', 'SUPPORTED_56000baseLR4_Full' ],
> > +                [ 'HAVE_ETHTOOL_LINK_MODE_25G', 'linux/ethtool.h',
> > +                  'enum', 'ETHTOOL_LINK_MODE_25000baseCR_Full_BIT' ],
> > +                [ 'HAVE_ETHTOOL_LINK_MODE_50G', 'linux/ethtool.h',
> > +                  'enum', 'ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT' ],
> > +                [ 'HAVE_ETHTOOL_LINK_MODE_100G', 'linux/ethtool.h',
> > +                  'enum', 'ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT' ],
> > +                [ 'HAVE_IFLA_PHYS_SWITCH_ID', 'linux/if_link.h',
> > +                  'enum', 'IFLA_PHYS_SWITCH_ID' ],
> > +                [ 'HAVE_IFLA_PHYS_PORT_NAME', 'linux/if_link.h',
> > +                  'enum', 'IFLA_PHYS_PORT_NAME' ],
> > +                [ 'HAVE_TCA_FLOWER_ACT', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_ACT' ],
> > +                [ 'HAVE_TCA_FLOWER_FLAGS', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_FLAGS' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_ETH_TYPE', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_ETH_TYPE' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_ETH_DST', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_ETH_DST' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_ETH_DST_MASK', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_ETH_DST_MASK' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_ETH_SRC', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_ETH_SRC' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_ETH_SRC_MASK', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_ETH_SRC_MASK' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_IP_PROTO', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_IP_PROTO' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_SRC', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_IPV4_SRC' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_SRC_MASK', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_IPV4_SRC_MASK' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_DST', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_IPV4_DST' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_DST_MASK', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_IPV4_DST_MASK' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_SRC', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_IPV6_SRC' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_SRC_MASK', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_IPV6_SRC_MASK' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_DST', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_IPV6_DST' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_DST_MASK', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_IPV6_DST_MASK' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_TCP_SRC', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_TCP_SRC' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_TCP_SRC_MASK', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_TCP_SRC_MASK' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_TCP_DST', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_TCP_DST' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_TCP_DST_MASK', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_TCP_DST_MASK' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_UDP_SRC', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_UDP_SRC' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_UDP_SRC_MASK', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_UDP_SRC_MASK' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_UDP_DST', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_UDP_DST' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_UDP_DST_MASK', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_UDP_DST_MASK' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_VLAN_ID', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_VLAN_ID' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_VLAN_PRIO', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_VLAN_PRIO' ],
> > +                [ 'HAVE_TCA_FLOWER_KEY_VLAN_ETH_TYPE', 'linux/pkt_cls.h',
> > +                  'enum', 'TCA_FLOWER_KEY_VLAN_ETH_TYPE' ],
> > +                [ 'HAVE_TC_ACT_VLAN', 'linux/tc_act/tc_vlan.h', 'enum',
> > +                  'TCA_VLAN_PUSH_VLAN_PRIORITY' ],
> > +                [ 'HAVE_RDMA_NL_NLDEV', 'rdma/rdma_netlink.h', 'enum',
> > +                  'RDMA_NL_NLDEV' ],
> > +                [ 'HAVE_RDMA_NLDEV_CMD_GET', 'rdma/rdma_netlink.h', 'enum',
> > +                  'RDMA_NLDEV_CMD_GET' ],
> > +                [ 'HAVE_RDMA_NLDEV_CMD_PORT_GET', 'rdma/rdma_netlink.h',
> > +                  'enum', 'RDMA_NLDEV_CMD_PORT_GET' ],
> > +                [ 'HAVE_RDMA_NLDEV_ATTR_DEV_INDEX', 'rdma/rdma_netlink.h',
> > +                  'enum', 'RDMA_NLDEV_ATTR_DEV_INDEX' ],
> > +                [ 'HAVE_RDMA_NLDEV_ATTR_DEV_NAME', 'rdma/rdma_netlink.h',
> > +                  'enum', 'RDMA_NLDEV_ATTR_DEV_NAME' ],
> > +                [ 'HAVE_RDMA_NLDEV_ATTR_PORT_INDEX', 'rdma/rdma_netlink.h',
> > +                  'enum', 'RDMA_NLDEV_ATTR_PORT_INDEX' ],
> > +                [ 'HAVE_RDMA_NLDEV_ATTR_NDEV_INDEX', 'rdma/rdma_netlink.h',
> > +                  'enum', 'RDMA_NLDEV_ATTR_NDEV_INDEX' ],
> > +        ]
> > +        run_command('rm', '-f', meson.current_build_dir() + '/mlx5_autoconf.h')
> > +        config = configuration_data()
> > +        foreach arg:args
> > +		if arg[2] == 'type'
> > +			file_prefix = '#include<' + arg[1] + '>'
> > +			has = cc.has_member(arg[3], arg[4], prefix : file_prefix)
> > +		else
> > +			has = cc.has_header_symbol(arg[1], arg[3])
> > +		endif
> > +		if has
> > +			config.set(arg[0], 1)
> > +		endif
> > +        endforeach
> > +        configure_file(output : 'mlx5_autoconf.h', configuration : config)
> > +endif
> 
> couple of minor points:
> * These new additions use tab rather than space for indent. The standard
>   with meson I think is normally spaces, but I (inadvertently) added all
>   other DPDK meson.build files with tabs, so for consistency I think it
>   would be good if the whole file used tabs i.e. change all the other lines
>   apart from your new ones in v5.
> 
> * is the "rm" command really necessary? I would expect the configure_file()
>   function to just do the right thing here when replacing the file.
> 
> * Would you consider splitting the args array into two arrays, one for the
>   "type" values and another for the enum/define ones? This would mean
>   having two loops, but the loops themselves would be clearer and shorter -
>   as would the arrays.  Especially since according to
>   http://mesonbuild.com/Configuration.html
>   a boolean false converts to an "undef", rather than a 0/1 value.
>   For example:
> 
> 	foreach arg:has_sym_args
> 		config.set(arg[0], cc.has_header_symbol(arg[1], arg[3]))
> 	endforeach
>  
> * Very minor suggestion: is it neater to use "args: '-include ' + arg[1]",
>   instead of using prefix with the #include syntax? [Assuming the former
>   works]
> 

Any plans for a new version of this? If so, can I also suggest
splitting the patch into two, one for mlx4 and the other for mlx5.

Regards,
/Bruce
  
Shahaf Shuler Sept. 13, 2018, 10:12 a.m. UTC | #3
Hi Bruce,

Sorry for the late reply. Holiday time in Israel. 

Thursday, September 13, 2018 12:22 PM, Bruce Richardson:
> Subject: Re: [dpdk-dev] [PATCH v5] net/mlx: add meson build support
> 
> On Fri, Sep 07, 2018 at 11:34:29AM +0100, Bruce Richardson wrote:
> > On Wed, Sep 05, 2018 at 02:47:46PM +0300, Shahaf Shuler wrote:
> > > From: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>

[...]

> > couple of minor points:
> > * These new additions use tab rather than space for indent. The standard
> >   with meson I think is normally spaces, but I (inadvertently) added all
> >   other DPDK meson.build files with tabs, so for consistency I think it
> >   would be good if the whole file used tabs i.e. change all the other lines
> >   apart from your new ones in v5.

OK, all indentation will be with tab.  

> >
> > * is the "rm" command really necessary? I would expect the
> configure_file()
> >   function to just do the right thing here when replacing the file.

Yep it is not needed. Also from meson sources:
        output = kwargs['output']                                                                                
        ofile_rpath = os.path.join(self.subdir, output)                                                          
        if not isinstance(output, str):                                                                          
            raise InterpreterException('Output file name must be a string')                                      
        if ofile_rpath in self.configure_file_outputs:                                                           
            mesonbuildfile = os.path.join(self.subdir, 'meson.build')                                            
            current_call = "{}:{}".format(mesonbuildfile, self.current_lineno)                                   
            first_call = "{}:{}".format(mesonbuildfile, self.configure_file_outputs[ofile_rpath])                
            mlog.warning('Output file', mlog.bold(ofile_rpath, True), 'for configure_file() at', current_call, 'o
verwrites configure_file() output at', first_call)                                                               

> >
> > * Would you consider splitting the args array into two arrays, one for the
> >   "type" values and another for the enum/define ones? This would mean
> >   having two loops, but the loops themselves would be clearer and shorter -
> >   as would the arrays.  Especially since according to
> >
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmes
> onbuild.com%2FConfiguration.html&amp;data=02%7C01%7Cshahafs%40mell
> anox.com%7C38f62333815c48eaea6e08d6195a908a%7Ca652971c7d2e4d9ba6
> a4d149256f461b%7C0%7C0%7C636724274091500993&amp;sdata=fZvTg16D8K
> TsE7Q0DWsS9hiNnB%2BhHPuHi%2FFC7wrk8x8%3D&amp;reserved=0
> >   a boolean false converts to an "undef", rather than a 0/1 value.
> >   For example:
> >
> > 	foreach arg:has_sym_args
> > 		config.set(arg[0], cc.has_header_symbol(arg[1], arg[3]))
> > 	endforeach
> >

Done.

> > * Very minor suggestion: is it neater to use "args: '-include ' + arg[1]",
> >   instead of using prefix with the #include syntax? [Assuming the former
> >   works]

I don't understand the benefit with this change. Is there? 

> >
> 
> Any plans for a new version of this? If so, can I also suggest splitting the patch
> into two, one for mlx4 and the other for mlx5.

No problem to split.

Another change in plans: 
diff --git a/meson_options.txt b/meson_options.txt
index 484f3e2601..444a380d97 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,7 +1,7 @@
 option('allow_invalid_socket_id', type: 'boolean', value: false,
        description: 'allow out-of-range NUMA socket id\'s for platforms that don\'t report the value correctly')
 option('enable_driver_mlx_glue', type: 'boolean', value: false,
-       description: 'Enable glue library for Mellanox ConnectX-3/4/5 NIC PMD')
+       description: 'Enable glue library for Mellanox PMDs')
 option('enable_kmods', type: 'boolean', value: true,
        description: 'build kernel modules')
 option('examples', type: 'string', value: '',

I don't see the need to constantly update with each device being added.  

> 
> Regards,
> /Bruce
  
Bruce Richardson Sept. 13, 2018, 10:51 a.m. UTC | #4
On Thu, Sep 13, 2018 at 10:12:18AM +0000, Shahaf Shuler wrote:
> Hi Bruce,
> 
> Sorry for the late reply. Holiday time in Israel. 
> 
No problem! Hope you had a good break. :-)

> Thursday, September 13, 2018 12:22 PM, Bruce Richardson:
> > Subject: Re: [dpdk-dev] [PATCH v5] net/mlx: add meson build support
> > 
> > On Fri, Sep 07, 2018 at 11:34:29AM +0100, Bruce Richardson wrote:
> > > On Wed, Sep 05, 2018 at 02:47:46PM +0300, Shahaf Shuler wrote:
> > > > From: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> 
<snip>
> 
> > > * Very minor suggestion: is it neater to use "args: '-include ' + arg[1]",
> > >   instead of using prefix with the #include syntax? [Assuming the former
> > >   works]
> 
> I don't understand the benefit with this change. Is there? 
> 

No, it was just a suggestion as to what looked neater in the code. Use
whatever you prefer.

> > >
> > 
> > Any plans for a new version of this? If so, can I also suggest splitting the patch
> > into two, one for mlx4 and the other for mlx5.
> 
> No problem to split.
> 
> Another change in plans: 
> diff --git a/meson_options.txt b/meson_options.txt
> index 484f3e2601..444a380d97 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -1,7 +1,7 @@
>  option('allow_invalid_socket_id', type: 'boolean', value: false,
>         description: 'allow out-of-range NUMA socket id\'s for platforms that don\'t report the value correctly')
>  option('enable_driver_mlx_glue', type: 'boolean', value: false,
> -       description: 'Enable glue library for Mellanox ConnectX-3/4/5 NIC PMD')
> +       description: 'Enable glue library for Mellanox PMDs')
>  option('enable_kmods', type: 'boolean', value: true,
>         description: 'build kernel modules')
>  option('examples', type: 'string', value: '',
> 
> I don't see the need to constantly update with each device being added.  
> 
Good idea!

/Bruce
  

Patch

diff --git a/drivers/net/meson.build b/drivers/net/meson.build
index 9c28ed4da4..c7a2d0e7db 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 0000000000..e552d7b0c2
--- /dev/null
+++ b/drivers/net/mlx4/meson.build
@@ -0,0 +1,110 @@ 
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright 2018 6WIND S.A.
+# Copyright 2018 Mellanox Technologies, Ltd
+
+pmd_dlopen = get_option('enable_driver_mlx_glue')
+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),
+        ]
+endif
+libs = [
+        cc.find_library('mnl', required:false),
+        cc.find_library('mlx4', required:false),
+        cc.find_library('ibverbs', required:false),
+]
+build = true
+foreach lib:libs
+        if not lib.found()
+                build = false
+        endif
+endforeach
+# Compile PMD
+if build
+        allow_experimental_apis = true
+        ext_deps += libs
+        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_options = [
+                '-Wextra',
+                '-std=c11',
+                '-Wno-strict-prototypes',
+                '-D_BSD_SOURCE',
+                '-D_DEFAULT_SOURCE',
+                '-D_XOPEN_SOURCE=600'
+        ]
+        foreach option:cflags_options
+                if cc.has_argument(option)
+                        cflags += option
+                endif
+        endforeach
+        if get_option('buildtype').contains('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.
+        # input array for meson symbol search:
+        # [ "MACRO to define if found", "header for the search",
+        #   "type/enum/define", "symbol to search",
+        #   "struct member to search (type only)]
+        #
+        args = [
+		[ 'HAVE_IBV_MLX4_WQE_LSO_SEG', 'infiniband/mlx4dv.h',
+                  'type', 'struct mlx4_wqe_lso_seg', 'mss_hdr_size' ],
+	]
+        run_command('rm', '-f', meson.current_build_dir() + '/mlx4_autoconf.h')
+        config = configuration_data()
+        foreach arg:args
+		if arg[2] == 'type'
+			file_prefix = '#include<' + arg[1] + '>'
+			has = cc.has_member(arg[3], arg[4], prefix : file_prefix)
+		else
+			has = cc.has_header_symbol(arg[1], arg[3])
+		endif
+		if has
+			config.set(arg[0], 1)
+		endif
+        endforeach
+        configure_file(output : 'mlx4_autoconf.h', configuration : config)
+endif
+# Build Glue Library
+if pmd_dlopen and build
+        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,
+               dependencies: libs,
+               link_args: [
+                       '-Wl,-export-dynamic',
+                       '-Wl,-h,@0@'.format(LIB_GLUE),
+                       ],
+               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 0000000000..9f0219cfb0
--- /dev/null
+++ b/drivers/net/mlx5/meson.build
@@ -0,0 +1,231 @@ 
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright 2018 6WIND S.A.
+# Copyright 2018 Mellanox Technologies, Ltd
+
+pmd_dlopen = get_option('enable_driver_mlx_glue')
+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),
+        ]
+endif
+libs = [
+        cc.find_library('mnl', required:false),
+        cc.find_library('mlx5', required:false),
+        cc.find_library('ibverbs', required:false),
+]
+build = true
+foreach lib:libs
+        if not lib.found()
+                build = false
+        endif
+endforeach
+if build
+        allow_experimental_apis = true
+        ext_deps += libs
+        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_options = [
+                '-Wextra',
+                '-std=c11',
+                '-Wno-strict-prototypes',
+                '-D_BSD_SOURCE',
+                '-D_DEFAULT_SOURCE',
+                '-D_XOPEN_SOURCE=600'
+        ]
+        foreach option:cflags_options
+                if cc.has_argument(option)
+                        cflags += option
+                endif
+        endforeach
+        if get_option('buildtype').contains('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.
+        # input array for meson symbol search:
+        # [ "MACRO to define if found", "header for the search",
+        #   "type/enum/define", "symbol to search",
+        #   "struct member to search (type only)]
+        #
+        args = [
+                [ 'HAVE_IBV_DEVICE_STRIDING_RQ_SUPPORT', 'infiniband/mlx5dv.h',
+                  'enum', 'MLX5DV_CQE_RES_FORMAT_CSUM_STRIDX' ],
+                [ 'HAVE_IBV_DEVICE_TUNNEL_SUPPORT', 'infiniband/mlx5dv.h',
+                  'enum', 'MLX5DV_CONTEXT_MASK_TUNNEL_OFFLOADS' ],
+                [ 'HAVE_IBV_MLX5_MOD_MPW', 'infiniband/mlx5dv.h',
+                  'enum', 'MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED' ],
+                [ 'HAVE_IBV_MLX5_MOD_SWP', 'infiniband/mlx5dv.h',
+                  'type', 'struct mlx5dv_sw_parsing_caps',
+                  'sw_parsing_offloads' ],
+                [ 'HAVE_IBV_MLX5_MOD_CQE_128B_COMP', 'infiniband/mlx5dv.h',
+                  'enum', 'MLX5DV_CONTEXT_FLAGS_CQE_128B_COMP' ],
+                [ 'HAVE_IBV_DEVICE_MPLS_SUPPORT', 'infiniband/verbs.h',
+                  'enum', 'IBV_FLOW_SPEC_MPLS' ],
+                [ 'HAVE_IBV_WQ_FLAG_RX_END_PADDING', 'infiniband/verbs.h',
+                  'enum', 'IBV_WQ_FLAG_RX_END_PADDING' ],
+                [ 'HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT', 'infiniband/verbs.h',
+                  'type', 'struct ibv_counter_set_init_attr',
+                  'counter_set_id' ],
+                [ 'HAVE_SUPPORTED_40000baseKR4_Full', 'linux/ethtool.h',
+                  'define', 'SUPPORTED_40000baseKR4_Full' ],
+                [ 'HAVE_SUPPORTED_40000baseCR4_Full', 'linux/ethtool.h',
+                  'define', 'SUPPORTED_40000baseCR4_Full' ],
+                [ 'HAVE_SUPPORTED_40000baseSR4_Full', 'linux/ethtool.h',
+                  'define', 'SUPPORTED_40000baseSR4_Full' ],
+                [ 'HAVE_SUPPORTED_40000baseLR4_Full', 'linux/ethtool.h',
+                  'define', 'SUPPORTED_40000baseLR4_Full' ],
+                [ 'HAVE_SUPPORTED_56000baseKR4_Full', 'linux/ethtool.h',
+                  'define', 'SUPPORTED_56000baseKR4_Full' ],
+                [ 'HAVE_SUPPORTED_56000baseCR4_Full', 'linux/ethtool.h',
+                  'define', 'SUPPORTED_56000baseCR4_Full' ],
+                [ 'HAVE_SUPPORTED_56000baseSR4_Full', 'linux/ethtool.h',
+                  'define', 'SUPPORTED_56000baseSR4_Full' ],
+                [ 'HAVE_SUPPORTED_56000baseLR4_Full', 'linux/ethtool.h',
+                  'define', 'SUPPORTED_56000baseLR4_Full' ],
+                [ 'HAVE_ETHTOOL_LINK_MODE_25G', 'linux/ethtool.h',
+                  'enum', 'ETHTOOL_LINK_MODE_25000baseCR_Full_BIT' ],
+                [ 'HAVE_ETHTOOL_LINK_MODE_50G', 'linux/ethtool.h',
+                  'enum', 'ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT' ],
+                [ 'HAVE_ETHTOOL_LINK_MODE_100G', 'linux/ethtool.h',
+                  'enum', 'ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT' ],
+                [ 'HAVE_IFLA_PHYS_SWITCH_ID', 'linux/if_link.h',
+                  'enum', 'IFLA_PHYS_SWITCH_ID' ],
+                [ 'HAVE_IFLA_PHYS_PORT_NAME', 'linux/if_link.h',
+                  'enum', 'IFLA_PHYS_PORT_NAME' ],
+                [ 'HAVE_TCA_FLOWER_ACT', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_ACT' ],
+                [ 'HAVE_TCA_FLOWER_FLAGS', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_FLAGS' ],
+                [ 'HAVE_TCA_FLOWER_KEY_ETH_TYPE', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_ETH_TYPE' ],
+                [ 'HAVE_TCA_FLOWER_KEY_ETH_DST', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_ETH_DST' ],
+                [ 'HAVE_TCA_FLOWER_KEY_ETH_DST_MASK', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_ETH_DST_MASK' ],
+                [ 'HAVE_TCA_FLOWER_KEY_ETH_SRC', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_ETH_SRC' ],
+                [ 'HAVE_TCA_FLOWER_KEY_ETH_SRC_MASK', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_ETH_SRC_MASK' ],
+                [ 'HAVE_TCA_FLOWER_KEY_IP_PROTO', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_IP_PROTO' ],
+                [ 'HAVE_TCA_FLOWER_KEY_IPV4_SRC', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_IPV4_SRC' ],
+                [ 'HAVE_TCA_FLOWER_KEY_IPV4_SRC_MASK', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_IPV4_SRC_MASK' ],
+                [ 'HAVE_TCA_FLOWER_KEY_IPV4_DST', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_IPV4_DST' ],
+                [ 'HAVE_TCA_FLOWER_KEY_IPV4_DST_MASK', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_IPV4_DST_MASK' ],
+                [ 'HAVE_TCA_FLOWER_KEY_IPV6_SRC', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_IPV6_SRC' ],
+                [ 'HAVE_TCA_FLOWER_KEY_IPV6_SRC_MASK', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_IPV6_SRC_MASK' ],
+                [ 'HAVE_TCA_FLOWER_KEY_IPV6_DST', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_IPV6_DST' ],
+                [ 'HAVE_TCA_FLOWER_KEY_IPV6_DST_MASK', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_IPV6_DST_MASK' ],
+                [ 'HAVE_TCA_FLOWER_KEY_TCP_SRC', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_TCP_SRC' ],
+                [ 'HAVE_TCA_FLOWER_KEY_TCP_SRC_MASK', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_TCP_SRC_MASK' ],
+                [ 'HAVE_TCA_FLOWER_KEY_TCP_DST', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_TCP_DST' ],
+                [ 'HAVE_TCA_FLOWER_KEY_TCP_DST_MASK', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_TCP_DST_MASK' ],
+                [ 'HAVE_TCA_FLOWER_KEY_UDP_SRC', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_UDP_SRC' ],
+                [ 'HAVE_TCA_FLOWER_KEY_UDP_SRC_MASK', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_UDP_SRC_MASK' ],
+                [ 'HAVE_TCA_FLOWER_KEY_UDP_DST', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_UDP_DST' ],
+                [ 'HAVE_TCA_FLOWER_KEY_UDP_DST_MASK', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_UDP_DST_MASK' ],
+                [ 'HAVE_TCA_FLOWER_KEY_VLAN_ID', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_VLAN_ID' ],
+                [ 'HAVE_TCA_FLOWER_KEY_VLAN_PRIO', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_VLAN_PRIO' ],
+                [ 'HAVE_TCA_FLOWER_KEY_VLAN_ETH_TYPE', 'linux/pkt_cls.h',
+                  'enum', 'TCA_FLOWER_KEY_VLAN_ETH_TYPE' ],
+                [ 'HAVE_TC_ACT_VLAN', 'linux/tc_act/tc_vlan.h', 'enum',
+                  'TCA_VLAN_PUSH_VLAN_PRIORITY' ],
+                [ 'HAVE_RDMA_NL_NLDEV', 'rdma/rdma_netlink.h', 'enum',
+                  'RDMA_NL_NLDEV' ],
+                [ 'HAVE_RDMA_NLDEV_CMD_GET', 'rdma/rdma_netlink.h', 'enum',
+                  'RDMA_NLDEV_CMD_GET' ],
+                [ 'HAVE_RDMA_NLDEV_CMD_PORT_GET', 'rdma/rdma_netlink.h',
+                  'enum', 'RDMA_NLDEV_CMD_PORT_GET' ],
+                [ 'HAVE_RDMA_NLDEV_ATTR_DEV_INDEX', 'rdma/rdma_netlink.h',
+                  'enum', 'RDMA_NLDEV_ATTR_DEV_INDEX' ],
+                [ 'HAVE_RDMA_NLDEV_ATTR_DEV_NAME', 'rdma/rdma_netlink.h',
+                  'enum', 'RDMA_NLDEV_ATTR_DEV_NAME' ],
+                [ 'HAVE_RDMA_NLDEV_ATTR_PORT_INDEX', 'rdma/rdma_netlink.h',
+                  'enum', 'RDMA_NLDEV_ATTR_PORT_INDEX' ],
+                [ 'HAVE_RDMA_NLDEV_ATTR_NDEV_INDEX', 'rdma/rdma_netlink.h',
+                  'enum', 'RDMA_NLDEV_ATTR_NDEV_INDEX' ],
+        ]
+        run_command('rm', '-f', meson.current_build_dir() + '/mlx5_autoconf.h')
+        config = configuration_data()
+        foreach arg:args
+		if arg[2] == 'type'
+			file_prefix = '#include<' + arg[1] + '>'
+			has = cc.has_member(arg[3], arg[4], prefix : file_prefix)
+		else
+			has = cc.has_header_symbol(arg[1], arg[3])
+		endif
+		if has
+			config.set(arg[0], 1)
+		endif
+        endforeach
+        configure_file(output : 'mlx5_autoconf.h', configuration : config)
+endif
+# Build Glue Library
+if pmd_dlopen and build
+        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,
+                dependencies: libs,
+                link_args: [
+                        '-Wl,-export-dynamic',
+                        '-Wl,-h,@0@'.format(LIB_GLUE),
+                        ],
+                soversion: dlopen_so_version,
+                install: true,
+                install_dir: dlopen_install_dir,
+        )
+endif
diff --git a/meson_options.txt b/meson_options.txt
index c843278587..484f3e2601 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,5 +1,7 @@ 
 option('allow_invalid_socket_id', type: 'boolean', value: false,
 	description: 'allow out-of-range NUMA socket id\'s for platforms that don\'t report the value correctly')
+option('enable_driver_mlx_glue', type: 'boolean', value: false,
+	description: 'Enable glue library for Mellanox ConnectX-3/4/5 NIC PMD')
 option('enable_kmods', type: 'boolean', value: true,
 	description: 'build kernel modules')
 option('examples', type: 'string', value: '',