summaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2024-11-21 09:50:36 +0100
committerDylan Baker <dylan@pnwbakers.com>2025-04-02 08:44:37 -0700
commit2c10d77c3c7b2b9ad3464ef37bc6eb01fb34deb0 (patch)
tree97ea5b2d1a35055aa4421d8f068d710a79b6e032 /mesonbuild
parentdfefd838a846dd944d8a3f91200b6c54f0ffd198 (diff)
downloadmeson-2c10d77c3c7b2b9ad3464ef37bc6eb01fb34deb0.tar.gz
compilers: introduce get_exe() and get_exe_args()
This will be used by rustdoc tests because the Test objects takes a single string for the command and everything else goes in the args. But apart from this, the need to split the executable from the arguments is common so create new methods to do it. While at it, fix brokenness in the handling of the zig compiler, which is checking against "zig" but failing to detect e.g. "/usr/bin/zig". Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/backend/backends.py5
-rw-r--r--mesonbuild/cmake/toolchain.py3
-rw-r--r--mesonbuild/compilers/compilers.py6
-rw-r--r--mesonbuild/compilers/detect.py4
-rw-r--r--mesonbuild/compilers/rust.py2
-rw-r--r--mesonbuild/dependencies/dev.py2
-rw-r--r--mesonbuild/interpreter/interpreter.py7
-rw-r--r--mesonbuild/linkers/linkers.py6
8 files changed, 23 insertions, 12 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index a960537a8..8a7887837 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -2078,9 +2078,8 @@ class Backend:
Some backends don't support custom compilers. This is a convenience
method to convert a Compiler to a Generator.
'''
- exelist = compiler.get_exelist()
- exe = programs.ExternalProgram(exelist[0])
- args = exelist[1:]
+ exe = programs.ExternalProgram(compiler.get_exe())
+ args = compiler.get_exe_args()
commands = self.compiler_to_generator_args(target, compiler)
generator = build.Generator(exe, args + commands.to_native(),
[output_templ], depfile='@PLAINNAME@.d',
diff --git a/mesonbuild/cmake/toolchain.py b/mesonbuild/cmake/toolchain.py
index 9eb961c52..d410886ec 100644
--- a/mesonbuild/cmake/toolchain.py
+++ b/mesonbuild/cmake/toolchain.py
@@ -9,6 +9,7 @@ from ..envconfig import CMakeSkipCompilerTest
from .common import language_map, cmake_get_generator_args
from .. import mlog
+import os.path
import shutil
import typing as T
from enum import Enum
@@ -198,7 +199,7 @@ class CMakeToolchain:
if compiler.get_argument_syntax() == 'msvc':
return arg.startswith('/')
else:
- if compiler.exelist[0] == 'zig' and arg in {'ar', 'cc', 'c++', 'dlltool', 'lib', 'ranlib', 'objcopy', 'rc'}:
+ if os.path.basename(compiler.get_exe()) == 'zig' and arg in {'ar', 'cc', 'c++', 'dlltool', 'lib', 'ranlib', 'objcopy', 'rc'}:
return True
return arg.startswith('-')
diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py
index a73697cdd..9fbde0e49 100644
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -521,6 +521,12 @@ class Compiler(HoldableObject, metaclass=abc.ABCMeta):
def get_modes(self) -> T.List[Compiler]:
return self.modes
+ def get_exe(self) -> str:
+ return self.exelist[0]
+
+ def get_exe_args(self) -> T.List[str]:
+ return self.exelist[1:]
+
def get_linker_id(self) -> str:
# There is not guarantee that we have a dynamic linker instance, as
# some languages don't have separate linkers and compilers. In those
diff --git a/mesonbuild/compilers/detect.py b/mesonbuild/compilers/detect.py
index bce0be8a8..9dab06a85 100644
--- a/mesonbuild/compilers/detect.py
+++ b/mesonbuild/compilers/detect.py
@@ -1099,7 +1099,7 @@ def detect_rust_compiler(env: 'Environment', for_machine: MachineChoice) -> Rust
extra_args: T.Dict[str, T.Union[str, bool]] = {}
always_args: T.List[str] = []
if is_link_exe:
- compiler.extend(cls.use_linker_args(cc.linker.exelist[0], ''))
+ compiler.extend(cls.use_linker_args(cc.linker.get_exe(), ''))
extra_args['direct'] = True
extra_args['machine'] = cc.linker.machine
else:
@@ -1131,7 +1131,7 @@ def detect_rust_compiler(env: 'Environment', for_machine: MachineChoice) -> Rust
# inserts the correct prefix itself.
assert isinstance(linker, linkers.VisualStudioLikeLinkerMixin)
linker.direct = True
- compiler.extend(cls.use_linker_args(linker.exelist[0], ''))
+ compiler.extend(cls.use_linker_args(linker.get_exe(), ''))
else:
# On linux and macos rust will invoke the c compiler for
# linking, on windows it will use lld-link or link.exe.
diff --git a/mesonbuild/compilers/rust.py b/mesonbuild/compilers/rust.py
index 210544ed8..17908860e 100644
--- a/mesonbuild/compilers/rust.py
+++ b/mesonbuild/compilers/rust.py
@@ -314,7 +314,7 @@ class RustCompiler(Compiler):
exelist = rustup_exelist + [name]
else:
exelist = [name]
- args = self.exelist[1:]
+ args = self.get_exe_args()
from ..programs import find_external_program
for prog in find_external_program(env, self.for_machine, exelist[0], exelist[0],
diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py
index 0c8886b81..8f0f1baae 100644
--- a/mesonbuild/dependencies/dev.py
+++ b/mesonbuild/dependencies/dev.py
@@ -593,7 +593,7 @@ class JNISystemDependency(SystemDependency):
self.java_home = environment.properties[self.for_machine].get_java_home()
if not self.java_home:
- self.java_home = pathlib.Path(shutil.which(self.javac.exelist[0])).resolve().parents[1]
+ self.java_home = pathlib.Path(shutil.which(self.javac.get_exe())).resolve().parents[1]
if m.is_darwin():
problem_java_prefix = pathlib.Path('/System/Library/Frameworks/JavaVM.framework/Versions')
if problem_java_prefix in self.java_home.parents:
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index a17c76c5f..24c63bc1a 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -798,13 +798,12 @@ class Interpreter(InterpreterBase, HoldableObject):
if not cmd.found():
raise InterpreterException(f'command {cmd.get_name()!r} not found or not executable')
elif isinstance(cmd, compilers.Compiler):
- exelist = cmd.get_exelist()
- cmd = exelist[0]
+ expanded_args = cmd.get_exe_args()
+ cmd = cmd.get_exe()
prog = ExternalProgram(cmd, silent=True)
if not prog.found():
raise InterpreterException(f'Program {cmd!r} not found or not executable')
cmd = prog
- expanded_args = exelist[1:]
else:
if isinstance(cmd, mesonlib.File):
cmd = cmd.absolute_path(srcdir, builddir)
@@ -823,7 +822,7 @@ class Interpreter(InterpreterBase, HoldableObject):
expanded_args.append(a.get_path())
elif isinstance(a, compilers.Compiler):
FeatureNew.single_use('Compiler object as a variadic argument to `run_command`', '0.61.0', self.subproject, location=self.current_node)
- prog = ExternalProgram(a.exelist[0], silent=True)
+ prog = ExternalProgram(a.get_exe(), silent=True)
if not prog.found():
raise InterpreterException(f'Program {cmd!r} not found or not executable')
expanded_args.append(prog.get_path())
diff --git a/mesonbuild/linkers/linkers.py b/mesonbuild/linkers/linkers.py
index 45eb6e8c3..58753e63b 100644
--- a/mesonbuild/linkers/linkers.py
+++ b/mesonbuild/linkers/linkers.py
@@ -31,6 +31,9 @@ class StaticLinker:
def get_id(self) -> str:
return self.id
+ def get_exe(self) -> str:
+ return self.exelist[0]
+
def compiler_args(self, args: T.Optional[T.Iterable[str]] = None) -> CompilerArgs:
return CompilerArgs(self, args)
@@ -152,6 +155,9 @@ class DynamicLinker(metaclass=abc.ABCMeta):
def get_id(self) -> str:
return self.id
+ def get_exe(self) -> str:
+ return self.exelist[0]
+
def get_version_string(self) -> str:
return f'({self.id} {self.version})'