cryptodev: add asymmetric session user data API
[dpdk.git] / lib / meson.build
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.
11 libraries = [
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
68 optional_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
88 disabled_libs = []
89 opt_disabled_libs = run_command(list_dir_globs, get_option('disable_libs'),
90         check: true).stdout().split()
91 foreach 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
97 endforeach
98
99
100 default_cflags = machine_args
101 default_cflags += ['-DALLOW_EXPERIMENTAL_API']
102 default_cflags += ['-DALLOW_INTERNAL_API']
103
104 if cc.has_argument('-Wno-format-truncation')
105     default_cflags += '-Wno-format-truncation'
106 endif
107
108 enabled_libs = [] # used to print summary at the end
109
110 foreach 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
271 endforeach