drivers: simplify main build file

As with the library meson.build file, we can use the "continue" keyword to
reduce the level of indentation used for the majority of the build file.
Since we are changing the whitespace indentation level, we also update the
body of the foreach loop to use the meson standard, 4-space indentation.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
This commit is contained in:
Bruce Richardson 2021-04-20 11:22:19 +01:00 committed by Thomas Monjalon
parent 6fc406593a
commit 6f8a1a4591

View File

@ -49,199 +49,193 @@ if cc.has_argument('-Wno-format-truncation')
endif endif
foreach subpath:subdirs foreach subpath:subdirs
drivers = [] drivers = []
std_deps = [] std_deps = []
# subpath can be either "class" or "class/driver" # subpath can be either "class" or "class/driver"
if subpath.contains('/') if subpath.contains('/')
driver_path = subpath.split('/') driver_path = subpath.split('/')
class = driver_path[0] class = driver_path[0]
drivers += driver_path[1] drivers += driver_path[1]
else else
class = subpath class = subpath
subdir(class) subdir(class)
endif endif
# save class name on first occurrence # save class name on first occurrence
if not dpdk_driver_classes.contains(class) if not dpdk_driver_classes.contains(class)
dpdk_driver_classes += class dpdk_driver_classes += class
endif endif
# get already enabled drivers of the same class # get already enabled drivers of the same class
enabled_drivers = get_variable(class + '_drivers', []) enabled_drivers = get_variable(class + '_drivers', [])
foreach drv:drivers foreach drv:drivers
drv_path = join_paths(class, drv) drv_path = join_paths(class, drv)
# set up empty variables used for build # set up empty variables used for build
build = true # set to false to disable, e.g. missing deps build = true # set to false to disable, e.g. missing deps
reason = '<unknown reason>' # set if build == false to explain reason = '<unknown reason>' # set if build == false to explain
name = drv name = drv
sources = [] sources = []
headers = [] headers = []
objs = [] objs = []
cflags = default_cflags cflags = default_cflags
includes = [include_directories(drv_path)] includes = [include_directories(drv_path)]
# set up internal deps. Drivers can append/override as necessary # set up internal deps. Drivers can append/override as necessary
deps = std_deps deps = std_deps
# ext_deps: Stores external library dependency got # ext_deps: Stores external library dependency got
# using dependency() (preferred) or find_library(). # using dependency() (preferred) or find_library().
# For the find_library() case (but not with dependency()) we also # For the find_library() case (but not with dependency()) we also
# need to specify the "-l" flags in pkgconfig_extra_libs variable # need to specify the "-l" flags in pkgconfig_extra_libs variable
# too, so that it can be reflected in the pkgconfig output for # too, so that it can be reflected in the pkgconfig output for
# static builds. # static builds.
ext_deps = [] ext_deps = []
pkgconfig_extra_libs = [] pkgconfig_extra_libs = []
if not enable_drivers.contains(drv_path) if not enable_drivers.contains(drv_path)
build = false build = false
reason = 'not in enabled drivers build config' reason = 'not in enabled drivers build config'
elif disable_drivers.contains(drv_path) elif disable_drivers.contains(drv_path)
if always_enable.contains(drv_path) if always_enable.contains(drv_path)
message('Driver @0@ cannot be disabled, not disabling.'.format(drv_path)) message('Driver @0@ cannot be disabled, not disabling.'.format(drv_path))
else else
build = false build = false
reason = 'explicitly disabled via build config' reason = 'explicitly disabled via build config'
endif endif
else else
# pull in driver directory which should update all the local variables # pull in driver directory which should update all the local variables
subdir(drv_path) subdir(drv_path)
endif endif
if build if build
# get dependency objs from strings # get dependency objs from strings
shared_deps = ext_deps shared_deps = ext_deps
static_deps = ext_deps static_deps = ext_deps
foreach d:deps foreach d:deps
if not is_variable('shared_rte_' + d) if not is_variable('shared_rte_' + d)
build = false build = false
reason = 'missing internal dependency, "@0@"'.format(d) reason = 'missing internal dependency, "@0@"'.format(d)
message('Disabling @1@ [@2@]: missing internal dependency "@0@"' message('Disabling @1@ [@2@]: missing internal dependency "@0@"'
.format(d, name, 'drivers/' + drv_path)) .format(d, name, 'drivers/' + drv_path))
else else
shared_deps += [get_variable('shared_rte_' + d)] shared_deps += [get_variable('shared_rte_' + d)]
static_deps += [get_variable('static_rte_' + d)] static_deps += [get_variable('static_rte_' + d)]
endif endif
endforeach endforeach
endif endif
if not build if not build
# some driver directories are placeholders which # some driver directories are placeholders which
# are never built, so we allow suppression of the # are never built, so we allow suppression of the
# component disable printout in those cases # component disable printout in those cases
if reason != '' if reason != ''
dpdk_drvs_disabled += drv_path dpdk_drvs_disabled += drv_path
set_variable(drv_path.underscorify() + set_variable(drv_path.underscorify() + '_disable_reason', reason)
'_disable_reason', reason) endif
endif continue
else endif
enabled_drivers += name
lib_name = '_'.join(['rte', class, name])
dpdk_conf.set(lib_name.to_upper(), 1)
dpdk_extra_ldflags += pkgconfig_extra_libs enabled_drivers += name
lib_name = '_'.join(['rte', class, name])
dpdk_conf.set(lib_name.to_upper(), 1)
install_headers(headers) dpdk_extra_ldflags += pkgconfig_extra_libs
# generate pmdinfo sources by building a temporary install_headers(headers)
# lib and then running pmdinfogen on the contents of
# that lib. The final lib reuses the object files and
# adds in the new source file.
out_filename = lib_name + '.pmd.c'
tmp_lib = static_library('tmp_' + lib_name,
sources,
include_directories: includes,
dependencies: static_deps,
c_args: cflags)
objs += tmp_lib.extract_all_objects()
sources = custom_target(out_filename,
command: [pmdinfo, tmp_lib.full_path(),
'@OUTPUT@', pmdinfogen],
output: out_filename,
depends: [tmp_lib])
# now build the static driver # generate pmdinfo sources by building a temporary
static_lib = static_library(lib_name, # lib and then running pmdinfogen on the contents of
sources, # that lib. The final lib reuses the object files and
objects: objs, # adds in the new source file.
include_directories: includes, out_filename = lib_name + '.pmd.c'
dependencies: static_deps, tmp_lib = static_library('tmp_' + lib_name, sources,
c_args: cflags, include_directories: includes,
install: true) dependencies: static_deps,
c_args: cflags)
objs += tmp_lib.extract_all_objects()
sources = custom_target(out_filename,
command: [pmdinfo, tmp_lib.full_path(), '@OUTPUT@', pmdinfogen],
output: out_filename,
depends: [tmp_lib])
# now build the shared driver # now build the static driver
version_map = '@0@/@1@/version.map'.format( static_lib = static_library(lib_name,
meson.current_source_dir(), sources,
drv_path) objects: objs,
implib = 'lib' + lib_name + '.dll.a' include_directories: includes,
dependencies: static_deps,
c_args: cflags,
install: true)
def_file = custom_target(lib_name + '_def', # now build the shared driver
command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'], version_map = '@0@/@1@/version.map'.format(meson.current_source_dir(), drv_path)
input: version_map, implib = 'lib' + lib_name + '.dll.a'
output: '@0@_exports.def'.format(lib_name))
mingw_map = custom_target(lib_name + '_mingw', def_file = custom_target(lib_name + '_def',
command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'], command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
input: version_map, input: version_map,
output: '@0@_mingw.map'.format(lib_name)) output: '@0@_exports.def'.format(lib_name))
lk_deps = [version_map, def_file, mingw_map] mingw_map = custom_target(lib_name + '_mingw',
if is_windows command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
if is_ms_linker input: version_map,
lk_args = ['-Wl,/def:' + def_file.full_path()] output: '@0@_mingw.map'.format(lib_name))
if meson.version().version_compare('<0.54.0')
lk_args += ['-Wl,/implib:drivers\\' + implib]
endif
else
lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]
endif
else
lk_args = ['-Wl,--version-script=' + version_map]
if developer_mode
# 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(lib_name + '.sym_chk',
command: [check_symbols,
version_map, '@INPUT@'],
capture: true,
input: static_lib,
output: lib_name + '.sym_chk')
endif
endif
shared_lib = shared_library(lib_name, lk_deps = [version_map, def_file, mingw_map]
sources, if is_windows
objects: objs, if is_ms_linker
include_directories: includes, lk_args = ['-Wl,/def:' + def_file.full_path()]
dependencies: shared_deps, if meson.version().version_compare('<0.54.0')
c_args: cflags, lk_args += ['-Wl,/implib:drivers\\' + implib]
link_args: lk_args, endif
link_depends: lk_deps, else
version: abi_version, lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]
soversion: so_version, endif
install: true, else
install_dir: driver_install_path) lk_args = ['-Wl,--version-script=' + version_map]
if developer_mode
# 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(lib_name + '.sym_chk',
command: [check_symbols, version_map, '@INPUT@'],
capture: true,
input: static_lib,
output: lib_name + '.sym_chk')
endif
endif
# create a dependency object and add it to the global dictionary so shared_lib = shared_library(lib_name, sources,
# testpmd or other built-in apps can find it if necessary objects: objs,
shared_dep = declare_dependency(link_with: shared_lib, include_directories: includes,
include_directories: includes, dependencies: shared_deps,
dependencies: shared_deps) c_args: cflags,
static_dep = declare_dependency( link_args: lk_args,
include_directories: includes, link_depends: lk_deps,
dependencies: static_deps) version: abi_version,
soversion: so_version,
install: true,
install_dir: driver_install_path)
dpdk_drivers += static_lib # create a dependency object and add it to the global dictionary so
# testpmd or other built-in apps can find it if necessary
shared_dep = declare_dependency(link_with: shared_lib,
include_directories: includes,
dependencies: shared_deps)
static_dep = declare_dependency(
include_directories: includes,
dependencies: static_deps)
set_variable('shared_@0@'.format(lib_name), shared_dep) dpdk_drivers += static_lib
set_variable('static_@0@'.format(lib_name), static_dep)
dependency_name = ''.join(lib_name.split('rte_'))
if developer_mode
message('drivers/@0@: Defining dependency "@1@"'.format(
drv_path, dependency_name))
endif
endif # build
endforeach
set_variable(class + '_drivers', enabled_drivers) set_variable('shared_@0@'.format(lib_name), shared_dep)
set_variable('static_@0@'.format(lib_name), static_dep)
dependency_name = ''.join(lib_name.split('rte_'))
if developer_mode
message('drivers/@0@: Defining dependency "@1@"'.format(
drv_path, dependency_name))
endif
endforeach
set_variable(class + '_drivers', enabled_drivers)
endforeach endforeach