diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2024-04-05 00:08:09 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-05 00:08:09 +0300 |
commit | 30c38e2bd69b2bab74b6e76da1c626f3c9853613 (patch) | |
tree | 81951d3bfe27ef63432321fe8a038cb482b59e19 /mesonbuild/compilers | |
parent | e00710a0a98e818418a62466284bdfc200142b0c (diff) | |
parent | f3fad6cc5f948b0c7557bdce3959c71420183be9 (diff) | |
download | meson-30c38e2bd69b2bab74b6e76da1c626f3c9853613.zip meson-30c38e2bd69b2bab74b6e76da1c626f3c9853613.tar.gz meson-30c38e2bd69b2bab74b6e76da1c626f3c9853613.tar.bz2 |
Merge pull request #12144 from amyspark/fix-msvc-clangcl-linker-flag-detection
linkers: Fix detection of link arguments to Clang(-cl) + MSVC
Diffstat (limited to 'mesonbuild/compilers')
-rw-r--r-- | mesonbuild/compilers/mixins/clang.py | 15 | ||||
-rw-r--r-- | mesonbuild/compilers/mixins/visualstudio.py | 12 |
2 files changed, 26 insertions, 1 deletions
diff --git a/mesonbuild/compilers/mixins/clang.py b/mesonbuild/compilers/mixins/clang.py index a57b9a9..f982509 100644 --- a/mesonbuild/compilers/mixins/clang.py +++ b/mesonbuild/compilers/mixins/clang.py @@ -11,7 +11,7 @@ import typing as T from ... import mesonlib from ...linkers.linkers import AppleDynamicLinker, ClangClDynamicLinker, LLVMDynamicLinker, GnuGoldDynamicLinker, \ - MoldDynamicLinker + MoldDynamicLinker, MSVCDynamicLinker from ...mesonlib import OptionKey from ..compilers import CompileCheckMode from .gnu import GnuLikeCompiler @@ -111,6 +111,13 @@ class ClangCompiler(GnuLikeCompiler): # Shouldn't work, but it'll be checked explicitly in the OpenMP dependency. return [] + def gen_vs_module_defs_args(self, defsfile: str) -> T.List[str]: + if isinstance(self.linker, (MSVCDynamicLinker)): + # With MSVC, DLLs only export symbols that are explicitly exported, + # so if a module defs file is specified, we use that to export symbols + return ['-Wl,/DEF:' + defsfile] + return super().gen_vs_module_defs_args(defsfile) + @classmethod def use_linker_args(cls, linker: str, version: str) -> T.List[str]: # Clang additionally can use a linker specified as a path, which GCC @@ -155,6 +162,12 @@ class ClangCompiler(GnuLikeCompiler): args.extend(super().get_lto_compile_args(threads=threads)) return args + def linker_to_compiler_args(self, args: T.List[str]) -> T.List[str]: + if isinstance(self.linker, (ClangClDynamicLinker, MSVCDynamicLinker)): + return [flag if flag.startswith('-Wl,') else f'-Wl,{flag}' for flag in args] + else: + return args + def get_lto_link_args(self, *, threads: int = 0, mode: str = 'default', thinlto_cache_dir: T.Optional[str] = None) -> T.List[str]: args = self.get_lto_compile_args(threads=threads, mode=mode) diff --git a/mesonbuild/compilers/mixins/visualstudio.py b/mesonbuild/compilers/mixins/visualstudio.py index d6ebd6e..4e2ce09 100644 --- a/mesonbuild/compilers/mixins/visualstudio.py +++ b/mesonbuild/compilers/mixins/visualstudio.py @@ -460,6 +460,18 @@ class ClangClCompiler(VisualStudioLikeCompiler): path = '.' return ['/clang:-isystem' + path] if is_system else ['-I' + path] + @classmethod + def use_linker_args(cls, linker: str, version: str) -> T.List[str]: + # Clang additionally can use a linker specified as a path, unlike MSVC. + if linker == 'lld-link': + return ['-fuse-ld=lld-link'] + return super().use_linker_args(linker, version) + + def linker_to_compiler_args(self, args: T.List[str]) -> T.List[str]: + # clang-cl forwards arguments span-wise with the /LINK flag + # therefore -Wl will be received by lld-link or LINK and rejected + return super().use_linker_args(self.linker.id, '') + super().linker_to_compiler_args([flag[4:] if flag.startswith('-Wl,') else flag for flag in args]) + def get_dependency_compile_args(self, dep: 'Dependency') -> T.List[str]: if dep.get_include_type() == 'system': converted: T.List[str] = [] |