aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurin-Luis Lehning <65224843+e820@users.noreply.github.com>2020-12-14 13:34:40 +0100
committerDylan Baker <dylan@pnwbakers.com>2020-12-14 11:23:53 -0800
commit2fb4d1f7512a4ec125883fd65115ab33a5b06b6f (patch)
treedbb0a7b85b5227b17959aa618a5654b755d947f3
parent9f1ba4025260e620c8e49c3825ddfd51c1c4c4b6 (diff)
downloadmeson-2fb4d1f7512a4ec125883fd65115ab33a5b06b6f.zip
meson-2fb4d1f7512a4ec125883fd65115ab33a5b06b6f.tar.gz
meson-2fb4d1f7512a4ec125883fd65115ab33a5b06b6f.tar.bz2
Make win_subsystem a linker property
-rw-r--r--mesonbuild/compilers/compilers.py9
-rw-r--r--mesonbuild/compilers/mixins/clang.py6
-rw-r--r--mesonbuild/compilers/mixins/gnu.py14
-rw-r--r--mesonbuild/compilers/mixins/visualstudio.py3
-rw-r--r--mesonbuild/linkers.py31
5 files changed, 35 insertions, 28 deletions
diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py
index 2acd429..ec255a8 100644
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -874,11 +874,10 @@ class Compiler(metaclass=abc.ABCMeta):
return []
def get_win_subsystem_args(self, value: str) -> T.List[str]:
- # This returns an empty array rather than throws to simplify the code.
- # Otherwise we would have to check whenever calling this function whether
- # the target is for Windows. There are also many cases where this is
- # a meaningless choice, such as with Jave or C#.
- return []
+ # By default the dynamic linker is going to return an empty
+ # array in case it either doesn't support Windows subsystems
+ # or does not target Windows
+ return self.linker.get_win_subsystem_args(value)
def has_func_attribute(self, name: str, env: 'Environment') -> T.Tuple[bool, bool]:
raise EnvironmentException(
diff --git a/mesonbuild/compilers/mixins/clang.py b/mesonbuild/compilers/mixins/clang.py
index ab2d066..4f2a930 100644
--- a/mesonbuild/compilers/mixins/clang.py
+++ b/mesonbuild/compilers/mixins/clang.py
@@ -109,12 +109,6 @@ class ClangCompiler(GnuLikeCompiler):
# Shouldn't work, but it'll be checked explicitly in the OpenMP dependency.
return []
- def get_win_subsystem_args(self, value: str) -> T.List[str]:
- if self.info.is_windows() and not self.info.is_cygwin() and isinstance(self.linker, ClangClDynamicLinker):
- return [f'-Wl,/subsystem:{value}']
-
- return super().get_win_subsystem_args(value)
-
@classmethod
def use_linker_args(cls, linker: str) -> T.List[str]:
# Clang additionally can use a linker specified as a path, which GCC
diff --git a/mesonbuild/compilers/mixins/gnu.py b/mesonbuild/compilers/mixins/gnu.py
index 4024cbe..bb41a8a 100644
--- a/mesonbuild/compilers/mixins/gnu.py
+++ b/mesonbuild/compilers/mixins/gnu.py
@@ -219,20 +219,6 @@ class GnuLikeCompiler(Compiler, metaclass=abc.ABCMeta):
return ['-mwindows' if value else '-mconsole']
return []
- def get_win_subsystem_args(self, value: str) -> T.List[str]:
- args = []
- if self.info.is_windows() or self.info.is_cygwin():
- if 'windows' in value:
- args = ['-Wl,--subsystem,windows']
- elif 'console' in value:
- args = ['-Wl,--subsystem,console']
- else:
- raise mesonlib.MesonException('Only "windows" and "console" are supported for win_subsystem with MinGW, not "{}".'.format(value))
- if ',' in value:
- args[-1] = args[-1] + ':' + value.split(',')[1]
- return args
-
-
def compute_parameters_with_absolute_paths(self, parameter_list: T.List[str], build_dir: str) -> T.List[str]:
for idx, i in enumerate(parameter_list):
if i[:2] == '-I' or i[:2] == '-L':
diff --git a/mesonbuild/compilers/mixins/visualstudio.py b/mesonbuild/compilers/mixins/visualstudio.py
index 3e8b8e3..6e9a4d7 100644
--- a/mesonbuild/compilers/mixins/visualstudio.py
+++ b/mesonbuild/compilers/mixins/visualstudio.py
@@ -205,9 +205,6 @@ class VisualStudioLikeCompiler(Compiler, metaclass=abc.ABCMeta):
else:
return ['/SUBSYSTEM:CONSOLE']
- def get_win_subsystem_args(self, value: str) -> T.List[str]:
- return ['/SUBSYSTEM:' + value.upper()]
-
def get_pic_args(self) -> T.List[str]:
return [] # PIC is handled by the loader on Windows
diff --git a/mesonbuild/linkers.py b/mesonbuild/linkers.py
index 967e465..9ad4a28 100644
--- a/mesonbuild/linkers.py
+++ b/mesonbuild/linkers.py
@@ -477,6 +477,11 @@ class DynamicLinker(LinkerEnvVarsMixin, metaclass=abc.ABCMeta):
# Only used by the Apple linker
return []
+ def get_win_subsystem_args(self, value: str) -> T.List[str]:
+ # Only used if supported by the dynamic linker and
+ # only when targeting Windows
+ return []
+
def bitcode_args(self) -> T.List[str]:
raise mesonlib.MesonException('This linker does not support bitcode bundles')
@@ -743,6 +748,22 @@ class GnuDynamicLinker(GnuLikeDynamicLinkerMixin, PosixDynamicLinkerMixin, Dynam
"""Representation of GNU ld.bfd and ld.gold."""
+ def get_win_subsystem_args(self, value: str) -> T.List[str]:
+ m = env.machines[self.for_machine]
+ args = []
+
+ if m.is_windows() or m.is_cygwin():
+ if 'windows' in value:
+ args = ['--subsystem,windows']
+ elif 'console' in value:
+ args = ['--subsystem,console']
+ else:
+ raise mesonlib.MesonException(f'Only "windows" and "console" are supported for win_subsystem with MinGW, not "{value}".')
+ if ',' in value:
+ args[-1] = args[-1] + ':' + value.split(',')[1]
+
+ return self._apply_prefix(args)
+
def get_accepts_rsp(self) -> bool:
return True
@@ -781,6 +802,13 @@ class LLVMDynamicLinker(GnuLikeDynamicLinkerMixin, PosixDynamicLinkerMixin, Dyna
return self._apply_prefix('--allow-shlib-undefined')
return []
+ def get_win_subsystem_args(self, value: str) -> T.List[str]:
+ m = env.machines[self.for_machine]
+ if not m.is_windows() or m.is_cygwin():
+ return []
+
+ return self._apply_prefix([f'-subsystem:{value}'])
+
class WASMDynamicLinker(GnuLikeDynamicLinkerMixin, PosixDynamicLinkerMixin, DynamicLinker):
@@ -1122,6 +1150,9 @@ class VisualStudioLikeLinkerMixin:
def get_allow_undefined_args(self) -> T.List[str]:
return []
+ def get_win_subsystem_args(self, value: str) -> T.List[str]:
+ return self._apply_prefix([f'/SUBSYSTEM:{value.upper()}'])
+
def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
suffix: str, soversion: str, darwin_versions: T.Tuple[str, str],
is_shared_module: bool) -> T.List[str]: