Merge pull request #6636 from jon-turney/machine-detection-problems

Redetect machines when languages change
pull/6815/head
Jussi Pakkanen 5 years ago committed by GitHub
commit 84e216fd64
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      mesonbuild/interpreter.py
  2. 55
      run_project_tests.py
  3. 3
      test cases/common/123 cpp and asm/meson.build
  4. 5
      test cases/common/127 custom target directory install/docgen.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):

@ -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()

@ -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()

@ -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:

Loading…
Cancel
Save