99a30eab8f6f9807393346ee19bb5a6124183fad
[dpdk.git] / drivers / net / mlx4 / meson.build
1 # SPDX-License-Identifier: BSD-3-Clause
2 # Copyright 2018 6WIND S.A.
3 # Copyright 2018 Mellanox Technologies, Ltd
4
5 if not is_linux
6     build = false
7     reason = 'only supported on Linux'
8     subdir_done()
9 endif
10
11 static_ibverbs = (get_option('ibverbs_link') == 'static')
12 dlopen_ibverbs = (get_option('ibverbs_link') == 'dlopen')
13 LIB_GLUE_BASE = 'librte_net_mlx4_glue.so'
14 LIB_GLUE_VERSION = abi_version
15 LIB_GLUE = LIB_GLUE_BASE + '.' + LIB_GLUE_VERSION
16 if 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     ]
22 endif
23
24 libnames = [ 'mlx4', 'ibverbs' ]
25 libs = []
26 foreach 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
42 endforeach
43 if static_ibverbs or dlopen_ibverbs
44     # Build without adding shared libs to Requires.private
45     ibv_cflags = run_command(pkgconf, '--cflags', 'libibverbs').stdout()
46     ext_deps += declare_dependency(compile_args: ibv_cflags.split())
47 endif
48 if 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())
52 endif
53
54 sources = 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 )
66 if not dlopen_ibverbs
67     sources += files('mlx4_glue.c')
68 endif
69 cflags_options = [
70         '-std=c11',
71         '-Wno-strict-prototypes',
72         '-D_BSD_SOURCE',
73         '-D_DEFAULT_SOURCE',
74         '-D_XOPEN_SOURCE=600',
75 ]
76 foreach option:cflags_options
77     if cc.has_argument(option)
78         cflags += option
79     endif
80 endforeach
81 if get_option('buildtype').contains('debug')
82     cflags += [ '-pedantic', '-DPEDANTIC' ]
83 else
84     cflags += [ '-UPEDANTIC' ]
85 endif
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 #
90 has_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" ]
97 has_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 ]
103 config = configuration_data()
104 foreach arg:has_sym_args
105     config.set(arg[0], cc.has_header_symbol(arg[1], arg[2],
106         dependencies: libs))
107 endforeach
108 foreach 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))
112 endforeach
113 configure_file(output : 'mlx4_autoconf.h', configuration : config)
114
115 # Build Glue Library
116 if 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     )
136 endif