summaryrefslogtreecommitdiffstats
path: root/src/spdk/dpdk/lib/meson.build
blob: d190d84effafe6c239743d1438d0ac00e44a426c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2017-2019 Intel Corporation


# process all libraries equally, as far as possible
# "core" libs first, then others alphebetically as far as possible
# NOTE: for speed of meson runs, the dependencies in the subdirectories
# sometimes skip deps that would be implied by others, e.g. if mempool is
# given as a dep, no need to mention ring. This is especially true for the
# core libs which are widely reused, so their deps are kept to a minimum.
libraries = [
	'kvargs', # eal depends on kvargs
	'telemetry', # basic info querying
	'eal', # everything depends on eal
	'ring',
	'rcu', # rcu depends on ring
	'mempool', 'mbuf', 'net', 'meter', 'ethdev', 'pci', # core
	'cmdline',
	'metrics', # bitrate/latency stats depends on this
	'hash',    # efd depends on this
	'timer',   # eventdev depends on this
	'acl', 'bbdev', 'bitratestats', 'cfgfile',
	'compressdev', 'cryptodev',
	'distributor', 'efd', 'eventdev',
	'gro', 'gso', 'ip_frag', 'jobstats',
	'kni', 'latencystats', 'lpm', 'member',
	'power', 'pdump', 'rawdev',
	'rib', 'reorder', 'sched', 'security', 'stack', 'vhost',
	# ipsec lib depends on net, crypto and security
	'ipsec',
	#fib lib depends on rib
	'fib',
	# add pkt framework libs which use other libs from above
	'port', 'table', 'pipeline',
	# flow_classify lib depends on pkt framework table lib
	'flow_classify', 'bpf', 'graph', 'node']

if is_windows
	libraries = ['kvargs','eal'] # only supported libraries for windows
endif

default_cflags = machine_args
default_cflags += ['-DALLOW_EXPERIMENTAL_API']
default_cflags += ['-DALLOW_INTERNAL_API']

if cc.has_argument('-Wno-format-truncation')
	default_cflags += '-Wno-format-truncation'
endif

enabled_libs = [] # used to print summary at the end

foreach l:libraries
	build = true
	reason = '<unknown reason>' # set if build == false to explain why
	name = l
	use_function_versioning = false
	sources = []
	headers = []
	includes = []
	cflags = default_cflags
	objs = [] # other object files to link against, used e.g. for
	          # instruction-set optimized versions of code

	# use "deps" for internal DPDK dependencies, and "ext_deps" for
	# external package/library requirements
	ext_deps = []
	deps = []
	# eal is standard dependency once built
	if dpdk_conf.has('RTE_LIBRTE_EAL')
		deps += ['eal']
	endif

	dir_name = 'librte_' + l
	subdir(dir_name)

	if build
		shared_deps = ext_deps
		static_deps = ext_deps
		foreach d:deps
			if not is_variable('shared_rte_' + d)
				error('Missing internal dependency "@0@" for @1@ [@2@]'
						.format(d, name, 'lib/' + dir_name))
			endif
			shared_deps += [get_variable('shared_rte_' + d)]
			static_deps += [get_variable('static_rte_' + d)]
		endforeach
	endif

	if not build
		dpdk_libs_disabled += name
		set_variable(name.underscorify() + '_disable_reason', reason)
	else
		enabled_libs += name
		dpdk_conf.set('RTE_LIBRTE_' + name.to_upper(), 1)
		install_headers(headers)

		libname = 'rte_' + name
		includes += include_directories(dir_name)

		if sources.length() == 0
			# if no C files, just set a dependency on header path
			shared_dep = declare_dependency(include_directories: includes)
			static_dep = shared_dep
		else

			if use_function_versioning
				cflags += '-DRTE_USE_FUNCTION_VERSIONING'
			endif

			version_map = '@0@/@1@/rte_@2@_version.map'.format(
					meson.current_source_dir(), dir_name, name)

			is_stable = run_command(is_stable_cmd,
					files(version_map)).returncode() == 0

			if is_stable
				lib_version = abi_version
				so_version = stable_so_version
			else
				lib_version = experimental_abi_version
				so_version = experimental_so_version
			endif

			# first build static lib
			static_lib = static_library(libname,
					sources,
					objects: objs,
					c_args: cflags,
					dependencies: static_deps,
					include_directories: includes,
					install: true)
			static_dep = declare_dependency(link_with: static_lib,
					include_directories: includes,
					dependencies: static_deps)

			if not use_function_versioning
				# use pre-build objects to build shared lib
				sources = []
				objs += static_lib.extract_all_objects(recursive: false)
			else
				# for compat we need to rebuild with
				# RTE_BUILD_SHARED_LIB defined
				cflags += '-DRTE_BUILD_SHARED_LIB'
			endif
			version_map = '@0@/@1@/rte_@2@_version.map'.format(
					meson.current_source_dir(), dir_name, name)
			implib = dir_name + '.dll.a'

			def_file = custom_target(name + '_def',
				command: [map_to_def_cmd, '@INPUT@', '@OUTPUT@'],
				input: version_map,
				output: 'rte_@0@_exports.def'.format(name))

			if is_ms_linker
				lk_args = ['-Wl,/def:' + def_file.full_path(),
					'-Wl,/implib:lib\\' + implib]
			else
				lk_args = ['-Wl,--version-script=' + version_map]
			endif

			lk_deps = [version_map, def_file]
			if not is_windows
				# on unix systems check the output of the
				# check-symbols.sh script, using it as a
				# dependency of the .so build
				lk_deps += custom_target(name + '.sym_chk',
					command: [check_symbols,
						version_map, '@INPUT@'],
					capture: true,
					input: static_lib,
					output: name + '.sym_chk')
			endif

			shared_lib = shared_library(libname,
					sources,
					objects: objs,
					c_args: cflags,
					dependencies: shared_deps,
					include_directories: includes,
					link_args: lk_args,
					link_depends: lk_deps,
					version: lib_version,
					soversion: so_version,
					install: true)
			shared_dep = declare_dependency(link_with: shared_lib,
					include_directories: includes,
					dependencies: shared_deps)

			dpdk_libraries = [shared_lib] + dpdk_libraries
			dpdk_static_libraries = [static_lib] + dpdk_static_libraries
			if libname == 'rte_node'
				dpdk_graph_nodes = [static_lib]
			endif
		endif # sources.length() > 0

		set_variable('shared_rte_' + name, shared_dep)
		set_variable('static_rte_' + name, static_dep)
		message('lib/@0@: Defining dependency "@1@"'.format(
				dir_name, name))
	endif # if build
endforeach