xref: /dpdk/lib/meson.build (revision 3019b11fc1fc7c2ed8a405a551391e51fd94a087)
1# SPDX-License-Identifier: BSD-3-Clause
2# Copyright(c) 2017-2019 Intel Corporation
3
4
5# process all libraries equally, as far as possible
6# "core" libs first, then others alphabetically as far as possible
7# NOTE: for speed of meson runs, the dependencies in the subdirectories
8# sometimes skip deps that would be implied by others, e.g. if mempool is
9# given as a dep, no need to mention ring. This is especially true for the
10# core libs which are widely reused, so their deps are kept to a minimum.
11libraries = [
12        'log',
13        'kvargs', # eal depends on kvargs
14        'argparse',
15        'telemetry', # basic info querying
16        'eal', # everything depends on eal
17        'ptr_compress',
18        'ring',
19        'rcu', # rcu depends on ring
20        'mempool',
21        'mbuf',
22        'net',
23        'meter',
24        'ethdev',
25        'pci', # core
26        'cmdline',
27        'metrics', # bitrate/latency stats depends on this
28        'hash',    # efd depends on this
29        'timer',   # eventdev depends on this
30        'acl',
31        'bbdev',
32        'bitratestats',
33        'bpf',
34        'cfgfile',
35        'compressdev',
36        'cryptodev',
37        'distributor',
38        'dmadev',  # eventdev depends on this
39        'efd',
40        'eventdev',
41        'dispatcher', # dispatcher depends on eventdev
42        'gpudev',
43        'gro',
44        'gso',
45        'ip_frag',
46        'jobstats',
47        'latencystats',
48        'lpm',
49        'member',
50        'pcapng',
51        'power',
52        'rawdev',
53        'regexdev',
54        'mldev',
55        'rib',
56        'reorder',
57        'sched',
58        'security',
59        'stack',
60        'vhost',
61        'ipsec', # ipsec lib depends on net, crypto and security
62        'pdcp', # pdcp lib depends on crypto and security
63        'fib', #fib lib depends on rib
64        'port', # pkt framework libs which use other libs from above
65        'pdump', # pdump lib depends on bpf
66        'table',
67        'pipeline',
68        'graph',
69        'node',
70]
71
72always_enable = [
73        'cmdline',
74        'eal',
75        'ethdev',
76        'hash',
77        'kvargs',
78        'log',
79        'mbuf',
80        'mempool',
81        'meter',
82        'net',
83        'pci',
84        'rcu',
85        'ring',
86        'stack',
87        'telemetry',
88]
89
90enable_deprecated_libs = []
91foreach l:run_command(list_dir_globs, get_option('enable_deprecated_libs'),
92        check: true).stdout().split()
93    if not dpdk_libs_deprecated.contains(l)
94        continue
95    endif
96    enable_deprecated_libs += l
97endforeach
98
99disable_libs = run_command(list_dir_globs, get_option('disable_libs'), check: true).stdout().split()
100
101enable_libs = run_command(list_dir_globs, get_option('enable_libs'), check: true).stdout().split()
102require_libs = true
103if enable_libs.length() == 0
104    require_libs = false
105    enable_libs = libraries
106else
107    enable_libs += always_enable
108endif
109
110default_cflags = machine_args
111default_cflags += ['-DALLOW_EXPERIMENTAL_API']
112default_cflags += ['-DALLOW_INTERNAL_API']
113
114if cc.has_argument('-Wno-format-truncation')
115    default_cflags += '-Wno-format-truncation'
116endif
117
118foreach l:libraries
119    build = true
120    reason = '<unknown reason>' # set if build == false to explain why
121    name = l
122    use_function_versioning = false
123    annotate_locks = true
124    sources = []
125    headers = []
126    indirect_headers = [] # public headers not directly included by apps
127    driver_sdk_headers = [] # public headers included by drivers
128    includes = []
129    cflags = default_cflags
130    objs = [] # other object files to link against, used e.g. for
131              # instruction-set optimized versions of code
132
133    # use "deps" for internal DPDK dependencies, and "ext_deps" for
134    # external package/library requirements
135    ext_deps = []
136    deps = []
137    # eal is standard dependency once built
138    if dpdk_conf.has('RTE_LIB_EAL')
139        deps += ['eal']
140    endif
141
142    if dpdk_libs_deprecated.contains(l)
143        if not enable_deprecated_libs.contains(l)
144            build = false
145            reason = 'not in enabled deprecated libraries build config'
146        else
147            warning('Enabling deprecated library, "@0@"'.format(l))
148        endif
149    elif not enable_libs.contains(l)
150        build = false
151        reason = 'not in enabled libraries build config'
152    elif disable_libs.contains(l)
153        if always_enable.contains(l)
154            warning('Cannot disable mandatory library "@0@"'.format(l))
155        else
156            build = false
157            reason = 'explicitly disabled via build config'
158        endif
159    endif
160
161    if build
162        subdir(l)
163        if not build and require_libs
164            error('Cannot build explicitly requested lib "@0@".\n'.format(name)
165                    +'\tReason: ' + reason)
166        endif
167    endif
168    if name != l
169        warning('Library name, "@0@", and directory name, "@1@", do not match'.format(name, l))
170    endif
171
172    shared_deps = ext_deps
173    static_deps = ext_deps
174    foreach d:deps
175        if not build
176            break
177        endif
178        if not is_variable('shared_rte_' + d)
179            build = false
180            reason = 'missing internal dependency, "@0@"'.format(d)
181            if dpdk_libs_deprecated.contains(d)
182                reason += ' (deprecated lib)'
183            endif
184            message('Disabling @1@ [@2@]: missing internal dependency "@0@"'
185                    .format(d, name, 'lib/' + l))
186            if require_libs
187                error('Cannot build explicitly requested lib "@0@".\n'.format(name)
188                        + '\tPlease add missing dependency "@0@" to "enable_libs" option'.format(d))
189            endif
190        else
191            shared_deps += [get_variable('shared_rte_' + d)]
192            static_deps += [get_variable('static_rte_' + d)]
193        endif
194    endforeach
195
196    if not build
197        dpdk_libs_disabled += name
198        set_variable('lib_' + name.underscorify() + '_disable_reason', reason)
199        continue
200    endif
201
202    dpdk_libs_enabled += name
203    dpdk_conf.set('RTE_LIB_' + name.to_upper(), 1)
204    install_headers(headers)
205    install_headers(indirect_headers)
206    if get_option('enable_driver_sdk')
207        install_headers(driver_sdk_headers)
208    endif
209    dpdk_chkinc_headers += headers
210    dpdk_chkinc_headers += driver_sdk_headers
211
212    libname = 'rte_' + name
213    includes += include_directories(l)
214    dpdk_includes += include_directories(l)
215
216    # special case for header only libraries
217    if sources.length() == 0
218        shared_dep = declare_dependency(include_directories: includes,
219                dependencies: shared_deps)
220        static_dep = declare_dependency(include_directories: includes,
221                dependencies: static_deps)
222        set_variable('shared_rte_' + name, shared_dep)
223        set_variable('static_rte_' + name, static_dep)
224        dpdk_shared_lib_deps += shared_dep
225        dpdk_static_lib_deps += static_dep
226        if developer_mode
227            message('lib/@0@: Defining dependency "@1@"'.format(l, name))
228        endif
229        continue
230    endif
231
232    if developer_mode and is_windows and use_function_versioning
233        message('@0@: Function versioning is not supported by Windows.'.format(name))
234    endif
235
236    if use_function_versioning
237        cflags += '-DRTE_USE_FUNCTION_VERSIONING'
238    endif
239    cflags += '-DRTE_LOG_DEFAULT_LOGTYPE=lib.' + l
240    if annotate_locks and cc.get_id() == 'clang' and cc.version().version_compare('>=3.5.0')
241        cflags += '-DRTE_ANNOTATE_LOCKS'
242        cflags += '-Wthread-safety'
243    endif
244
245    # first build static lib
246    static_lib = static_library(libname,
247            sources,
248            objects: objs,
249            c_args: cflags,
250            dependencies: static_deps,
251            include_directories: includes,
252            install: true)
253    static_dep = declare_dependency(
254            include_directories: includes,
255            dependencies: static_deps)
256
257    if not use_function_versioning or is_windows
258        # use pre-build objects to build shared lib
259        sources = []
260        objs += static_lib.extract_all_objects(recursive: false)
261    else
262        # for compat we need to rebuild with
263        # RTE_BUILD_SHARED_LIB defined
264        cflags += '-DRTE_BUILD_SHARED_LIB'
265    endif
266
267    version_map = '@0@/@1@/version.map'.format(meson.current_source_dir(), l)
268    lk_deps = [version_map]
269
270    if is_ms_linker
271        def_file = custom_target(libname + '_def',
272                command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
273                input: version_map,
274                output: '@0@_exports.def'.format(libname))
275        lk_deps += [def_file]
276
277        if is_ms_compiler
278            lk_args = ['/def:' + def_file.full_path()]
279        else
280            lk_args = ['-Wl,/def:' + def_file.full_path()]
281        endif
282    else
283        if is_windows
284            mingw_map = custom_target(libname + '_mingw',
285                    command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
286                    input: version_map,
287                    output: '@0@_mingw.map'.format(libname))
288            lk_deps += [mingw_map]
289
290            lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]
291        else
292            lk_args = ['-Wl,--version-script=' + version_map]
293        endif
294    endif
295
296    if developer_mode and not is_windows
297        # on unix systems check the output of the
298        # check-symbols.sh script, using it as a
299        # dependency of the .so build
300        lk_deps += custom_target(name + '.sym_chk',
301                command: [check_symbols,
302                    version_map, '@INPUT@'],
303                capture: true,
304                input: static_lib,
305                output: name + '.sym_chk')
306    endif
307
308    shared_lib = shared_library(libname,
309            sources,
310            objects: objs,
311            c_args: cflags,
312            dependencies: shared_deps,
313            include_directories: includes,
314            link_args: lk_args,
315            link_depends: lk_deps,
316            version: abi_version,
317            soversion: so_version,
318            install: true)
319    shared_dep = declare_dependency(link_with: shared_lib,
320            include_directories: includes,
321            dependencies: shared_deps)
322
323    dpdk_libraries = [shared_lib] + dpdk_libraries
324    dpdk_static_libraries = [static_lib] + dpdk_static_libraries
325
326    set_variable('shared_rte_' + name, shared_dep)
327    set_variable('static_rte_' + name, static_dep)
328    dpdk_shared_lib_deps += shared_dep
329    dpdk_static_lib_deps += static_dep
330    if developer_mode
331        message('lib/@0@: Defining dependency "@1@"'.format(l, name))
332    endif
333endforeach
334