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