aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/linkers.py
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2019-07-22 14:58:34 -0700
committerDylan Baker <dylan@pnwbakers.com>2019-08-14 13:13:23 -0700
commitd9b6b5de315438a649d77ce4812c0a9b5cc66ba3 (patch)
tree1179121f68cf0cc7f55114aa28aea1f52478abd3 /mesonbuild/linkers.py
parent7c5b25ce51f2414f90fba887c1cb09544b4bfca5 (diff)
downloadmeson-d9b6b5de315438a649d77ce4812c0a9b5cc66ba3.zip
meson-d9b6b5de315438a649d77ce4812c0a9b5cc66ba3.tar.gz
meson-d9b6b5de315438a649d77ce4812c0a9b5cc66ba3.tar.bz2
linkers: Add MSVC like linkers
Diffstat (limited to 'mesonbuild/linkers.py')
-rw-r--r--mesonbuild/linkers.py80
1 files changed, 79 insertions, 1 deletions
diff --git a/mesonbuild/linkers.py b/mesonbuild/linkers.py
index 022b9a3..b289298 100644
--- a/mesonbuild/linkers.py
+++ b/mesonbuild/linkers.py
@@ -422,7 +422,7 @@ class GnuLikeDynamicLinkerMixin:
def get_asneeded_args(self) -> typing.List[str]:
return ['-Wl,--as-needed']
-
+
def get_link_whole_for(self, args: typing.List[str]) -> typing.List[str]:
if not args:
return args
@@ -735,3 +735,81 @@ class PGIDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker):
if env.machines[self.for_machine].is_windows():
return ['-R' + os.path.join(build_dir, p) for p in rpath_paths]
return []
+
+
+class VisualStudioLikeLinkerMixin:
+
+ _BUILDTYPE_ARGS = {
+ 'plain': [],
+ 'debug': [],
+ 'debugoptimized': [],
+ # The otherwise implicit REF and ICF linker optimisations are disabled by
+ # /DEBUG. REF implies ICF.
+ 'release': ['/OPT:REF'],
+ 'minsize': ['/INCREMENTAL:NO', '/OPT:REF'],
+ 'custom': [],
+ } # type: typing.Dict[str, typing.List[str]]
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.machine = 'x86'
+
+ def get_debug_crt_args(self) -> typing.List[str]:
+ """Arguments needed to select a debug crt for the linker.
+
+ Sometimes we need to manually select the CRT (C runtime) to use with
+ MSVC. One example is when trying to link with static libraries since
+ MSVC won't auto-select a CRT for us in that case and will error out
+ asking us to select one.
+ """
+ return ['/MDd']
+
+ def get_output_args(self, outputname: str) -> typing.List[str]:
+ return ['/MACHINE:' + self.machine, '/OUT:' + outputname]
+
+ def get_always_args(self) -> typing.List[str]:
+ return ['/nologo']
+
+ def get_search_args(self, dirname: str) -> typing.List[str]:
+ return ['/LIBPATH:' + dirname]
+
+ def get_std_shared_lib_args(self) -> typing.List[str]:
+ return ['/DLL']
+
+ def get_debugfile_args(self, targetfile: str) -> typing.List[str]:
+ pdbarr = targetfile.split('.')[:-1]
+ pdbarr += ['pdb']
+ return ['/DEBUG', '/PDB:' + '.'.join(pdbarr)]
+
+ def get_link_whole_for(self, args: typing.List[str]) -> typing.List[str]:
+ # Only since VS2015
+ args = mesonlib.listify(args)
+ return ['/WHOLEARCHIVE:' + x for x in args]
+
+ def get_allow_undefined_args(self) -> typing.List[str]:
+ # link.exe
+ return ['/FORCE:UNRESOLVED']
+
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
+ suffix: str, soversion: str, darwin_versions: typing.Tuple[str, str],
+ is_shared_module: bool) -> typing.List[str]:
+ return []
+
+
+class MSVCDynamicLinker(VisualStudioLikeLinkerMixin, DynamicLinker):
+
+ """Microsoft's Link.exe."""
+
+ def __init__(self, for_machine: mesonlib.MachineChoice,
+ *, version: str = 'unknown version'):
+ super().__init__(['link.exe'], for_machine, 'link', version=version)
+
+
+class ClangClDynamicLinker(VisualStudioLikeLinkerMixin, DynamicLinker):
+
+ """Clang's lld-link.exe."""
+
+ def __init__(self, for_machine: mesonlib.MachineChoice,
+ *, version: str = 'unknown version'):
+ super().__init__(['lld-link.exe'], for_machine, 'lld-link',
+ version=version)