1# SPDX-License-Identifier: BSD-3-Clause 2# Copyright 2018 6WIND S.A. 3# Copyright 2018 Mellanox Technologies, Ltd 4 5if not is_linux 6 build = false 7 reason = 'only supported on Linux' 8 subdir_done() 9endif 10 11static_ibverbs = (get_option('ibverbs_link') == 'static') 12dlopen_ibverbs = (get_option('ibverbs_link') == 'dlopen') 13LIB_GLUE_BASE = 'librte_net_mlx4_glue.so' 14LIB_GLUE_VERSION = abi_version 15LIB_GLUE = LIB_GLUE_BASE + '.' + LIB_GLUE_VERSION 16if dlopen_ibverbs 17 dpdk_conf.set('RTE_IBVERBS_LINK_DLOPEN', 1) 18 cflags += [ 19 '-DMLX4_GLUE="@0@"'.format(LIB_GLUE), 20 '-DMLX4_GLUE_VERSION="@0@"'.format(LIB_GLUE_VERSION), 21 ] 22endif 23 24libnames = [ 'mlx4', 'ibverbs' ] 25libs = [] 26foreach libname:libnames 27 lib = dependency('lib' + libname, static:static_ibverbs, 28 required:false, method: 'pkg-config') 29 if not lib.found() and not static_ibverbs 30 lib = cc.find_library(libname, required:false) 31 endif 32 if lib.found() 33 libs += lib 34 if not static_ibverbs and not dlopen_ibverbs 35 ext_deps += lib 36 endif 37 else 38 build = false 39 reason = 'missing dependency, "' + libname + '"' 40 subdir_done() 41 endif 42endforeach 43if static_ibverbs or dlopen_ibverbs 44 # Build without adding shared libs to Requires.private 45 ibv_cflags = run_command(pkgconf, '--cflags', 'libibverbs', check:true).stdout() 46 ext_deps += declare_dependency(compile_args: ibv_cflags.split()) 47endif 48if static_ibverbs 49 # Add static deps ldflags to internal apps and Libs.private 50 ibv_ldflags = run_command(ldflags_ibverbs_static, check:true).stdout() 51 ext_deps += declare_dependency(link_args:ibv_ldflags.split()) 52endif 53 54sources = files( 55 'mlx4.c', 56 'mlx4_ethdev.c', 57 'mlx4_flow.c', 58 'mlx4_intr.c', 59 'mlx4_mp.c', 60 'mlx4_mr.c', 61 'mlx4_rxq.c', 62 'mlx4_rxtx.c', 63 'mlx4_txq.c', 64 'mlx4_utils.c', 65) 66if not dlopen_ibverbs 67 sources += files('mlx4_glue.c') 68endif 69cflags_options = [ 70 '-std=c11', 71 '-Wno-strict-prototypes', 72 '-D_BSD_SOURCE', 73 '-D_DEFAULT_SOURCE', 74 '-D_XOPEN_SOURCE=600', 75] 76foreach option:cflags_options 77 if cc.has_argument(option) 78 cflags += option 79 endif 80endforeach 81if get_option('buildtype').contains('debug') 82 cflags += [ '-pedantic', '-DPEDANTIC' ] 83else 84 cflags += [ '-UPEDANTIC' ] 85endif 86# input array for meson member search: 87# [ "MACRO to define if found", "header for the search", 88# "symbol to search", "struct member to search" ] 89# 90has_member_args = [ 91 [ 'HAVE_IBV_MLX4_WQE_LSO_SEG', 'infiniband/mlx4dv.h', 92 'struct mlx4_wqe_lso_seg', 'mss_hdr_size' ], 93] 94# input array for meson symbol search: 95# [ "MACRO to define if found", "header for the search", 96# "symbol to search" ] 97has_sym_args = [ 98 [ 'HAVE_IBV_MLX4_BUF_ALLOCATORS', 'infiniband/mlx4dv.h', 99 'MLX4DV_SET_CTX_ATTR_BUF_ALLOCATORS' ], 100 [ 'HAVE_IBV_MLX4_UAR_MMAP_OFFSET', 'infiniband/mlx4dv.h', 101 'MLX4DV_QP_MASK_UAR_MMAP_OFFSET' ], 102] 103config = configuration_data() 104foreach arg:has_sym_args 105 config.set(arg[0], cc.has_header_symbol(arg[1], arg[2], 106 dependencies: libs, args: cflags)) 107endforeach 108foreach arg:has_member_args 109 file_prefix = '#include <' + arg[1] + '>' 110 config.set(arg[0], cc.has_member(arg[2], arg[3], 111 prefix: file_prefix, dependencies: libs, args: cflags)) 112endforeach 113configure_file(output : 'mlx4_autoconf.h', configuration : config) 114 115# Build Glue Library 116if dlopen_ibverbs 117 dlopen_name = 'mlx4_glue' 118 dlopen_lib_name = 'rte_net_' + dlopen_name 119 dlopen_so_version = LIB_GLUE_VERSION 120 dlopen_sources = files('mlx4_glue.c') 121 dlopen_install_dir = [ eal_pmd_path + '-glue' ] 122 shared_lib = shared_library( 123 dlopen_lib_name, 124 dlopen_sources, 125 include_directories: global_inc, 126 c_args: cflags, 127 dependencies: libs, 128 link_args: [ 129 '-Wl,-export-dynamic', 130 '-Wl,-h,@0@'.format(LIB_GLUE), 131 ], 132 soversion: dlopen_so_version, 133 install: true, 134 install_dir: dlopen_install_dir, 135 ) 136endif 137