xref: /dpdk/lib/meson.build (revision bb9cd910)
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 alphebetically 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        'kni',
70        'power',
71        'vhost',
72]
73
74disabled_libs = []
75opt_disabled_libs = run_command(list_dir_globs, get_option('disable_libs'),
76        check: true).stdout().split()
77foreach l:opt_disabled_libs
78    if not optional_libs.contains(l)
79        warning('Cannot disable mandatory library "@0@"'.format(l))
80        continue
81    endif
82    disabled_libs += l
83endforeach
84
85
86default_cflags = machine_args
87default_cflags += ['-DALLOW_EXPERIMENTAL_API']
88default_cflags += ['-DALLOW_INTERNAL_API']
89
90if cc.has_argument('-Wno-format-truncation')
91    default_cflags += '-Wno-format-truncation'
92endif
93
94enabled_libs = [] # used to print summary at the end
95
96foreach l:libraries
97    build = true
98    reason = '<unknown reason>' # set if build == false to explain why
99    name = l
100    use_function_versioning = false
101    sources = []
102    headers = []
103    indirect_headers = [] # public headers not directly included by apps
104    driver_sdk_headers = [] # public headers included by drivers
105    includes = []
106    cflags = default_cflags
107    objs = [] # other object files to link against, used e.g. for
108              # instruction-set optimized versions of code
109
110    # use "deps" for internal DPDK dependencies, and "ext_deps" for
111    # external package/library requirements
112    ext_deps = []
113    deps = []
114    # eal is standard dependency once built
115    if dpdk_conf.has('RTE_LIB_EAL')
116        deps += ['eal']
117    endif
118
119    if disabled_libs.contains(l)
120        build = false
121        reason = 'explicitly disabled via build config'
122    else
123        subdir(l)
124    endif
125    if name != l
126        warning('Library name, "@0@", and directory name, "@1@", do not match'.format(name, l))
127    endif
128
129    if not build
130        dpdk_libs_disabled += name
131        set_variable(name.underscorify() + '_disable_reason', reason)
132        continue
133    endif
134
135    shared_deps = ext_deps
136    static_deps = ext_deps
137    foreach d:deps
138        if not is_variable('shared_rte_' + d)
139            error('Missing internal dependency "@0@" for @1@ [@2@]'
140                    .format(d, name, 'lib/' + l))
141        endif
142        shared_deps += [get_variable('shared_rte_' + d)]
143        static_deps += [get_variable('static_rte_' + d)]
144    endforeach
145
146    enabled_libs += name
147    dpdk_conf.set('RTE_LIB_' + name.to_upper(), 1)
148    install_headers(headers)
149    install_headers(indirect_headers)
150    if get_option('enable_driver_sdk')
151        install_headers(driver_sdk_headers)
152    endif
153    dpdk_chkinc_headers += headers
154
155    libname = 'rte_' + name
156    includes += include_directories(l)
157
158    if developer_mode and is_windows and use_function_versioning
159        message('@0@: Function versioning is not supported by Windows.'.format(name))
160    endif
161
162    if use_function_versioning
163        cflags += '-DRTE_USE_FUNCTION_VERSIONING'
164    endif
165    cflags += '-DRTE_LOG_DEFAULT_LOGTYPE=lib.' + l
166
167    # first build static lib
168    static_lib = static_library(libname,
169            sources,
170            objects: objs,
171            c_args: cflags,
172            dependencies: static_deps,
173            include_directories: includes,
174            install: true)
175    static_dep = declare_dependency(
176            include_directories: includes,
177            dependencies: static_deps)
178
179    if not use_function_versioning or is_windows
180        # use pre-build objects to build shared lib
181        sources = []
182        objs += static_lib.extract_all_objects(recursive: false)
183    else
184        # for compat we need to rebuild with
185        # RTE_BUILD_SHARED_LIB defined
186        cflags += '-DRTE_BUILD_SHARED_LIB'
187    endif
188    version_map = '@0@/@1@/version.map'.format(
189            meson.current_source_dir(), l)
190    implib = 'librte_' + l + '.dll.a'
191
192    def_file = custom_target(libname + '_def',
193            command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
194            input: version_map,
195            output: '@0@_exports.def'.format(libname))
196
197    mingw_map = custom_target(libname + '_mingw',
198            command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
199            input: version_map,
200            output: '@0@_mingw.map'.format(libname))
201
202    if is_ms_linker
203        lk_args = ['-Wl,/def:' + def_file.full_path()]
204        if meson.version().version_compare('<0.54.0')
205            lk_args += ['-Wl,/implib:lib\\' + implib]
206        endif
207    else
208        if is_windows
209            lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]
210        else
211            lk_args = ['-Wl,--version-script=' + version_map]
212        endif
213    endif
214
215    lk_deps = [version_map, def_file, mingw_map]
216    if developer_mode and not is_windows
217        # on unix systems check the output of the
218        # check-symbols.sh script, using it as a
219        # dependency of the .so build
220        lk_deps += custom_target(name + '.sym_chk',
221                command: [check_symbols,
222                    version_map, '@INPUT@'],
223                capture: true,
224                input: static_lib,
225                output: name + '.sym_chk')
226    endif
227
228    shared_lib = shared_library(libname,
229            sources,
230            objects: objs,
231            c_args: cflags,
232            dependencies: shared_deps,
233            include_directories: includes,
234            link_args: lk_args,
235            link_depends: lk_deps,
236            version: abi_version,
237            soversion: so_version,
238            install: true)
239    shared_dep = declare_dependency(link_with: shared_lib,
240            include_directories: includes,
241            dependencies: shared_deps)
242
243    dpdk_libraries = [shared_lib] + dpdk_libraries
244    dpdk_static_libraries = [static_lib] + dpdk_static_libraries
245
246    set_variable('shared_rte_' + name, shared_dep)
247    set_variable('static_rte_' + name, static_dep)
248    if developer_mode
249        message('lib/@0@: Defining dependency "@1@"'.format(l, name))
250    endif
251endforeach
252