xref: /f-stack/dpdk/drivers/meson.build (revision d30ea906)
1# SPDX-License-Identifier: BSD-3-Clause
2# Copyright(c) 2017 Intel Corporation
3
4# Defines the order in which the drivers are buit.
5driver_classes = ['common',
6	       'bus',
7	       'mempool', # depends on common and bus.
8	       'net',     # depends on common, bus and mempool.
9	       'crypto',  # depends on common, bus and mempool (net in future).
10	       'compress', # depends on common, bus, mempool.
11	       'event',   # depends on common, bus, mempool and net.
12	       'baseband', # depends on common and bus.
13	       'raw']     # depends on common, bus, mempool, net and event.
14
15default_cflags = machine_args
16if cc.has_argument('-Wno-format-truncation')
17	default_cflags += '-Wno-format-truncation'
18endif
19
20# specify -D_GNU_SOURCE unconditionally
21default_cflags += '-D_GNU_SOURCE'
22
23foreach class:driver_classes
24	drivers = []
25	std_deps = []
26	config_flag_fmt = '' # format string used to set the value in dpdk_conf
27	driver_name_fmt = '' # format string for driver name, used to name
28	                     # the library, the dependency and to find the
29	                     # version file for linking
30
31	subdir(class)
32	class_drivers = []
33
34	foreach drv:drivers
35		drv_path = join_paths(class, drv)
36
37		# set up empty variables used for build
38		build = true # set to false to disable, e.g. missing deps
39		name = drv
40		version = 1
41		allow_experimental_apis = false
42		sources = []
43		objs = []
44		cflags = default_cflags
45		includes = [include_directories(drv_path)]
46		# set up internal deps. Drivers can append/override as necessary
47		deps = std_deps
48		# ext_deps: Stores external library dependency got
49		# using dependency() or cc.find_library(). For most cases, we
50		# probably also need to specify the "-l" flags in
51		# pkgconfig_extra_libs variable too, so that it can be reflected
52		# in the pkgconfig output for static builds
53		ext_deps = []
54		pkgconfig_extra_libs = []
55
56		# pull in driver directory which should assign to each of the above
57		subdir(drv_path)
58
59		if build
60			class_drivers += name
61
62			dpdk_conf.set(config_flag_fmt.format(name.to_upper()),1)
63			lib_name = driver_name_fmt.format(name)
64
65			if allow_experimental_apis
66				cflags += '-DALLOW_EXPERIMENTAL_API'
67			endif
68
69			# get dependency objs from strings
70			shared_objs = []
71			static_objs = []
72			foreach d:deps
73				if not is_variable('shared_rte_' + d)
74					error('Missing dependency ' + d +
75						' for driver ' + lib_name)
76				endif
77				shared_objs += [get_variable('shared_rte_' + d)]
78				static_objs += [get_variable('static_rte_' + d)]
79			endforeach
80			shared_objs += ext_deps
81			static_objs += ext_deps
82			dpdk_extra_ldflags += pkgconfig_extra_libs
83
84			# generate pmdinfo sources by building a temporary
85			# lib and then running pmdinfogen on the contents of
86			# that lib. The final lib reuses the object files and
87			# adds in the new source file.
88			out_filename = lib_name + '.pmd.c'
89			tmp_lib = static_library('tmp_' + lib_name,
90					sources,
91					include_directories: includes,
92					dependencies: static_objs,
93					c_args: cflags)
94			objs += tmp_lib.extract_all_objects()
95			sources = custom_target(out_filename,
96					command: [pmdinfo, tmp_lib.full_path(),
97						'@OUTPUT@', pmdinfogen],
98					output: out_filename,
99					depends: [pmdinfogen, tmp_lib])
100
101			if get_option('per_library_versions')
102				lib_version = '@[email protected]'.format(version)
103				so_version = '@0@'.format(version)
104			else
105				lib_version = major_version
106				so_version = major_version
107			endif
108
109			# now build the static driver
110			static_lib = static_library(lib_name,
111				sources,
112				objects: objs,
113				include_directories: includes,
114				dependencies: static_objs,
115				c_args: cflags,
116				install: true)
117
118			# now build the shared driver
119			version_map = '@0@/@1@/@2@_version.map'.format(
120					meson.current_source_dir(),
121					drv_path, lib_name)
122			shared_lib = shared_library(lib_name,
123				sources,
124				objects: objs,
125				include_directories: includes,
126				dependencies: shared_objs,
127				c_args: cflags,
128				link_args: '-Wl,--version-script=' + version_map,
129				link_depends: version_map,
130				version: lib_version,
131				soversion: so_version,
132				install: true,
133				install_dir: driver_install_path)
134
135			# create a dependency object and add it to the global dictionary so
136			# testpmd or other built-in apps can find it if necessary
137			shared_dep = declare_dependency(link_with: shared_lib,
138					include_directories: includes,
139					dependencies: shared_objs)
140			static_dep = declare_dependency(link_with: static_lib,
141					include_directories: includes,
142					dependencies: static_objs)
143
144			dpdk_drivers += static_lib
145
146			set_variable('shared_@0@'.format(lib_name), shared_dep)
147			set_variable('static_@0@'.format(lib_name), static_dep)
148		endif # build
149	endforeach
150
151	if meson.version().version_compare('>=0.47')
152		# prior to 0.47, set_variable can't take array params
153		set_variable(class + '_drivers', class_drivers)
154	endif
155endforeach
156