diff options
-rw-r--r-- | docs/markdown/Release-notes-for-0.49.0.md | 5 | ||||
-rw-r--r-- | mesonbuild/compilers/c.py | 9 | ||||
-rw-r--r-- | mesonbuild/compilers/cpp.py | 8 | ||||
-rw-r--r-- | mesonbuild/environment.py | 71 |
4 files changed, 42 insertions, 51 deletions
diff --git a/docs/markdown/Release-notes-for-0.49.0.md b/docs/markdown/Release-notes-for-0.49.0.md index 9b0dfaa..4ed4be2 100644 --- a/docs/markdown/Release-notes-for-0.49.0.md +++ b/docs/markdown/Release-notes-for-0.49.0.md @@ -172,8 +172,9 @@ compression preferences. ## Native config files -Native files are the counterpart to cross files, and allow specifying -information about the build machine, both when cross compiling and when not. +Native files (`--native-file`) are the counterpart to cross files (`--cross-file`), +and allow specifying information about the build machine, both when cross compiling +and when not. Currently the native files only allow specifying the names of binaries, similar to the cross file, for example: 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 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 |