On Fri, 10 Jul 2026 09:19, Pierrick Bouvier <[email protected]>
wrote:
We directly move compiler requirements in test definition. This allows
to always declare all tests, and let the main loop filter the ones
that will be available.
Tested-by: Alex Bennée <[email protected]>
Signed-off-by: Pierrick Bouvier <[email protected]>
---
Reviewed-by: Manos Pitsidianakis <[email protected]>
tests/tcg/meson.build | 43 +++++++++++++++++++++++++++++++++++++------
1 file changed, 37 insertions(+), 6 deletions(-)
diff --git a/tests/tcg/meson.build b/tests/tcg/meson.build
index 05d54093709..26eb17fe17a 100644
--- a/tests/tcg/meson.build
+++ b/tests/tcg/meson.build
@@ -20,6 +20,10 @@ tcg_tests = {}
# {
# 'name_of_target': {
# 'cc': cross_compiler,
+# 'cc_feat_cflags': {
+# 'name': ['feature cflags'],
+# ...
+# },
# 'folder': 'folder_for_test_src_files',
# 'gdb_arch': 'gdb architecture requirement',
# 'qemu': emulators['qemu-...'],
@@ -29,6 +33,7 @@ tcg_tests = {}
# 'exe_name': ['provide an alternative binary name'],
# 'test_name': ['provide an alternative test name'],
# 'cflags': ['additional cflags to compile test', ...],
+# 'cc_feat': 'feature name, must be present in cc_feat_cflags',
# 'qemu_args': ['qemu command line flags', ...],
# 'expected_output': 'file_to_compare_output',
# 'gdb_test': ['gdb test args'],
@@ -74,10 +79,11 @@ foreach target, plan: tcg_tests
# choose how to deal with it.
built_tests = {}
added_tests = {}
+ cc_has_feat = {}
# return a clear error if user misspell a target entry
foreach key, _ : plan
- allowed = ['cc', 'folder', 'gdb_arch', 'qemu', 'tests']
+ allowed = ['cc', 'cc_feat_cflags', 'folder', 'gdb_arch', 'qemu', 'tests']
if key not in allowed
error('unknown tcg test plan entry \'' + key + '\' for target ' + target +
' (possible: [' + ', '.join(allowed) + '])')
@@ -88,13 +94,17 @@ foreach target, plan: tcg_tests
folder = plan['folder']
gdb_arch = plan['gdb_arch']
qemu = plan['qemu']
+ cc_feat_cflags = {}
+ if 'cc_feat_cflags' in plan
+ cc_feat_cflags = plan['cc_feat_cflags']
+ endif
tests = plan['tests']
foreach t : tests
foreach src, setup: t
# return a clear error if user misspell a setup entry
foreach key, _ : setup
- allowed = ['exe_name', 'env_var', 'expected_output', 'cflags',
+ allowed = ['exe_name', 'env_var', 'expected_output', 'cc_feat',
'cflags',
'gdb_test', 'plugin_test', 'qemu_args', 'test_name',
'wrapper']
if key not in allowed
@@ -155,15 +165,36 @@ foreach target, plan: tcg_tests
'specify a different \'test_name\'')
endif
+ if 'cflags' in setup or 'cc_feat' in setup
+ if exe_name in built_tests
+ error('test ' + exe_name +
+ ' was already built with cflags or cc_feat:' +
+ ' remove cflags, cc_feat, or set \'exe_name\'' +
+ ' (if cflags are different)')
+ endif
+ endif
+
cflags = []
if 'cflags' in setup
- if exe_name in built_tests
- error('test ' + exe_name + ' was already built with cflags: ' +
- 'remove cflags or set \'exe_name\' (if cflags are different)')
- endif
cflags = setup['cflags']
endif
+ if 'cc_feat' in setup
+ cc_feat = setup['cc_feat']
+ if cc_feat not in cc_has_feat
+ cmd = run_command([cc, cc_check_args, cc_feat_cflags[cc_feat]],
+ check: false)
+ avail = cmd.returncode() == 0
+ cc_has_feat += {cc_feat: avail}
+ endif
+
+ if not cc_has_feat[cc_feat]
+ skip_test = 'compiler feature ' + cc_feat + ' not supported'
+ built_tests += {exe_name: exe_name}
+ endif
+ cflags += cc_feat_cflags[cc_feat]
+ endif
+
# build executable if needed
if exe_name not in built_tests
exe = custom_target(exe_name,
--
2.47.3