aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/compilers
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2024-04-05 00:08:09 +0300
committerGitHub <noreply@github.com>2024-04-05 00:08:09 +0300
commit30c38e2bd69b2bab74b6e76da1c626f3c9853613 (patch)
tree81951d3bfe27ef63432321fe8a038cb482b59e19 /mesonbuild/compilers
parente00710a0a98e818418a62466284bdfc200142b0c (diff)
parentf3fad6cc5f948b0c7557bdce3959c71420183be9 (diff)
downloadmeson-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.py15
-rw-r--r--mesonbuild/compilers/mixins/visualstudio.py12
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] = []