diff options
author | Jon Turney <jon.turney@dronecode.org.uk> | 2018-10-30 20:25:50 +0000 |
---|---|---|
committer | Jon Turney <jon.turney@dronecode.org.uk> | 2018-12-06 13:25:16 +0000 |
commit | a872b925ea41be3e6beffeb934030068c0d83be9 (patch) | |
tree | c7a51c46a30202cb4109570a7c7c032be4e133f5 | |
parent | 4db1b3a09f8e1f9faf7747beca2bc77ae0e5a6a5 (diff) | |
download | meson-a872b925ea41be3e6beffeb934030068c0d83be9.zip meson-a872b925ea41be3e6beffeb934030068c0d83be9.tar.gz meson-a872b925ea41be3e6beffeb934030068c0d83be9.tar.bz2 |
Store the target architecture for CL-like compilers
Store the MSVC compiler target architecture ('x86', 'x64' or 'ARM' (this
is ARM64, I believe)), rather than just if it's x64 or not.
The regex used for target architecture should be ok, based on this list
of [1] version outputs, but we assume x86 if no match, for safety's
sake.
[1] https://stackoverflow.com/a/1233332/1951600
Also detect arch even if cl outputs version to stdout.
Ditto for clang-cl
Future work: is_64 is now only used in get_instruction_set_args()
-rw-r--r-- | mesonbuild/compilers/c.py | 9 | ||||
-rw-r--r-- | mesonbuild/compilers/cpp.py | 8 | ||||
-rw-r--r-- | mesonbuild/environment.py | 27 |
3 files changed, 27 insertions, 17 deletions
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index b009645..46f4181 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -1290,7 +1290,7 @@ class VisualStudioCCompiler(CCompiler): 'mtd': ['/MTd'], } - def __init__(self, exelist, version, is_cross, exe_wrap, is_64): + def __init__(self, exelist, version, is_cross, exe_wrap, target): CCompiler.__init__(self, exelist, version, is_cross, exe_wrap) self.id = 'msvc' # /showIncludes is needed for build dependency tracking in Ninja @@ -1300,7 +1300,8 @@ class VisualStudioCCompiler(CCompiler): '2': ['/W3'], '3': ['/W4']} self.base_options = ['b_pch', 'b_ndebug', 'b_vscrt'] # FIXME add lto, pgo and the like - self.is_64 = is_64 + self.target = target + self.is_64 = ('x64' in target) or ('x86_64' in target) # Override CCompiler.get_always_args def get_always_args(self): @@ -1588,8 +1589,8 @@ class VisualStudioCCompiler(CCompiler): class ClangClCCompiler(VisualStudioCCompiler): - def __init__(self, exelist, version, is_cross, exe_wrap, is_64): - super().__init__(exelist, version, is_cross, exe_wrap, is_64) + def __init__(self, exelist, version, is_cross, exe_wrap, target): + super().__init__(exelist, version, is_cross, exe_wrap, target) self.id = 'clang-cl' diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py index 87371c0..d702e83 100644 --- a/mesonbuild/compilers/cpp.py +++ b/mesonbuild/compilers/cpp.py @@ -308,9 +308,9 @@ class IntelCPPCompiler(IntelCompiler, CPPCompiler): class VisualStudioCPPCompiler(VisualStudioCCompiler, CPPCompiler): - def __init__(self, exelist, version, is_cross, exe_wrap, is_64): + def __init__(self, exelist, version, is_cross, exe_wrap, target): CPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap) - VisualStudioCCompiler.__init__(self, exelist, version, is_cross, exe_wrap, is_64) + VisualStudioCCompiler.__init__(self, exelist, version, is_cross, exe_wrap, target) self.base_options = ['b_pch', 'b_vscrt'] # FIXME add lto, pgo and the like def get_options(self): @@ -387,8 +387,8 @@ class VisualStudioCPPCompiler(VisualStudioCCompiler, CPPCompiler): return VisualStudioCCompiler.get_compiler_check_args(self) class ClangClCPPCompiler(VisualStudioCPPCompiler, ClangClCCompiler): - def __init__(self, exelist, version, is_cross, exe_wrap, is_64): - VisualStudioCPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap, is_64) + def __init__(self, exelist, version, is_cross, exe_wrap, target): + VisualStudioCPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap, target) self.id = 'clang-cl' class ArmCPPCompiler(ArmCompiler, CPPCompiler): diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index 2ccd31e..95a64c6 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -659,9 +659,13 @@ class Environment: except OSError as e: popen_exceptions[' '.join(compiler + [arg])] = e version = search_version(out) - is_64 = 'Target: x86_64' in out + match = re.search('^Target: (.*?)-', out, re.MULTILINE) + if match: + target = match.group(1) + else: + target = 'unknown target' cls = ClangClCCompiler if lang == 'c' else ClangClCPPCompiler - return cls(compiler, version, is_cross, exe_wrap, is_64) + return cls(compiler, version, is_cross, exe_wrap, target) if 'clang' in out: if 'Apple' in out or mesonlib.for_darwin(want_cross, self): compiler_type = CompilerType.CLANG_OSX @@ -676,15 +680,20 @@ class Environment: # number to stderr but earlier ones print version # on stdout. Why? Lord only knows. # Check both outputs to figure out version. - version = search_version(err) - if version == 'unknown version': - version = search_version(out) - if version == 'unknown version': - m = 'Failed to detect MSVC compiler arch: stderr was\n{!r}' + for lookat in [err, out]: + version = search_version(lookat) + if version != 'unknown version': + break + else: + m = 'Failed to detect MSVC compiler version: stderr was\n{!r}' raise EnvironmentException(m.format(err)) - is_64 = err.split('\n')[0].endswith(' x64') + match = re.search(' for (.*)$', lookat.split('\n')[0]) + if match: + target = match.group(1) + else: + target = 'x86' cls = VisualStudioCCompiler if lang == 'c' else VisualStudioCPPCompiler - return cls(compiler, version, is_cross, exe_wrap, is_64) + return cls(compiler, version, is_cross, exe_wrap, target) if '(ICC)' in out: if mesonlib.for_darwin(want_cross, self): compiler_type = CompilerType.ICC_OSX |