aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2020-09-04 10:06:06 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2020-09-30 19:11:36 +0200
commit48a81fd5b42e854e6c4b70cec60e023db9675e33 (patch)
treeda312f82b74e4abefc15cb5c4944384fea9d05e4
parentfd5eef85fed024387d41adc4f7ca502c14ff62be (diff)
downloadqemu-48a81fd5b42e854e6c4b70cec60e023db9675e33.zip
qemu-48a81fd5b42e854e6c4b70cec60e023db9675e33.tar.gz
qemu-48a81fd5b42e854e6c4b70cec60e023db9675e33.tar.bz2
mtest2make: add support for introspected test dependencies
Right now all "make check" targets depend blindly on "all". If Meson is 0.56.0 or newer, we can use the correct dependencies using the new "depends" entry in "meson introspect --tests". Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--Makefile2
-rw-r--r--scripts/mtest2make.py19
2 files changed, 16 insertions, 5 deletions
diff --git a/Makefile b/Makefile
index 9af24f1..54fc1a9 100644
--- a/Makefile
+++ b/Makefile
@@ -78,7 +78,7 @@ ${ninja-targets-c_COMPILER} ${ninja-targets-cpp_COMPILER}: .var.command += -MP
# reread (and MESON won't be empty anymore).
ifneq ($(MESON),)
Makefile.mtest: build.ninja scripts/mtest2make.py
- $(MESON) introspect --tests --benchmarks | $(PYTHON) scripts/mtest2make.py > $@
+ $(MESON) introspect --targets --tests --benchmarks | $(PYTHON) scripts/mtest2make.py > $@
-include Makefile.mtest
endif
diff --git a/scripts/mtest2make.py b/scripts/mtest2make.py
index 9cbb2e3..c3489a4 100644
--- a/scripts/mtest2make.py
+++ b/scripts/mtest2make.py
@@ -5,6 +5,7 @@
# Author: Paolo Bonzini <pbonzini@redhat.com>
from collections import defaultdict
+import itertools
import json
import os
import shlex
@@ -36,7 +37,7 @@ SPEED = quick
introspect = json.load(sys.stdin)
i = 0
-def process_tests(test, suites):
+def process_tests(test, targets, suites):
global i
env = ' '.join(('%s=%s' % (shlex.quote(k), shlex.quote(v))
for k, v in test['env'].items()))
@@ -58,12 +59,19 @@ def process_tests(test, suites):
i += 1
if test['workdir'] is not None:
print('.test.dir.%d := %s' % (i, shlex.quote(test['workdir'])))
+
+ if 'depends' in test:
+ deps = (targets.get(x, []) for x in test['depends'])
+ deps = itertools.chain.from_iterable(deps)
+ else:
+ deps = ['all']
+
print('.test.name.%d := %s' % (i, test['name']))
print('.test.driver.%d := %s' % (i, driver))
print('.test.env.%d := $(.test.env) %s' % (i, env))
print('.test.cmd.%d := %s' % (i, cmd))
print('.PHONY: run-test-%d' % (i,))
- print('run-test-%d: all' % (i,))
+ print('run-test-%d: %s' % (i, ' '.join(deps)))
print('\t@$(call .test.run,%d,$(.test.output-format))' % (i,))
test_suites = test['suite'] or ['default']
@@ -102,16 +110,19 @@ def emit_suite(name, suite, prefix):
print('.tests += $(.test.$(SPEED).%s)' % (target, ))
print('endif')
+targets = {t['id']: [os.path.relpath(f) for f in t['filename']]
+ for t in introspect['targets']}
+
testsuites = defaultdict(Suite)
for test in introspect['tests']:
- process_tests(test, testsuites)
+ process_tests(test, targets, testsuites)
emit_prolog(testsuites, 'check')
for name, suite in testsuites.items():
emit_suite(name, suite, 'check')
benchsuites = defaultdict(Suite)
for test in introspect['benchmarks']:
- process_tests(test, benchsuites)
+ process_tests(test, targets, benchsuites)
emit_prolog(benchsuites, 'bench')
for name, suite in benchsuites.items():
emit_suite(name, suite, 'bench')