xref: /f-stack/dpdk/drivers/meson.build (revision 2d9fd380)
1d30ea906Sjfb8856606# SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang# Copyright(c) 2017-2019 Intel Corporation
34418919fSjohnjiang
4*2d9fd380Sjfb8856606# Defines the order of dependencies evaluation
5*2d9fd380Sjfb8856606subdirs = [
6*2d9fd380Sjfb8856606	'common',
7d30ea906Sjfb8856606	'bus',
8*2d9fd380Sjfb8856606	'common/mlx5', # depends on bus.
9*2d9fd380Sjfb8856606	'common/qat', # depends on bus.
10d30ea906Sjfb8856606	'mempool', # depends on common and bus.
114418919fSjohnjiang	'net',     # depends on common, bus, mempool
124418919fSjohnjiang	'raw',     # depends on common, bus and net.
13d30ea906Sjfb8856606	'crypto',  # depends on common, bus and mempool (net in future).
14d30ea906Sjfb8856606	'compress', # depends on common, bus, mempool.
15*2d9fd380Sjfb8856606	'regex', # depends on common, bus, regexdev.
16*2d9fd380Sjfb8856606	'vdpa',    # depends on common, bus and mempool.
17d30ea906Sjfb8856606	'event',   # depends on common, bus, mempool and net.
18*2d9fd380Sjfb8856606	'baseband', # depends on common and bus.
19*2d9fd380Sjfb8856606]
204418919fSjohnjiang
21*2d9fd380Sjfb8856606disabled_drivers = run_command(list_dir_globs, get_option('disable_drivers'),
22*2d9fd380Sjfb8856606		).stdout().split()
23d30ea906Sjfb8856606
24d30ea906Sjfb8856606default_cflags = machine_args
25*2d9fd380Sjfb8856606default_cflags += ['-DALLOW_EXPERIMENTAL_API']
26*2d9fd380Sjfb8856606default_cflags += ['-DALLOW_INTERNAL_API']
27*2d9fd380Sjfb8856606
28d30ea906Sjfb8856606if cc.has_argument('-Wno-format-truncation')
29d30ea906Sjfb8856606	default_cflags += '-Wno-format-truncation'
30d30ea906Sjfb8856606endif
31d30ea906Sjfb8856606
32*2d9fd380Sjfb8856606foreach subpath:subdirs
33d30ea906Sjfb8856606	drivers = []
34d30ea906Sjfb8856606	std_deps = []
35d30ea906Sjfb8856606	config_flag_fmt = '' # format string used to set the value in dpdk_conf
36d30ea906Sjfb8856606
37*2d9fd380Sjfb8856606	# subpath can be either "class" or "class/driver"
38*2d9fd380Sjfb8856606	if subpath.contains('/')
39*2d9fd380Sjfb8856606		driver_path = subpath.split('/')
40*2d9fd380Sjfb8856606		class = driver_path[0]
41*2d9fd380Sjfb8856606		drivers += driver_path[1]
42*2d9fd380Sjfb8856606	else
43*2d9fd380Sjfb8856606		class = subpath
44d30ea906Sjfb8856606		subdir(class)
45*2d9fd380Sjfb8856606	endif
46*2d9fd380Sjfb8856606
47*2d9fd380Sjfb8856606	# save class name on first occurrence
48*2d9fd380Sjfb8856606	if not dpdk_driver_classes.contains(class)
49*2d9fd380Sjfb8856606		dpdk_driver_classes += class
50*2d9fd380Sjfb8856606	endif
51*2d9fd380Sjfb8856606	# get already enabled drivers of the same class
52*2d9fd380Sjfb8856606	enabled_drivers = get_variable(class + '_drivers', [])
53d30ea906Sjfb8856606
54d30ea906Sjfb8856606	foreach drv:drivers
55d30ea906Sjfb8856606		drv_path = join_paths(class, drv)
56d30ea906Sjfb8856606
57d30ea906Sjfb8856606		# set up empty variables used for build
58d30ea906Sjfb8856606		build = true # set to false to disable, e.g. missing deps
594418919fSjohnjiang		reason = '<unknown reason>' # set if build == false to explain
60d30ea906Sjfb8856606		name = drv
61*2d9fd380Sjfb8856606		fmt_name = ''
62d30ea906Sjfb8856606		sources = []
63*2d9fd380Sjfb8856606		headers = []
64d30ea906Sjfb8856606		objs = []
65d30ea906Sjfb8856606		cflags = default_cflags
66d30ea906Sjfb8856606		includes = [include_directories(drv_path)]
67d30ea906Sjfb8856606		# set up internal deps. Drivers can append/override as necessary
68d30ea906Sjfb8856606		deps = std_deps
69d30ea906Sjfb8856606		# ext_deps: Stores external library dependency got
704418919fSjohnjiang		# using dependency() (preferred) or find_library().
714418919fSjohnjiang		# For the find_library() case (but not with dependency()) we also
724418919fSjohnjiang		# need to specify the "-l" flags in pkgconfig_extra_libs variable
734418919fSjohnjiang		# too, so that it can be reflected in the pkgconfig output for
744418919fSjohnjiang		# static builds.
75d30ea906Sjfb8856606		ext_deps = []
76d30ea906Sjfb8856606		pkgconfig_extra_libs = []
77d30ea906Sjfb8856606
78*2d9fd380Sjfb8856606		if disabled_drivers.contains(drv_path)
794418919fSjohnjiang			build = false
80*2d9fd380Sjfb8856606			reason = 'explicitly disabled via build config'
81*2d9fd380Sjfb8856606		else
82*2d9fd380Sjfb8856606			# pull in driver directory which should update all the local variables
83*2d9fd380Sjfb8856606			subdir(drv_path)
844418919fSjohnjiang		endif
85*2d9fd380Sjfb8856606
86d30ea906Sjfb8856606		if build
874418919fSjohnjiang			# get dependency objs from strings
884418919fSjohnjiang			shared_deps = ext_deps
894418919fSjohnjiang			static_deps = ext_deps
904418919fSjohnjiang			foreach d:deps
914418919fSjohnjiang				if not is_variable('shared_rte_' + d)
924418919fSjohnjiang					build = false
93*2d9fd380Sjfb8856606					reason = 'missing internal dependency, "@0@"'.format(d)
944418919fSjohnjiang					message('Disabling @1@ [@2@]: missing internal dependency "@0@"'
954418919fSjohnjiang							.format(d, name, 'drivers/' + drv_path))
964418919fSjohnjiang				else
974418919fSjohnjiang					shared_deps += [get_variable('shared_rte_' + d)]
984418919fSjohnjiang					static_deps += [get_variable('static_rte_' + d)]
994418919fSjohnjiang				endif
1004418919fSjohnjiang			endforeach
1014418919fSjohnjiang		endif
1024418919fSjohnjiang
1034418919fSjohnjiang		if not build
1044418919fSjohnjiang			# some driver directories are placeholders which
1054418919fSjohnjiang			# are never built, so we allow suppression of the
1064418919fSjohnjiang			# component disable printout in those cases
1074418919fSjohnjiang			if reason != ''
1084418919fSjohnjiang				dpdk_drvs_disabled += drv_path
1094418919fSjohnjiang				set_variable(drv_path.underscorify() +
1104418919fSjohnjiang						'_disable_reason', reason)
1114418919fSjohnjiang			endif
1124418919fSjohnjiang		else
113*2d9fd380Sjfb8856606			enabled_drivers += name
114*2d9fd380Sjfb8856606			lib_name = '_'.join(['rte', class, name])
115*2d9fd380Sjfb8856606			dpdk_conf.set(lib_name.to_upper(), 1)
116d30ea906Sjfb8856606
117*2d9fd380Sjfb8856606			if fmt_name == ''
118*2d9fd380Sjfb8856606				fmt_name = name
119*2d9fd380Sjfb8856606			endif
120d30ea906Sjfb8856606
121*2d9fd380Sjfb8856606			dpdk_conf.set(config_flag_fmt.format(fmt_name.to_upper()),1) #old-style macro
122*2d9fd380Sjfb8856606			# for driver compatibility, since we changed the
123*2d9fd380Sjfb8856606			# default to match that of make. Remove in future release
124*2d9fd380Sjfb8856606			# after following deprecation process
125*2d9fd380Sjfb8856606			if config_flag_fmt.contains('_PMD_@0@') and (class == 'crypto'
126*2d9fd380Sjfb8856606					or class == 'compress'
127*2d9fd380Sjfb8856606					or class == 'event')
128*2d9fd380Sjfb8856606				alt_flag_fmt = '_@0@_PMD'.join(
129*2d9fd380Sjfb8856606						config_flag_fmt.split('_PMD_@0@'))
130*2d9fd380Sjfb8856606				if config_flag_fmt.contains('EVENTDEV')
131*2d9fd380Sjfb8856606					alt_flag_fmt = '_@0@_EVENTDEV_PMD'.join(
132*2d9fd380Sjfb8856606						config_flag_fmt.split('_PMD_@0@_EVENTDEV'))
133*2d9fd380Sjfb8856606				endif
134*2d9fd380Sjfb8856606				dpdk_conf.set(alt_flag_fmt.format(
135*2d9fd380Sjfb8856606						fmt_name.to_upper()), 1)
136d30ea906Sjfb8856606			endif
137d30ea906Sjfb8856606
138d30ea906Sjfb8856606			dpdk_extra_ldflags += pkgconfig_extra_libs
139d30ea906Sjfb8856606
140*2d9fd380Sjfb8856606			install_headers(headers)
141*2d9fd380Sjfb8856606
142d30ea906Sjfb8856606			# generate pmdinfo sources by building a temporary
143d30ea906Sjfb8856606			# lib and then running pmdinfogen on the contents of
144d30ea906Sjfb8856606			# that lib. The final lib reuses the object files and
145d30ea906Sjfb8856606			# adds in the new source file.
146*2d9fd380Sjfb8856606			if not is_windows
147d30ea906Sjfb8856606				out_filename = lib_name + '.pmd.c'
148d30ea906Sjfb8856606				tmp_lib = static_library('tmp_' + lib_name,
149d30ea906Sjfb8856606						sources,
150d30ea906Sjfb8856606						include_directories: includes,
1514418919fSjohnjiang						dependencies: static_deps,
152d30ea906Sjfb8856606						c_args: cflags)
153d30ea906Sjfb8856606				objs += tmp_lib.extract_all_objects()
154d30ea906Sjfb8856606				sources = custom_target(out_filename,
155d30ea906Sjfb8856606						command: [pmdinfo, tmp_lib.full_path(),
156d30ea906Sjfb8856606							'@OUTPUT@', pmdinfogen],
157d30ea906Sjfb8856606						output: out_filename,
158d30ea906Sjfb8856606						depends: [pmdinfogen, tmp_lib])
159d30ea906Sjfb8856606			endif
160d30ea906Sjfb8856606
161d30ea906Sjfb8856606			# now build the static driver
162d30ea906Sjfb8856606			static_lib = static_library(lib_name,
163d30ea906Sjfb8856606				sources,
164d30ea906Sjfb8856606				objects: objs,
165d30ea906Sjfb8856606				include_directories: includes,
1664418919fSjohnjiang				dependencies: static_deps,
167d30ea906Sjfb8856606				c_args: cflags,
168d30ea906Sjfb8856606				install: true)
169d30ea906Sjfb8856606
170d30ea906Sjfb8856606			# now build the shared driver
171*2d9fd380Sjfb8856606			version_map = '@0@/@1@/version.map'.format(
172d30ea906Sjfb8856606					meson.current_source_dir(),
173*2d9fd380Sjfb8856606					drv_path)
1740c6bd470Sfengbojiang			implib = 'lib' + lib_name + '.dll.a'
1754418919fSjohnjiang
1764418919fSjohnjiang			def_file = custom_target(lib_name + '_def',
177*2d9fd380Sjfb8856606				command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
1784418919fSjohnjiang				input: version_map,
1794418919fSjohnjiang				output: '@0@_exports.def'.format(lib_name))
180*2d9fd380Sjfb8856606
181*2d9fd380Sjfb8856606			mingw_map = custom_target(lib_name + '_mingw',
182*2d9fd380Sjfb8856606				command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
183*2d9fd380Sjfb8856606				input: version_map,
184*2d9fd380Sjfb8856606				output: '@0@_mingw.map'.format(lib_name))
185*2d9fd380Sjfb8856606
186*2d9fd380Sjfb8856606			lk_deps = [version_map, def_file, mingw_map]
1874418919fSjohnjiang			if is_windows
1880c6bd470Sfengbojiang				if is_ms_linker
1890c6bd470Sfengbojiang					lk_args = ['-Wl,/def:' + def_file.full_path()]
1900c6bd470Sfengbojiang					if meson.version().version_compare('<0.54.0')
1910c6bd470Sfengbojiang						lk_args += ['-Wl,/implib:drivers\\' + implib]
1920c6bd470Sfengbojiang					endif
1930c6bd470Sfengbojiang				else
194*2d9fd380Sjfb8856606					lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]
1950c6bd470Sfengbojiang				endif
1964418919fSjohnjiang			else
1974418919fSjohnjiang				lk_args = ['-Wl,--version-script=' + version_map]
1984418919fSjohnjiang				# on unix systems check the output of the
199*2d9fd380Sjfb8856606				# check-symbols.sh script, using it as a
2004418919fSjohnjiang				# dependency of the .so build
201*2d9fd380Sjfb8856606				lk_deps += custom_target(lib_name + '.sym_chk',
202*2d9fd380Sjfb8856606					command: [check_symbols,
2034418919fSjohnjiang						version_map, '@INPUT@'],
2044418919fSjohnjiang					capture: true,
2054418919fSjohnjiang					input: static_lib,
206*2d9fd380Sjfb8856606					output: lib_name + '.sym_chk')
2074418919fSjohnjiang			endif
2084418919fSjohnjiang
209d30ea906Sjfb8856606			shared_lib = shared_library(lib_name,
210d30ea906Sjfb8856606				sources,
211d30ea906Sjfb8856606				objects: objs,
212d30ea906Sjfb8856606				include_directories: includes,
2134418919fSjohnjiang				dependencies: shared_deps,
214d30ea906Sjfb8856606				c_args: cflags,
2154418919fSjohnjiang				link_args: lk_args,
2164418919fSjohnjiang				link_depends: lk_deps,
217*2d9fd380Sjfb8856606				version: abi_version,
218d30ea906Sjfb8856606				soversion: so_version,
219d30ea906Sjfb8856606				install: true,
220d30ea906Sjfb8856606				install_dir: driver_install_path)
221d30ea906Sjfb8856606
222d30ea906Sjfb8856606			# create a dependency object and add it to the global dictionary so
223d30ea906Sjfb8856606			# testpmd or other built-in apps can find it if necessary
224d30ea906Sjfb8856606			shared_dep = declare_dependency(link_with: shared_lib,
225d30ea906Sjfb8856606					include_directories: includes,
2264418919fSjohnjiang					dependencies: shared_deps)
2270c6bd470Sfengbojiang			static_dep = declare_dependency(
228d30ea906Sjfb8856606					include_directories: includes,
2294418919fSjohnjiang					dependencies: static_deps)
230d30ea906Sjfb8856606
231d30ea906Sjfb8856606			dpdk_drivers += static_lib
232d30ea906Sjfb8856606
233d30ea906Sjfb8856606			set_variable('shared_@0@'.format(lib_name), shared_dep)
234d30ea906Sjfb8856606			set_variable('static_@0@'.format(lib_name), static_dep)
2354418919fSjohnjiang			dependency_name = ''.join(lib_name.split('rte_'))
2364418919fSjohnjiang			message('drivers/@0@: Defining dependency "@1@"'.format(
2374418919fSjohnjiang					drv_path, dependency_name))
238d30ea906Sjfb8856606		endif # build
239d30ea906Sjfb8856606	endforeach
240d30ea906Sjfb8856606
241*2d9fd380Sjfb8856606	set_variable(class + '_drivers', enabled_drivers)
242d30ea906Sjfb8856606endforeach
243