summaryrefslogtreecommitdiff
path: root/lib/meson.build
blob: 595314d7d13099a4d8a936c6b2c29f6a3e120bd1 (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
# 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
	'eal', # everything depends on eal
	'cmdline', # ethdev depends on cmdline for parsing functions
	'ring', 'mempool', 'mbuf', 'net', 'meter', 'ethdev', 'pci', # core
	'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',
	'reorder', 'sched', 'security', 'stack', 'vhost',
	#ipsec lib depends on crypto and security
	'ipsec',
	# 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', 'telemetry']

if host_machine.system() == 'windows'
	libraries = ['kvargs','eal'] # only supported libraries for windows
endif

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

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

# -D_GNU_SOURCE unconditionally
default_cflags += '-D_GNU_SOURCE'

foreach l:libraries
	build = true
	name = l
	version = 1
	allow_experimental_apis = 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
		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
			shared_deps = ext_deps
			static_deps = ext_deps
			foreach d:deps
				if not is_variable('shared_rte_' + d)
					error('Missing dependency ' + d +
						' for library ' + libname)
				endif
				shared_deps += [get_variable('shared_rte_' + d)]
				static_deps += [get_variable('static_rte_' + d)]
			endforeach

			if allow_experimental_apis
				cflags += '-DALLOW_EXPERIMENTAL_API'
			endif

			if get_option('per_library_versions')
				lib_version = '@0@.1'.format(version)
				so_version = '@0@'.format(version)
			else
				lib_version = major_version
				so_version = major_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)

			# then use pre-build objects to build shared lib
			sources = []
			objs += static_lib.extract_all_objects(recursive: false)
			version_map = '@0@/@1@/rte_@2@_version.map'.format(
					meson.current_source_dir(), dir_name, name)
			exports = []
			implib = dir_name + '.dll.a'
			if host_machine.system() == 'windows'
				exports = '@0@/@1@/rte_@2@_exports.def'.format(
					meson.current_source_dir(), dir_name, name)
				lk_args = ['-Wl,/def:' + exports, '-Wl,/implib:lib\\' + implib]
			else
				lk_args = ['-Wl,--version-script=' + version_map]
			endif
			shared_lib = shared_library(libname,
					sources,
					objects: objs,
					c_args: cflags,
					dependencies: shared_deps,
					include_directories: includes,
					link_args: lk_args,
					link_depends: [version_map, exports],
					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
		endif # sources.length() > 0

		set_variable('shared_' + libname, shared_dep)
		set_variable('static_' + libname, static_dep)
	endif # if build
endforeach