meson: add support for the testsuite

Currently the stale tracking of modules/rootfs is non-existent and I
cannot quite find a way to fix that.

In addition, there is a long standing meson bug where the tests and by
extension their dependencies are always build even when annotated as
`build_by_default : false`. To workaround that, a new option is
introduced `build-tests`, defaulting to false.

Apart from that, all tests run and pass \o/

v2:
 - split from top-level meson.build to subdir one
 - add to EXTRA_DIST
 - scripts are in scripts/
 - add option to enable building tests
 - error out if building without tools

Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Link: https://github.com/kmod-project/kmod/pull/86
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
This commit is contained in:
Emil Velikov 2024-09-02 18:58:35 +01:00 committed by Lucas De Marchi
parent 4670f4b851
commit 555b091890
4 changed files with 146 additions and 0 deletions

View File

@ -19,6 +19,7 @@ export GCC_COLORS
EXTRA_DIST += \
meson.build \
meson_options.txt \
testsuite/meson.build \
scripts/kmod-symlink.sh
AM_CPPFLAGS = \

View File

@ -396,6 +396,17 @@ foreach tool : _tools
endif
endforeach
# ------------------------------------------------------------------------------
# TESTSUITE
# ------------------------------------------------------------------------------
if get_option('build-tests')
setup_modules = find_program('scripts/setup-modules.sh')
setup_rootfs = find_program('scripts/setup-rootfs.sh')
top_include = include_directories('.')
subdir('testsuite')
endif
summary({
'moduledir' : moduledir,
'prefix' : get_option('prefix'),
@ -410,6 +421,7 @@ summary({
'tools' : get_option('tools'),
'logging' : get_option('logging'),
'debug' : get_option('debug-messages'),
'build-tests' : get_option('build-tests'),
}, section : 'Options')
summary({

View File

@ -68,3 +68,13 @@ option(
value : false,
description : 'Enable debug messages. Default: false',
)
# XXX: workaround a meson bug, where the tests are always build even
# when explicitly annotated as "build_by_default: false"
# See: https://github.com/mesonbuild/meson/issues/2518
option(
'build-tests',
type : 'boolean',
value : false,
description : 'Always build the test suite. Default: false',
)

123
testsuite/meson.build Normal file
View File

@ -0,0 +1,123 @@
if not get_option('tools')
error('The test suite requires also building the tools')
endif
test_kmod_symlinks = []
foreach tool : _tools
test_kmod_symlinks += custom_target(
tool,
command : ['ln', '-sf', kmod, '@OUTPUT@'],
output : tool,
depends : kmod,
build_by_default : false,
)
endforeach
build_module_playground = custom_target(
'build-module-playground',
command : [
setup_modules,
meson.project_source_root(),
meson.project_build_root(),
'testsuite/module-playground', # do not prepend source/build root
moduledir,
],
output : 'bb-rootfs',
console : true,
build_always_stale : true, # TODO: only when the playground has changed
build_by_default : false,
)
create_rootfs = custom_target(
'create-rootfs',
command : [
setup_rootfs,
join_paths(meson.project_source_root(), 'testsuite/rootfs-pristine'),
join_paths(meson.project_build_root(), 'testsuite/rootfs'),
join_paths(meson.project_build_root(), 'testsuite/module-playground'),
join_paths(meson.project_build_root(), 'config.h'),
sysconfdir,
moduledir,
],
output : 'stamp-rootfs',
console : true,
depends : build_module_playground,
build_always_stale : true, # TODO: only when the rootfs has changed
build_by_default : false,
)
_test_override_mods = [
'delete_module',
'init_module',
'path',
'uname',
]
libdl = cc.find_library('dl')
test_override_mods = []
foreach mod : _test_override_mods
test_override_mods += shared_module(
mod,
files('@0@.c'.format(mod)),
include_directories : top_include,
dependencies : libdl,
link_with : [libshared, libkmod_internal],
gnu_symbol_visibility : 'hidden',
name_prefix : '',
build_rpath : '',
build_by_default : false,
)
endforeach
testsuite_c_args = [
'-DTESTSUITE_ROOTFS="@0@/testsuite/rootfs/"'.format(meson.project_build_root()),
'-DTOOLS_DIR="@0@/testsuite/"'.format(meson.project_build_root()),
'-DOVERRIDE_LIBDIR="@0@/testsuite/"'.format(meson.project_build_root()),
]
libtestsuite = static_library(
'testsuite',
files('testsuite.c'),
include_directories : top_include,
c_args : testsuite_c_args,
dependencies : cc.find_library('rt'),
build_by_default : false,
install : false,
)
_testsuite = [
'test-array',
'test-blacklist',
'test-dependencies',
'test-depmod',
'test-hash',
'test-init',
'test-initstate',
'test-list',
'test-loaded',
'test-modinfo',
'test-modprobe',
'test-new-module',
'test-scratchbuf',
'test-strbuf',
'test-testsuite',
'test-util',
'test-weakdep',
]
foreach input : _testsuite
test(
input,
executable(
input,
files('@0@.c'.format(input)),
include_directories : top_include,
c_args : testsuite_c_args,
link_with : [libshared, libkmod_internal, libtestsuite],
build_by_default : false,
),
depends : [test_kmod_symlinks, create_rootfs, test_override_mods],
)
endforeach