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]> Reviewed-by: Manos Pitsidianakis <[email protected]> Signed-off-by: Pierrick Bouvier <[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 7b60ea53825..4487d61ef6c 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
