xref: /dpdk/drivers/net/mlx4/meson.build (revision 33d66940e9bab36bae88cf4e1b09f53fe60cd44d)
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