Every target declare its tests, and add them in global tcg_tests dictionary, indexed by target name. See comment for full description.
We make sure that if a user repeats a test several time it won't result in duplicated executables or tests. In next commits, we'll introduce what's needed to deal with that. A test is compiled from a single source file (and later, a single set of compile flags). We make sure dependencies are correctly handled by generating a depfile. Signed-off-by: Pierrick Bouvier <[email protected]> --- tests/meson.build | 2 +- tests/tcg/meson.build | 94 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 tests/tcg/meson.build diff --git a/tests/meson.build b/tests/meson.build index 9ba04bbedd3..5877d2f60b1 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -74,7 +74,7 @@ subdir('decode') if 'CONFIG_TCG' in config_all_accel subdir('fp') - subdir('tcg/plugins') + subdir('tcg') endif subdir('audio') diff --git a/tests/tcg/meson.build b/tests/tcg/meson.build new file mode 100644 index 00000000000..72d1a9f8986 --- /dev/null +++ b/tests/tcg/meson.build @@ -0,0 +1,94 @@ +env = find_program('env') + +tcg_tests = {} +# tcg_tests is a dictionary with following structure: +# +# { +# 'name_of_target': { +# 'cc': cross_compiler, +# 'folder': 'folder_for_test_src_files', +# 'qemu': emulators['qemu-...'], +# 'tests': [ +# { +# 'src_file': { +# } +# }, +# ... +# ] +# } +# } +# +# Every test executable, is built only once. +# Tests for a given src use the same executable by default, and their definition +# is guaranteed to be unique also. +# Default name is derived from src. + +# plugins come first, as we need to build the list +subdir('plugins') + +# Finally, we can create all test executables and test targets +foreach target, plan: tcg_tests + # Detect duplicated executables/tests, and report an error to force user to + # choose how to deal with it. + built_tests = {} + added_tests = {} + + # return a clear error if user mispell a target entry + foreach key, _ : plan + if key not in ['cc', 'folder', 'qemu', 'tests'] + error('unknown tcg test plan entry \'' + key + '\' for target ' + target) + endif + endforeach + + cc = plan['cc'] + folder = plan['folder'] + qemu = plan['qemu'] + tests = plan['tests'] + + foreach t : tests + foreach src, setup: t + # meson '/' operator drops left operand if right is an absolute path + src = folder / src + file = files(src) + test = fs.name(file) + exe_name = fs.stem(src) + + exe_name = target + '-' + exe_name + test_name = exe_name + + if test_name in added_tests + error('test ' + test_name + ' was already added: ' + + 'specify a different \'test_name\'') + endif + + # build executable if needed + if exe_name not in built_tests + exe = custom_target(exe_name, + input: file, + command: [cc, '@INPUT@', + '-o', '@OUTPUT@', '-static', + '-MMD', '-MF', '@DEPFILE@', + '-Wall', '-Werror', + '-O0', '-g', '-fno-strict-aliasing', + ], + depfile: exe_name + '.d', + output: exe_name + '.test', + build_by_default: false) + built_tests += {exe_name: exe} + endif + + depends = [] + + exe = built_tests[exe_name] + cmd = [qemu, exe] + + # some tests expect QEMU env var to be set + cmd = ['QEMU=' + qemu.full_path(), cmd] + + test(test_name, env, args: cmd, + depends: depends, + suite: ['tcg', 'tcg-' + target]) + added_tests += {test_name: true} + endforeach + endforeach +endforeach -- 2.43.0
