xref: /dpdk/lib/meson.build (revision a01070da)
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        'kvargs', # eal depends on kvargs
13        'telemetry', # basic info querying
14        'eal', # everything depends on eal
15        'ring',
16        'rcu', # rcu depends on ring
17        'mempool',
18        'mbuf',
19        'net',
20        'meter',
21        'ethdev',
22        'pci', # core
23        'cmdline',
24        'metrics', # bitrate/latency stats depends on this
25        'hash',    # efd depends on this
26        'timer',   # eventdev depends on this
27        'acl',
28        'bbdev',
29        'bitratestats',
30        'bpf',
31        'cfgfile',
32        'compressdev',
33        'cryptodev',
34        'distributor',
35        'efd',
36        'eventdev',
37        'gpudev',
38        'gro',
39        'gso',
40        'ip_frag',
41        'jobstats',
42        'kni',
43        'latencystats',
44        'lpm',
45        'member',
46        'pcapng',
47        'power',
48        'rawdev',
49        'regexdev',
50        'dmadev',
51        'rib',
52        'reorder',
53        'sched',
54        'security',
55        'stack',
56        'vhost',
57        'ipsec', # ipsec lib depends on net, crypto and security
58        'fib', #fib lib depends on rib
59        'port', # pkt framework libs which use other libs from above
60        'pdump', # pdump lib depends on bpf
61        'table',
62        'pipeline',
63        'flow_classify', # flow_classify lib depends on pkt framework table lib
64        'graph',
65        'node',
66]
67
68optional_libs = [
69        'bitratestats',
70        'cfgfile',
71        'flow_classify',
72        'gpudev',
73        'gro',
74        'gso',
75        'kni',
76        'jobstats',
77        'latencystats',
78        'metrics',
79        'node',
80        'pdump',
81        'pipeline',
82        'port',
83        'power',
84        'table',
85        'vhost',
86]
87
88disabled_libs = []
89opt_disabled_libs = run_command(list_dir_globs, get_option('disable_libs'),
90        check: true).stdout().split()
91foreach l:opt_disabled_libs
92    if not optional_libs.contains(l)
93        warning('Cannot disable mandatory library "@0@"'.format(l))
94        continue
95    endif
96    disabled_libs += l
97endforeach
98
99
100default_cflags = machine_args
101default_cflags += ['-DALLOW_EXPERIMENTAL_API']
102default_cflags += ['-DALLOW_INTERNAL_API']
103
104if cc.has_argument('-Wno-format-truncation')
105    default_cflags += '-Wno-format-truncation'
106endif
107
108enabled_libs = [] # used to print summary at the end
109
110foreach l:libraries
111    build = true
112    reason = '<unknown reason>' # set if build == false to explain why
113    name = l
114    use_function_versioning = false
115    sources = []
116    headers = []
117    indirect_headers = [] # public headers not directly included by apps
118    driver_sdk_headers = [] # public headers included by drivers
119    includes = []
120    cflags = default_cflags
121    objs = [] # other object files to link against, used e.g. for
122              # instruction-set optimized versions of code
123
124    # use "deps" for internal DPDK dependencies, and "ext_deps" for
125    # external package/library requirements
126    ext_deps = []
127    deps = []
128    # eal is standard dependency once built
129    if dpdk_conf.has('RTE_LIB_EAL')
130        deps += ['eal']
131    endif
132
133    if disabled_libs.contains(l)
134        build = false
135        reason = 'explicitly disabled via build config'
136    else
137        subdir(l)
138    endif
139    if name != l
140        warning('Library name, "@0@", and directory name, "@1@", do not match'.format(name, l))
141    endif
142
143    shared_deps = ext_deps
144    static_deps = ext_deps
145    foreach d:deps
146        if not build
147            break
148        endif
149        if not is_variable('shared_rte_' + d)
150            build = false
151            reason = 'missing internal dependency, "@0@"'.format(d)
152            message('Disabling @1@ [@2@]: missing internal dependency "@0@"'
153                    .format(d, name, 'lib/' + l))
154        else
155            shared_deps += [get_variable('shared_rte_' + d)]
156            static_deps += [get_variable('static_rte_' + d)]
157        endif
158    endforeach
159
160    if not build
161        dpdk_libs_disabled += name
162        set_variable(name.underscorify() + '_disable_reason', reason)
163        continue
164    endif
165
166    enabled_libs += name
167    dpdk_conf.set('RTE_LIB_' + name.to_upper(), 1)
168    install_headers(headers)
169    install_headers(indirect_headers)
170    if get_option('enable_driver_sdk')
171        install_headers(driver_sdk_headers)
172    endif
173    dpdk_chkinc_headers += headers
174
175    libname = 'rte_' + name
176    includes += include_directories(l)
177
178    if developer_mode and is_windows and use_function_versioning
179        message('@0@: Function versioning is not supported by Windows.'.format(name))
180    endif
181
182    if use_function_versioning
183        cflags += '-DRTE_USE_FUNCTION_VERSIONING'
184    endif
185    cflags += '-DRTE_LOG_DEFAULT_LOGTYPE=lib.' + l
186
187    # first build static lib
188    static_lib = static_library(libname,
189            sources,
190            objects: objs,
191            c_args: cflags,
192            dependencies: static_deps,
193            include_directories: includes,
194            install: true)
195    static_dep = declare_dependency(
196            include_directories: includes,
197            dependencies: static_deps)
198
199    if not use_function_versioning or is_windows
200        # use pre-build objects to build shared lib
201        sources = []
202        objs += static_lib.extract_all_objects(recursive: false)
203    else
204        # for compat we need to rebuild with
205        # RTE_BUILD_SHARED_LIB defined
206        cflags += '-DRTE_BUILD_SHARED_LIB'
207    endif
208    version_map = '@0@/@1@/version.map'.format(
209            meson.current_source_dir(), l)
210    implib = 'librte_' + l + '.dll.a'
211
212    def_file = custom_target(libname + '_def',
213            command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
214            input: version_map,
215            output: '@0@_exports.def'.format(libname))
216
217    mingw_map = custom_target(libname + '_mingw',
218            command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
219            input: version_map,
220            output: '@0@_mingw.map'.format(libname))
221
222    if is_ms_linker
223        lk_args = ['-Wl,/def:' + def_file.full_path()]
224        if meson.version().version_compare('<0.54.0')
225            lk_args += ['-Wl,/implib:lib\\' + implib]
226        endif
227    else
228        if is_windows
229            lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]
230        else
231            lk_args = ['-Wl,--version-script=' + version_map]
232        endif
233    endif
234
235    lk_deps = [version_map, def_file, mingw_map]
236    if developer_mode and not is_windows
237        # on unix systems check the output of the
238        # check-symbols.sh script, using it as a
239        # dependency of the .so build
240        lk_deps += custom_target(name + '.sym_chk',
241                command: [check_symbols,
242                    version_map, '@INPUT@'],
243                capture: true,
244                input: static_lib,
245                output: name + '.sym_chk')
246    endif
247
248    shared_lib = shared_library(libname,
249            sources,
250            objects: objs,
251            c_args: cflags,
252            dependencies: shared_deps,
253            include_directories: includes,
254            link_args: lk_args,
255            link_depends: lk_deps,
256            version: abi_version,
257            soversion: so_version,
258            install: true)
259    shared_dep = declare_dependency(link_with: shared_lib,
260            include_directories: includes,
261            dependencies: shared_deps)
262
263    dpdk_libraries = [shared_lib] + dpdk_libraries
264    dpdk_static_libraries = [static_lib] + dpdk_static_libraries
265
266    set_variable('shared_rte_' + name, shared_dep)
267    set_variable('static_rte_' + name, static_dep)
268    if developer_mode
269        message('lib/@0@: Defining dependency "@1@"'.format(l, name))
270    endif
271endforeach
272