xref: /dpdk/lib/meson.build (revision b232b2aa)
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    dpdk_chkinc_headers += driver_sdk_headers
175
176    libname = 'rte_' + name
177    includes += include_directories(l)
178
179    if developer_mode and is_windows and use_function_versioning
180        message('@0@: Function versioning is not supported by Windows.'.format(name))
181    endif
182
183    if use_function_versioning
184        cflags += '-DRTE_USE_FUNCTION_VERSIONING'
185    endif
186    cflags += '-DRTE_LOG_DEFAULT_LOGTYPE=lib.' + l
187
188    # first build static lib
189    static_lib = static_library(libname,
190            sources,
191            objects: objs,
192            c_args: cflags,
193            dependencies: static_deps,
194            include_directories: includes,
195            install: true)
196    static_dep = declare_dependency(
197            include_directories: includes,
198            dependencies: static_deps)
199
200    if not use_function_versioning or is_windows
201        # use pre-build objects to build shared lib
202        sources = []
203        objs += static_lib.extract_all_objects(recursive: false)
204    else
205        # for compat we need to rebuild with
206        # RTE_BUILD_SHARED_LIB defined
207        cflags += '-DRTE_BUILD_SHARED_LIB'
208    endif
209    version_map = '@0@/@1@/version.map'.format(
210            meson.current_source_dir(), l)
211    implib = 'librte_' + l + '.dll.a'
212
213    def_file = custom_target(libname + '_def',
214            command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
215            input: version_map,
216            output: '@0@_exports.def'.format(libname))
217
218    mingw_map = custom_target(libname + '_mingw',
219            command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
220            input: version_map,
221            output: '@0@_mingw.map'.format(libname))
222
223    if is_ms_linker
224        lk_args = ['-Wl,/def:' + def_file.full_path()]
225        if meson.version().version_compare('<0.54.0')
226            lk_args += ['-Wl,/implib:lib\\' + implib]
227        endif
228    else
229        if is_windows
230            lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]
231        else
232            lk_args = ['-Wl,--version-script=' + version_map]
233        endif
234    endif
235
236    lk_deps = [version_map, def_file, mingw_map]
237    if developer_mode and not is_windows
238        # on unix systems check the output of the
239        # check-symbols.sh script, using it as a
240        # dependency of the .so build
241        lk_deps += custom_target(name + '.sym_chk',
242                command: [check_symbols,
243                    version_map, '@INPUT@'],
244                capture: true,
245                input: static_lib,
246                output: name + '.sym_chk')
247    endif
248
249    shared_lib = shared_library(libname,
250            sources,
251            objects: objs,
252            c_args: cflags,
253            dependencies: shared_deps,
254            include_directories: includes,
255            link_args: lk_args,
256            link_depends: lk_deps,
257            version: abi_version,
258            soversion: so_version,
259            install: true)
260    shared_dep = declare_dependency(link_with: shared_lib,
261            include_directories: includes,
262            dependencies: shared_deps)
263
264    dpdk_libraries = [shared_lib] + dpdk_libraries
265    dpdk_static_libraries = [static_lib] + dpdk_static_libraries
266
267    set_variable('shared_rte_' + name, shared_dep)
268    set_variable('static_rte_' + name, static_dep)
269    if developer_mode
270        message('lib/@0@: Defining dependency "@1@"'.format(l, name))
271    endif
272endforeach
273