ソースを参照

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>
Paolo Bonzini 5 年 前
コミット
48a81fd5b4
2 ファイル変更16 行追加5 行削除
  1. 1 1
      Makefile
  2. 15 4
      scripts/mtest2make.py

+ 1 - 1
Makefile

@@ -78,7 +78,7 @@ ${ninja-targets-c_COMPILER} ${ninja-targets-cpp_COMPILER}: .var.command += -MP
 # reread (and MESON won't be empty anymore).
 # reread (and MESON won't be empty anymore).
 ifneq ($(MESON),)
 ifneq ($(MESON),)
 Makefile.mtest: build.ninja scripts/mtest2make.py
 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
 -include Makefile.mtest
 endif
 endif
 
 

+ 15 - 4
scripts/mtest2make.py

@@ -5,6 +5,7 @@
 # Author: Paolo Bonzini <pbonzini@redhat.com>
 # Author: Paolo Bonzini <pbonzini@redhat.com>
 
 
 from collections import defaultdict
 from collections import defaultdict
+import itertools
 import json
 import json
 import os
 import os
 import shlex
 import shlex
@@ -36,7 +37,7 @@ def __init__(self):
 introspect = json.load(sys.stdin)
 introspect = json.load(sys.stdin)
 i = 0
 i = 0
 
 
-def process_tests(test, suites):
+def process_tests(test, targets, suites):
     global i
     global i
     env = ' '.join(('%s=%s' % (shlex.quote(k), shlex.quote(v))
     env = ' '.join(('%s=%s' % (shlex.quote(k), shlex.quote(v))
                     for k, v in test['env'].items()))
                     for k, v in test['env'].items()))
@@ -58,12 +59,19 @@ def process_tests(test, suites):
     i += 1
     i += 1
     if test['workdir'] is not None:
     if test['workdir'] is not None:
         print('.test.dir.%d := %s' % (i, shlex.quote(test['workdir'])))
         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.name.%d := %s' % (i, test['name']))
     print('.test.driver.%d := %s' % (i, driver))
     print('.test.driver.%d := %s' % (i, driver))
     print('.test.env.%d := $(.test.env) %s' % (i, env))
     print('.test.env.%d := $(.test.env) %s' % (i, env))
     print('.test.cmd.%d := %s' % (i, cmd))
     print('.test.cmd.%d := %s' % (i, cmd))
     print('.PHONY: run-test-%d' % (i,))
     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,))
     print('\t@$(call .test.run,%d,$(.test.output-format))' % (i,))
 
 
     test_suites = test['suite'] or ['default']
     test_suites = test['suite'] or ['default']
@@ -102,16 +110,19 @@ def emit_suite(name, suite, prefix):
     print('.tests += $(.test.$(SPEED).%s)' % (target, ))
     print('.tests += $(.test.$(SPEED).%s)' % (target, ))
     print('endif')
     print('endif')
 
 
+targets = {t['id']: [os.path.relpath(f) for f in t['filename']]
+           for t in introspect['targets']}
+
 testsuites = defaultdict(Suite)
 testsuites = defaultdict(Suite)
 for test in introspect['tests']:
 for test in introspect['tests']:
-    process_tests(test, testsuites)
+    process_tests(test, targets, testsuites)
 emit_prolog(testsuites, 'check')
 emit_prolog(testsuites, 'check')
 for name, suite in testsuites.items():
 for name, suite in testsuites.items():
     emit_suite(name, suite, 'check')
     emit_suite(name, suite, 'check')
 
 
 benchsuites = defaultdict(Suite)
 benchsuites = defaultdict(Suite)
 for test in introspect['benchmarks']:
 for test in introspect['benchmarks']:
-    process_tests(test, benchsuites)
+    process_tests(test, targets, benchsuites)
 emit_prolog(benchsuites, 'bench')
 emit_prolog(benchsuites, 'bench')
 for name, suite in benchsuites.items():
 for name, suite in benchsuites.items():
     emit_suite(name, suite, 'bench')
     emit_suite(name, suite, 'bench')