The option is generalized from a simple boolean switch that enables a fixed list to a list-of-patterns. The old value works, but is deprecated: -Dstandalone-binaries=true is translated to -Dstandalone-binaries=repart,report,tmpfiles,sysusers,shutdown. We could already build all normal executables as .standalone, but the installation only supported a small fixes subset. This wasn't flexible enough: - packagers might want to provide additional standalone binaries then the small subset that was already enabled - but at the same time, whenever new binaries were added to this subset, downstream packaging had to be adjusted in sync, at least in the case of Fedora, because otherwise we'd get a complaint about unexpected .standalone binaries in the temporary install root. With the new option, downstreams can just specify the binaries that they want to be installed in the .standalone variant. As usual with this type of change, the build dir must be reprovisioned.
467 lines
18 KiB
Meson
467 lines
18 KiB
Meson
# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
if conf.get('ENABLE_SYSUSERS') == 1
|
|
test_sysusers_sh = configure_file(
|
|
input : 'test-sysusers.sh.in',
|
|
output : 'test-sysusers.sh',
|
|
configuration : conf)
|
|
|
|
if want_tests != 'false'
|
|
exe = executables_by_name.get('systemd-sysusers')
|
|
test('test-sysusers',
|
|
test_sysusers_sh,
|
|
# https://github.com/mesonbuild/meson/issues/2681
|
|
args : exe.full_path(),
|
|
depends : exe,
|
|
env : test_env,
|
|
suite : 'sysusers')
|
|
|
|
if 'systemd-sysusers.standalone' in executables_by_name
|
|
exe = executables_by_name.get('systemd-sysusers.standalone')
|
|
test('test-sysusers.standalone',
|
|
test_sysusers_sh,
|
|
# https://github.com/mesonbuild/meson/issues/2681
|
|
args : exe.full_path(),
|
|
depends : exe,
|
|
env : test_env,
|
|
suite : 'sysusers')
|
|
endif
|
|
endif
|
|
|
|
if install_tests
|
|
install_data(test_sysusers_sh,
|
|
install_dir : unittestsdir)
|
|
install_subdir('test-sysusers',
|
|
exclude_files : '.gitattributes',
|
|
install_dir : testdata_dir)
|
|
endif
|
|
endif
|
|
|
|
############################################################
|
|
|
|
if want_tests != 'false' and conf.get('ENABLE_HWDB') == 1
|
|
exe = executables_by_name.get('systemd-hwdb')
|
|
test('hwdb-test',
|
|
files('hwdb-test.sh'),
|
|
suite : 'dist',
|
|
args : exe.full_path(),
|
|
depends : exe,
|
|
timeout : 90)
|
|
endif
|
|
|
|
############################################################
|
|
|
|
if want_tests != 'false'
|
|
systemctl = executables_by_name.get('systemctl')
|
|
systemd_id128 = executables_by_name.get('systemd-id128')
|
|
test('test-systemctl-enable',
|
|
files('test-systemctl-enable.sh'),
|
|
# https://github.com/mesonbuild/meson/issues/2681
|
|
args : [systemctl.full_path(),
|
|
systemd_id128.full_path()],
|
|
depends : [systemctl, systemd_id128],
|
|
suite : 'systemctl')
|
|
endif
|
|
|
|
############################################################
|
|
|
|
if want_tests != 'false' and conf.get('HAVE_BLKID') == 1
|
|
exe = executables_by_name.get('bootctl')
|
|
test('test-bootctl-json',
|
|
files('test-bootctl-json.sh'),
|
|
args : exe.full_path(),
|
|
depends : exe,
|
|
suite : 'boot')
|
|
endif
|
|
|
|
############################################################
|
|
|
|
if want_tests != 'false' and conf.get('ENABLE_TMPFILES') == 1
|
|
test_systemd_tmpfiles_py = files('test-systemd-tmpfiles.py')
|
|
exe = executables_by_name.get('systemd-tmpfiles')
|
|
test('test-systemd-tmpfiles',
|
|
test_systemd_tmpfiles_py,
|
|
args : exe.full_path(),
|
|
depends : exe,
|
|
suite : 'tmpfiles')
|
|
|
|
if 'systemd-tmpfiles.standalone' in executables_by_name
|
|
exe = executables_by_name.get('systemd-tmpfiles.standalone')
|
|
test('test-systemd-tmpfiles.standalone',
|
|
test_systemd_tmpfiles_py,
|
|
args : exe.full_path(),
|
|
depends : exe,
|
|
suite : 'tmpfiles')
|
|
endif
|
|
endif
|
|
|
|
############################################################
|
|
|
|
test_compare_versions_sh = files('test-compare-versions.sh')
|
|
if want_tests != 'false' and 'systemd-analyze' in executables_by_name
|
|
exe = executables_by_name.get('systemd-analyze')
|
|
test('test-compare-versions',
|
|
test_compare_versions_sh,
|
|
args : exe.full_path(),
|
|
depends : exe,
|
|
suite : 'test')
|
|
endif
|
|
if install_tests
|
|
install_data(test_compare_versions_sh,
|
|
install_dir : unittestsdir)
|
|
endif
|
|
|
|
############################################################
|
|
|
|
if want_tests != 'false'
|
|
test('rule-syntax-check',
|
|
files('rule-syntax-check.py'),
|
|
suite : 'dist',
|
|
args : all_rules)
|
|
|
|
exe = executables_by_name.get('udevadm')
|
|
test('udev-rules-check',
|
|
exe,
|
|
suite : 'udev',
|
|
args : ['verify', '--resolve-names=late', all_rules])
|
|
|
|
link_abi_targets = [libsystemd, libudev, libshared, libcore]
|
|
link_abi_targets += module_targets
|
|
foreach _, exe : executables_by_name
|
|
link_abi_targets += exe
|
|
endforeach
|
|
|
|
if conf.get('BUILD_MODE_DEVELOPER') == 1
|
|
test('test-link-abi',
|
|
files('test-link-abi.py'),
|
|
args : link_abi_targets,
|
|
depends : link_abi_targets,
|
|
suite : 'dist',
|
|
timeout : 120)
|
|
endif
|
|
endif
|
|
|
|
############################################################
|
|
|
|
if install_tests
|
|
install_data('run-unit-tests.py',
|
|
install_mode : 'rwxr-xr-x',
|
|
install_dir : testsdir)
|
|
|
|
install_data('integration-test-setup.sh',
|
|
install_mode : 'rwxr-xr-x',
|
|
install_dir : testdata_dir)
|
|
endif
|
|
|
|
############################################################
|
|
|
|
test_fstab_generator_sh = files('test-fstab-generator.sh')
|
|
if want_tests != 'false' and 'systemd-fstab-generator' in executables_by_name
|
|
exe = executables_by_name.get('systemd-fstab-generator')
|
|
test('test-fstab-generator',
|
|
test_fstab_generator_sh,
|
|
# https://github.com/mesonbuild/meson/issues/2681
|
|
args : exe.full_path(),
|
|
env : test_env,
|
|
depends : exe,
|
|
suite : 'fstab')
|
|
endif
|
|
if install_tests
|
|
install_data(test_fstab_generator_sh,
|
|
install_mode : 'rwxr-xr-x',
|
|
install_dir : unittestsdir)
|
|
endif
|
|
|
|
############################################################
|
|
|
|
test_network_generator_conversion_sh = files('test-network-generator-conversion.sh')
|
|
if want_tests != 'false'
|
|
exe = executables_by_name.get('systemd-network-generator')
|
|
test('test-network-generator-conversion',
|
|
test_network_generator_conversion_sh,
|
|
# https://github.com/mesonbuild/meson/issues/2681
|
|
args : exe.full_path(),
|
|
depends : exe,
|
|
suite : 'network')
|
|
endif
|
|
if install_tests
|
|
install_data(test_network_generator_conversion_sh,
|
|
install_mode : 'rwxr-xr-x',
|
|
install_dir : unittestsdir)
|
|
endif
|
|
|
|
############################################################
|
|
|
|
sys_script_py = files('sys-script.py')
|
|
test_udev_py = files('test-udev.py')
|
|
if want_tests != 'false'
|
|
exe = executables_by_name.get('test-udev-rule-runner')
|
|
test('test-udev',
|
|
test_udev_py,
|
|
args : ['-v'],
|
|
env : test_env + { 'UDEV_RULE_RUNNER' : exe.full_path() },
|
|
depends : exe,
|
|
timeout : 180,
|
|
suite : 'udev')
|
|
endif
|
|
if install_tests
|
|
install_data(
|
|
sys_script_py,
|
|
test_udev_py,
|
|
install_dir : unittestsdir)
|
|
endif
|
|
|
|
############################################################
|
|
|
|
rpm = find_program('rpm', required : false)
|
|
rpmspec = find_program('rpmspec', required : false)
|
|
|
|
if rpm.found() and rpmspec.found()
|
|
if want_tests != 'false'
|
|
test('test-rpm-macros',
|
|
files('test-rpm-macros.sh'),
|
|
suite : 'dist',
|
|
args : [meson.project_build_root()],
|
|
depends : rpm_depends)
|
|
endif
|
|
else
|
|
message('Skipping test-rpm-macros since rpm and/or rpmspec are not available')
|
|
endif
|
|
|
|
############################################################
|
|
|
|
if want_tests != 'false' and conf.get('HAVE_DMI') == 1
|
|
udev_dmi_memory_id_test = files('udev-dmi-memory-id-test.sh')
|
|
exe = executables_by_name.get('dmi_memory_id')
|
|
|
|
if git.found() and fs.is_dir(meson.project_source_root() / '.git')
|
|
out = run_command(
|
|
env, '-u', 'GIT_WORK_TREE',
|
|
git, '--git-dir=@0@/.git'.format(meson.project_source_root()),
|
|
'ls-files', ':/test/dmidecode-dumps/*.bin',
|
|
check: true)
|
|
else
|
|
out = run_command(
|
|
sh, '-c', 'cd "$1"; echo test/dmidecode-dumps/*.bin', '_', meson.project_source_root(),
|
|
check: true)
|
|
endif
|
|
|
|
foreach p : out.stdout().split()
|
|
source = meson.project_source_root() / p
|
|
test('dmidecode_' + fs.stem(p),
|
|
udev_dmi_memory_id_test,
|
|
suite : 'udev',
|
|
args : [exe.full_path(),
|
|
source,
|
|
source + '.txt'],
|
|
depends : exe)
|
|
endforeach
|
|
endif
|
|
|
|
############################################################
|
|
|
|
if want_tests != 'false' and conf.get('ENABLE_KERNEL_INSTALL') == 1
|
|
kernel_install = executables_by_name.get('kernel-install')
|
|
args = [kernel_install.full_path(), loaderentry_install.full_path(), uki_copy_install]
|
|
deps = [kernel_install, loaderentry_install]
|
|
if want_ukify and boot_stubs.length() > 0
|
|
args += [ukify.full_path(), ukify_install.full_path(), boot_stubs[0]]
|
|
deps += [ukify, ukify_install, boot_stubs[0]]
|
|
endif
|
|
|
|
test('test-kernel-install',
|
|
test_kernel_install_sh,
|
|
env : test_env,
|
|
args : args,
|
|
depends : deps,
|
|
suite : 'kernel-install')
|
|
endif
|
|
|
|
############################################################
|
|
|
|
test_dlopen_note_py = files('test-dlopen-note.py')
|
|
|
|
if want_dlopen_tests
|
|
foreach name, exe : executables_by_name
|
|
if name.endswith('.static') or name.endswith('.shared')
|
|
continue
|
|
endif
|
|
|
|
name_static = name + '.static'
|
|
if name + '.standalone' in executables_by_name
|
|
exe_shared = exe
|
|
exe_static = executables_by_name.get(name + '.standalone')
|
|
elif name + '.shared' in executables_by_name
|
|
exe_shared = executables_by_name.get(name + '.shared')
|
|
exe_static = exe
|
|
else
|
|
continue
|
|
endif
|
|
|
|
test(name,
|
|
test_dlopen_note_py,
|
|
env : test_env,
|
|
args : ['--shared', exe_shared.full_path(), '--static', exe_static.full_path()],
|
|
depends : [exe_shared, exe_static],
|
|
suite : 'dlopen')
|
|
endforeach
|
|
|
|
foreach name, lib : modules_by_name
|
|
if name.endswith('.standalone')
|
|
continue
|
|
endif
|
|
|
|
lib_static = modules_by_name.get(name + '.standalone', lib)
|
|
|
|
test('lib' + lib.name(),
|
|
test_dlopen_note_py,
|
|
env : test_env,
|
|
args : ['--shared', lib.full_path(), '--static', lib_static.full_path()],
|
|
depends : [lib, lib_static],
|
|
suite : 'dlopen')
|
|
endforeach
|
|
|
|
foreach lib : [libshared, libsystemd, libudev]
|
|
test('lib' + lib.name(),
|
|
test_dlopen_note_py,
|
|
env : test_env,
|
|
args : ['--shared', lib.full_path(), '--static', lib.full_path()],
|
|
depends : [lib],
|
|
suite : 'dlopen')
|
|
endforeach
|
|
endif
|
|
|
|
############################################################
|
|
|
|
if want_tests != 'false'
|
|
subdir('integration-tests')
|
|
endif
|
|
|
|
if install_tests
|
|
if meson.version().version_compare('<1.3.0')
|
|
if not rsync.found()
|
|
error('rsync is required to install the integration test data')
|
|
endif
|
|
|
|
rsync_r = rsync.full_path() + ' -rlpt --exclude .gitattributes -- "@0@" "${DESTDIR:-}@1@"'
|
|
endif
|
|
|
|
if meson.version().version_compare('>=1.3.0')
|
|
# Installing symlinks to directories is broken in install_subdir() so we exclude the
|
|
# standalone directory from install_subdir() and handle it manually.
|
|
# TODO: Remove when https://github.com/mesonbuild/meson/pull/14471 is available in all
|
|
# supported distributions.
|
|
install_subdir('integration-tests',
|
|
install_dir : testsdir,
|
|
exclude_directories : ['standalone'],
|
|
follow_symlinks : false)
|
|
install_emptydir(testsdir / 'integration-tests/standalone')
|
|
install_data('integration-tests/standalone/meson.build',
|
|
install_dir : testsdir / 'integration-tests/standalone')
|
|
install_symlink('integration-tests',
|
|
pointing_to : '..',
|
|
install_dir : testsdir / 'integration-tests/standalone')
|
|
else
|
|
meson.add_install_script(sh, '-c',
|
|
rsync_r.format(meson.current_source_dir() / 'integration-tests', testsdir))
|
|
endif
|
|
|
|
foreach integration_test : integration_tests
|
|
integration_test_unit_env = []
|
|
integration_test_extra_unit_properties = []
|
|
integration_test_extra_service_properties = []
|
|
|
|
foreach key, value : integration_test['configuration']['env']
|
|
integration_test_unit_env += [f'@key@=@value@']
|
|
endforeach
|
|
|
|
foreach key, value : integration_test['configuration']['unit']
|
|
integration_test_extra_unit_properties += [f'@key@=@value@']
|
|
endforeach
|
|
|
|
foreach key, value : integration_test['configuration']['service']
|
|
integration_test_extra_service_properties += [f'@key@=@value@']
|
|
endforeach
|
|
|
|
integration_test_unit = configure_file(
|
|
input : 'test.service.in',
|
|
output : '@0@.service'.format(integration_test['name']),
|
|
configuration : integration_test['configuration'] + {
|
|
'env' : ' '.join(integration_test_unit_env),
|
|
'unit' : '\n'.join(integration_test_extra_unit_properties),
|
|
'service' : '\n'.join(integration_test_extra_service_properties),
|
|
},
|
|
)
|
|
|
|
install_data(integration_test_unit, install_dir : testdata_dir / 'units')
|
|
endforeach
|
|
|
|
testdata_subdirs = [
|
|
'auxv',
|
|
'journal-data',
|
|
'knot-data',
|
|
'test-cgroup-mask',
|
|
'test-engine',
|
|
'test-execute',
|
|
'test-fstab-generator',
|
|
'test-journals',
|
|
'test-network',
|
|
'test-network-generator-conversion',
|
|
'test-path',
|
|
'test-path-util',
|
|
'test-sched-prio',
|
|
'test-umount',
|
|
'integration-tests/TEST-07-PID1/TEST-07-PID1.units',
|
|
'integration-tests/TEST-03-JOBS/TEST-03-JOBS.units',
|
|
'integration-tests/TEST-04-JOURNAL/TEST-04-JOURNAL.units',
|
|
'integration-tests/TEST-06-SELINUX/TEST-06-SELINUX.units',
|
|
'integration-tests/TEST-16-EXTEND-TIMEOUT/TEST-16-EXTEND-TIMEOUT.units',
|
|
'integration-tests/TEST-23-UNIT-FILE/TEST-23-UNIT-FILE.units',
|
|
'integration-tests/TEST-30-ONCLOCKCHANGE/TEST-30-ONCLOCKCHANGE.units',
|
|
'integration-tests/TEST-38-FREEZER/TEST-38-FREEZER.units',
|
|
'integration-tests/TEST-52-HONORFIRSTSHUTDOWN/TEST-52-HONORFIRSTSHUTDOWN.units',
|
|
'integration-tests/TEST-54-CREDS/TEST-54-CREDS.units',
|
|
'integration-tests/TEST-55-OOMD/TEST-55-OOMD.units',
|
|
'integration-tests/TEST-62-RESTRICT-IFACES/TEST-62-RESTRICT-IFACES.units',
|
|
'integration-tests/TEST-63-PATH/TEST-63-PATH.units',
|
|
'integration-tests/TEST-65-ANALYZE/TEST-65-ANALYZE.units',
|
|
'integration-tests/TEST-66-DEVICE-ISOLATION/TEST-66-DEVICE-ISOLATION.units',
|
|
'integration-tests/TEST-74-AUX-UTILS/TEST-74-AUX-UTILS.units',
|
|
'integration-tests/TEST-80-NOTIFYACCESS/TEST-80-NOTIFYACCESS.units',
|
|
'units',
|
|
]
|
|
|
|
foreach subdir : testdata_subdirs
|
|
# install_subdir() before meson 1.3.0 does not handle symlinks correctly (it follows them
|
|
# instead of copying the symlink) so we use rsync instead.
|
|
if meson.version().version_compare('>=1.3.0')
|
|
install_subdir(subdir,
|
|
exclude_files : ['.gitattributes'],
|
|
install_dir : testdata_dir,
|
|
follow_symlinks : false)
|
|
else
|
|
meson.add_install_script(sh, '-c',
|
|
rsync_r.format(meson.current_source_dir() / subdir, testdata_dir))
|
|
endif
|
|
endforeach
|
|
|
|
install_data(kbd_model_map,
|
|
install_dir : testdata_dir + '/test-keymap-util')
|
|
|
|
if conf.get('HAVE_ZSTD') == 1 and efi_arch != ''
|
|
install_subdir('test-bcd',
|
|
exclude_files : '.gitattributes',
|
|
install_dir : testdata_dir)
|
|
endif
|
|
install_subdir('test-resolve',
|
|
exclude_files : '.gitattributes',
|
|
install_dir : testdata_dir)
|
|
|
|
# The unit tests implemented as shell scripts expect to find testdata/
|
|
# in the directory where they are stored.
|
|
assert(fs.parent(unittestsdir) / 'testdata' == testdata_dir)
|
|
install_symlink('testdata',
|
|
pointing_to : '../testdata',
|
|
install_dir : unittestsdir)
|
|
endif
|