aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/interpreter.py3
-rwxr-xr-xrun_project_tests.py55
-rw-r--r--test cases/common/123 cpp and asm/meson.build3
-rw-r--r--test cases/common/127 custom target directory install/docgen.py5
4 files changed, 43 insertions, 23 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 2bd5992..eb3c5fe 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -2255,7 +2255,9 @@ class Interpreter(InterpreterBase):
self.build_def_files = [os.path.join(self.subdir, environment.build_filename)]
if not mock:
self.parse_project()
+ self._redetect_machines()
+ def _redetect_machines(self):
# Re-initialize machine descriptions. We can do a better job now because we
# have the compilers needed to gain more knowledge, so wipe out old
# inference and start over.
@@ -3075,6 +3077,7 @@ external dependencies (including libraries) must go to "dependencies".''')
success = self.add_languages_for(args, required, for_machine)
if not self.coredata.is_cross_build():
self.coredata.copy_build_options_from_regular_ones()
+ self._redetect_machines()
return success
def add_languages_for(self, args, required, for_machine: MachineChoice):
diff --git a/run_project_tests.py b/run_project_tests.py
index 3b20025..2ab6284 100755
--- a/run_project_tests.py
+++ b/run_project_tests.py
@@ -65,7 +65,7 @@ class BuildStep(Enum):
validate = 6
-class TestResult:
+class TestResult(BaseException):
def __init__(self, cicmds):
self.msg = '' # empty msg indicates test success
self.stdo = ''
@@ -421,6 +421,8 @@ def run_test(test: TestDef, extra_args, compiler, backend, flags, commands, shou
with AutoDeletedDir(tempfile.mkdtemp(prefix='i ', dir=os.getcwd())) as install_dir:
try:
return _run_test(test, build_dir, install_dir, extra_args, compiler, backend, flags, commands, should_fail)
+ except TestResult as r:
+ return r
finally:
mlog.shutdown() # Close the log file because otherwise Windows wets itself.
@@ -462,29 +464,39 @@ def _run_test(test: TestDef, test_build_dir: str, install_dir: str, extra_args,
testresult.fail('Generating the build system failed.')
return testresult
builddata = build.load(test_build_dir)
- # Touch the meson.build file to force a regenerate so we can test that
- # regeneration works before a build is run.
- ensure_backend_detects_changes(backend)
- os.utime(str(test.path / 'meson.build'))
- # Build with subprocess
dir_args = get_backend_args_for_dir(backend, test_build_dir)
- build_start = time.time()
- pc, o, e = Popen_safe(compile_commands + dir_args, cwd=test_build_dir)
- testresult.add_step(BuildStep.build, o, e, '', time.time() - build_start)
- if should_fail == 'build':
+
+ # Build with subprocess
+ def build_step():
+ build_start = time.time()
+ pc, o, e = Popen_safe(compile_commands + dir_args, cwd=test_build_dir)
+ testresult.add_step(BuildStep.build, o, e, '', time.time() - build_start)
+ if should_fail == 'build':
+ if pc.returncode != 0:
+ raise testresult
+ testresult.fail('Test that should have failed to build succeeded.')
+ raise testresult
if pc.returncode != 0:
- return testresult
- testresult.fail('Test that should have failed to build succeeded.')
- return testresult
- if pc.returncode != 0:
- testresult.fail('Compiling source code failed.')
- return testresult
- # Touch the meson.build file to force a regenerate so we can test that
- # regeneration works after a build is complete.
- ensure_backend_detects_changes(backend)
- os.utime(str(test.path / 'meson.build'))
- test_start = time.time()
+ testresult.fail('Compiling source code failed.')
+ raise testresult
+
+ # Touch the meson.build file to force a regenerate
+ def force_regenerate():
+ ensure_backend_detects_changes(backend)
+ os.utime(str(test.path / 'meson.build'))
+
+ # just test building
+ build_step()
+
+ # test that regeneration works for build step
+ force_regenerate()
+ build_step() # TBD: assert nothing gets built after the regenerate?
+
+ # test that regeneration works for test step
+ force_regenerate()
+
# Test in-process
+ test_start = time.time()
(returncode, tstdo, tstde, test_log) = run_test_inprocess(test_build_dir)
testresult.add_step(BuildStep.test, tstdo, tstde, test_log, time.time() - test_start)
if should_fail == 'test':
@@ -495,6 +507,7 @@ def _run_test(test: TestDef, test_build_dir: str, install_dir: str, extra_args,
if returncode != 0:
testresult.fail('Running unit tests failed.')
return testresult
+
# Do installation, if the backend supports it
if install_commands:
env = os.environ.copy()
diff --git a/test cases/common/123 cpp and asm/meson.build b/test cases/common/123 cpp and asm/meson.build
index cf064d0..ec7c466 100644
--- a/test cases/common/123 cpp and asm/meson.build
+++ b/test cases/common/123 cpp and asm/meson.build
@@ -1,4 +1,5 @@
-project('c++ and assembly test', 'cpp')
+project('c++ and assembly test')
+add_languages('cpp')
cpp = meson.get_compiler('cpp')
cpu = host_machine.cpu_family()
diff --git a/test cases/common/127 custom target directory install/docgen.py b/test cases/common/127 custom target directory install/docgen.py
index 245f370..97a3f90 100644
--- a/test cases/common/127 custom target directory install/docgen.py
+++ b/test cases/common/127 custom target directory install/docgen.py
@@ -5,7 +5,10 @@ import sys
out = sys.argv[1]
-os.mkdir(out)
+try:
+ os.mkdir(out)
+except FileExistsError:
+ pass
for name in ('a', 'b', 'c'):
with open(os.path.join(out, name + '.html'), 'w') as f: