diff options
Diffstat (limited to 'mesonbuild/environment.py')
-rw-r--r-- | mesonbuild/environment.py | 71 |
1 files changed, 30 insertions, 41 deletions
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index 44f40e5..e665546 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -137,7 +137,7 @@ def detect_ninja(version='1.5', log=False): def detect_native_windows_arch(): """ - The architecture of Windows itself: x86 or amd64 + The architecture of Windows itself: x86, amd64 or arm64 """ # These env variables are always available. See: # https://msdn.microsoft.com/en-us/library/aa384274(VS.85).aspx @@ -167,45 +167,25 @@ def detect_windows_arch(compilers): easily detected. In the end, the sanest method is as follows: - 1. Check if we're in an MSVC toolchain environment, and if so, return the - MSVC toolchain architecture as our 'native' architecture. - 2. If not, check environment variables that are set by Windows and WOW64 to - find out the architecture that Windows is built for, and use that as our - 'native' architecture. + 1. Check environment variables that are set by Windows and WOW64 to find out + if this is x86 (possibly in WOW64), if so use that as our 'native' + architecture. + 2. If the compiler toolchain target architecture is x86, use that as our + 'native' architecture. + 3. Otherwise, use the actual Windows architecture + """ os_arch = detect_native_windows_arch() - if os_arch != 'amd64': + if os_arch == 'x86': return os_arch # If we're on 64-bit Windows, 32-bit apps can be compiled without # cross-compilation. So if we're doing that, just set the native arch as # 32-bit and pretend like we're running under WOW64. Else, return the # actual Windows architecture that we deduced above. for compiler in compilers.values(): - # Check if we're using and inside an MSVC toolchain environment - if compiler.id == 'msvc' and 'VCINSTALLDIR' in os.environ: - if float(compiler.get_toolset_version()) < 10.0: - # On MSVC 2008 and earlier, check 'BUILD_PLAT', where - # 'Win32' means 'x86' - platform = os.environ.get('BUILD_PLAT', os_arch) - if platform == 'Win32': - return 'x86' - elif 'VSCMD_ARG_TGT_ARCH' in os.environ: - # On MSVC 2017 'Platform' is not set in VsDevCmd.bat - return os.environ['VSCMD_ARG_TGT_ARCH'] - else: - # Starting with VS 2017, `Platform` is not always set (f.ex., - # if you use VsDevCmd.bat directly instead of vcvars*.bat), but - # `VSCMD_ARG_HOST_ARCH` is always set, so try that first. - if 'VSCMD_ARG_HOST_ARCH' in os.environ: - platform = os.environ['VSCMD_ARG_HOST_ARCH'].lower() - # On VS 2010-2015, 'Platform' is only set when the - # target arch is not 'x86'. It's 'x64' when targeting - # x86_64 and 'arm' when targeting ARM. - else: - platform = os.environ.get('Platform', 'x86').lower() - if platform == 'x86': - return platform - if compiler.id == 'clang-cl' and not compiler.is_64: + if compiler.id == 'msvc' and compiler.target == 'x86': + return 'x86' + if compiler.id == 'clang-cl' and compiler.target == 'x86': return 'x86' if compiler.id == 'gcc' and compiler.has_builtin_define('__i386__'): return 'x86' @@ -660,9 +640,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 @@ -677,15 +661,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 |