From cece1a7e9992a3bbcc35f90777ba22ba9d62b538 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 15 Apr 2025 10:27:20 +0200 Subject: linkers: pass system to DynamicLinker.__init__ for Darwin linkers Apple linkers need to use different arguments on macOS and iOS-like platforms. Pass the system to the constructor so that it can be examined. Co-authored-by: Russell Keith-Magee Signed-off-by: Paolo Bonzini --- mesonbuild/compilers/detect.py | 4 ++-- mesonbuild/linkers/detect.py | 13 ++++++++++--- mesonbuild/linkers/linkers.py | 4 +++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/mesonbuild/compilers/detect.py b/mesonbuild/compilers/detect.py index 9dab06a85..53bdd8513 100644 --- a/mesonbuild/compilers/detect.py +++ b/mesonbuild/compilers/detect.py @@ -1122,8 +1122,8 @@ def detect_rust_compiler(env: 'Environment', for_machine: MachineChoice) -> Rust version=cc.linker.version, **extra_args) # type: ignore else: linker = type(cc.linker)(compiler, for_machine, cc.LINKER_PREFIX, - always_args=always_args, version=cc.linker.version, - **extra_args) + always_args=always_args, system=cc.linker.system, + version=cc.linker.version, **extra_args) elif 'link' in override[0]: linker = guess_win_linker(env, override, cls, version, for_machine, use_linker_prefix=False) diff --git a/mesonbuild/linkers/detect.py b/mesonbuild/linkers/detect.py index 493430a87..ee9bb0861 100644 --- a/mesonbuild/linkers/detect.py +++ b/mesonbuild/linkers/detect.py @@ -131,6 +131,7 @@ def guess_nix_linker(env: 'Environment', compiler: T.List[str], comp_class: T.Ty env.coredata.add_lang_args(comp_class.language, comp_class, for_machine, env) extra_args = extra_args or [] + system = env.machines[for_machine].system ldflags = env.coredata.get_external_link_args(for_machine, comp_class.language) extra_args += comp_class._unix_args_to_native(ldflags, env.machines[for_machine]) @@ -164,7 +165,7 @@ def guess_nix_linker(env: 'Environment', compiler: T.List[str], comp_class: T.Ty lld_cls = linkers.LLVMDynamicLinker linker = lld_cls( - compiler, for_machine, comp_class.LINKER_PREFIX, override, version=v) + compiler, for_machine, comp_class.LINKER_PREFIX, override, system=system, version=v) elif 'Snapdragon' in e and 'LLVM' in e: linker = linkers.QualcommLLVMDynamicLinker( compiler, for_machine, comp_class.LINKER_PREFIX, override, version=v) @@ -222,7 +223,10 @@ def guess_nix_linker(env: 'Environment', compiler: T.List[str], comp_class: T.Ty elif 'xtools-' in o.split('\n', maxsplit=1)[0]: xtools = o.split(' ', maxsplit=1)[0] v = xtools.split('-', maxsplit=2)[1] - linker = linkers.AppleDynamicLinker(compiler, for_machine, comp_class.LINKER_PREFIX, override, version=v) + linker = linkers.AppleDynamicLinker( + compiler, for_machine, comp_class.LINKER_PREFIX, override, + system=system, version=v + ) # detect linker on MacOS - must be after other platforms because the # "(use -v to see invocation)" will match clang on other platforms, # but the rest of the checks will fail and call __failed_to_detect_linker. @@ -241,7 +245,10 @@ def guess_nix_linker(env: 'Environment', compiler: T.List[str], comp_class: T.Ty break else: __failed_to_detect_linker(compiler, check_args, o, e) - linker = linkers.AppleDynamicLinker(compiler, for_machine, comp_class.LINKER_PREFIX, override, version=v) + linker = linkers.AppleDynamicLinker( + compiler, for_machine, comp_class.LINKER_PREFIX, override, + system=system, version=v + ) else: __failed_to_detect_linker(compiler, check_args, o, e) return linker diff --git a/mesonbuild/linkers/linkers.py b/mesonbuild/linkers/linkers.py index e74ff708d..47a76198e 100644 --- a/mesonbuild/linkers/linkers.py +++ b/mesonbuild/linkers/linkers.py @@ -141,9 +141,11 @@ class DynamicLinker(metaclass=abc.ABCMeta): def __init__(self, exelist: T.List[str], for_machine: mesonlib.MachineChoice, prefix_arg: T.Union[str, T.List[str]], - always_args: T.List[str], *, version: str = 'unknown version'): + always_args: T.List[str], *, system: str = 'unknown system', + version: str = 'unknown version'): self.exelist = exelist self.for_machine = for_machine + self.system = system self.version = version self.prefix_arg = prefix_arg self.always_args = always_args -- cgit v1.2.3