diff --git a/mesonbuild/compilers/detect.py b/mesonbuild/compilers/detect.py index c081638166da..6c35a2952ade 100644 --- a/mesonbuild/compilers/detect.py +++ b/mesonbuild/compilers/detect.py @@ -8,7 +8,7 @@ search_version, is_windows, Popen_safe, Popen_safe_logged, version_compare, windows_proof_rm, ) from ..programs import ExternalProgram -from ..envconfig import BinaryTable, detect_cpu_family, detect_machine_info +from ..envconfig import BinaryTable, detect_cpu_family from .. import mlog from ..linkers import guess_win_linker, guess_nix_linker @@ -1329,6 +1329,8 @@ def detect_nasm_compiler(env: 'Environment', for_machine: MachineChoice) -> Comp # We need a C compiler to properly detect the machine info and linker cc = detect_c_compiler(env, for_machine) + if not env.is_cross_build(for_machine): + env.update_build_machine({'c': cc}) popen_exceptions: T.Dict[str, Exception] = {} for comp in compilers: @@ -1369,9 +1371,9 @@ def detect_masm_compiler(env: 'Environment', for_machine: MachineChoice) -> Comp # We need a C compiler to properly detect the machine info and linker cc = detect_c_compiler(env, for_machine) if not env.is_cross_build(for_machine): - info = detect_machine_info({'c': cc}) - else: - info = env.machines[for_machine] + env.update_build_machine({'c': cc}) + + info = env.machines[for_machine] from .asm import MasmCompiler, MasmARMCompiler comp_class: T.Type[ASMCompiler] @@ -1411,6 +1413,8 @@ def detect_linearasm_compiler(env: Environment, for_machine: MachineChoice) -> C comp_class: T.Type[ASMCompiler] = TILinearAsmCompiler arg = '-h' cc = detect_c_compiler(env, for_machine) + if not env.is_cross_build(for_machine): + env.update_build_machine({'c': cc}) popen_exceptions: T.Dict[str, Exception] = {} try: diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index f1d55cc0f24c..820e2ba94f8d 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -613,3 +613,14 @@ def add_lang_args(self, lang: str, comp: T.Type['Compiler'], # This is how autotools works, and the env vars feature is for # autotools compatibility. largs.extend_value(comp_options) + + def update_build_machine(self, compilers: T.Optional[T.Dict[str, Compiler]] = None) -> None: + """Redetect the build machine and update the machine definitions + + :compilers: An optional dictionary of compilers to use instead of the coredata dict. + """ + compilers = compilers or self.coredata.compilers.build + + machines = self.machines.miss_defaulting() + machines.build = detect_machine_info(compilers) + self.machines = machines.default_missing() diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 3cc6690040fb..78b7edfad9a0 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -310,12 +310,7 @@ def _redetect_machines(self) -> None: # 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. - machines = self.build.environment.machines.miss_defaulting() - machines.build = envconfig.detect_machine_info(self.coredata.compilers.build) - self.build.environment.machines = machines.default_missing() - assert self.build.environment.machines.build.cpu is not None - assert self.build.environment.machines.host.cpu is not None - assert self.build.environment.machines.target.cpu is not None + self.build.environment.update_build_machine() self.builtin['build_machine'] = \ OBJ.MachineHolder(self.build.environment.machines.build, self) diff --git a/test cases/unit/133 nasm language only/meson.build b/test cases/unit/133 nasm language only/meson.build new file mode 100644 index 000000000000..7abaec7e8b4d --- /dev/null +++ b/test cases/unit/133 nasm language only/meson.build @@ -0,0 +1,6 @@ +project( + 'nasm only', + 'nasm', + license : 'MIT', + meson_version : '>= 1.10', +) diff --git a/unittests/rewritetests.py b/unittests/rewritetests.py index 73e6c7fc56f8..4bf8283ec842 100644 --- a/unittests/rewritetests.py +++ b/unittests/rewritetests.py @@ -8,14 +8,17 @@ from pathlib import Path import shutil import unittest +import typing as T from mesonbuild.ast import IntrospectionInterpreter, AstIDGenerator from mesonbuild.ast.printer import RawPrinter -from mesonbuild.mesonlib import windows_proof_rmtree +from mesonbuild.mesonlib import windows_proof_rmtree, is_windows, is_linux + from .baseplatformtests import BasePlatformTests +from .helpers import skip_if_not_language class RewriterTests(BasePlatformTests): - def setUp(self): + def setUp(self) -> None: super().setUp() self.maxDiff = None @@ -24,7 +27,7 @@ def prime(self, dirname): windows_proof_rmtree(self.builddir) shutil.copytree(os.path.join(self.rewrite_test_dir, dirname), self.builddir) - def rewrite_raw(self, directory, args): + def rewrite_raw(self, directory: str, args: T.Sequence[str]) -> T.Dict: if isinstance(args, str): args = [args] command = self.rewrite_command + ['--verbose', '--skip', '--sourcedir', directory] + args @@ -41,7 +44,7 @@ def rewrite_raw(self, directory, args): return {} return json.loads(p.stdout) - def rewrite(self, directory, args): + def rewrite(self, directory: str, args: T.Sequence[str]) -> T.Dict: if isinstance(args, str): args = [args] return self.rewrite_raw(directory, ['command'] + args) @@ -527,3 +530,9 @@ def node_to_str(node): expected = Path(test_path / "expected_dag.txt").read_text(encoding='utf-8').strip() self.assertEqual(dag_as_str.strip(), expected) + + @skip_if_not_language('nasm') + def test_nasm(self) -> None: + srcdir = os.path.join(self.unit_test_dir, '133 nasm language only') + self.rewrite_raw(srcdir, ['kwargs', 'info', 'project', '/']) +