diff options
Diffstat (limited to 'mesonbuild/environment.py')
-rw-r--r-- | mesonbuild/environment.py | 94 |
1 files changed, 47 insertions, 47 deletions
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index bf75c80..7cb7286 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -22,7 +22,7 @@ from . import coredata from .linkers import ArLinker, ArmarLinker, VisualStudioLinker, DLinker, CcrxLinker, Xc16Linker, C2000Linker, IntelVisualStudioLinker from . import mesonlib from .mesonlib import ( - MesonException, EnvironmentException, MachineChoice, Popen_safe, + MesonException, EnvironmentException, Language, MachineChoice, Popen_safe, PerMachineDefaultable, PerThreeMachineDefaultable, split_args, quote_arg ) from . import mlog @@ -921,7 +921,7 @@ class Environment: else: if not self.machines.matches_build_machine(for_machine): raise EnvironmentException('{!r} compiler binary not defined in cross or native file'.format(lang)) - compilers = getattr(self, 'default_' + lang) + compilers = getattr(self, 'default_' + lang.get_lower_case_name()) ccache = BinaryTable.detect_ccache() if self.machines.matches_build_machine(for_machine): @@ -956,7 +956,7 @@ class Environment: check_args += self.coredata.compiler_options[for_machine][comp_class.language]['args'].value override = [] # type: T.List[str] - value = self.lookup_binary_entry(for_machine, comp_class.language + '_ld') + value = self.lookup_binary_entry(for_machine, comp_class.language.get_lower_case_name() + '_ld') if value is not None: override = comp_class.use_linker_args(value[0]) check_args += override @@ -1023,7 +1023,7 @@ class Environment: check_args = comp_class.LINKER_PREFIX + ['--version'] + extra_args override = [] # type: T.List[str] - value = self.lookup_binary_entry(for_machine, comp_class.language + '_ld') + value = self.lookup_binary_entry(for_machine, comp_class.language.get_lower_case_name() + '_ld') if value is not None: override = comp_class.use_linker_args(value[0]) check_args += override @@ -1087,7 +1087,7 @@ class Environment: raise EnvironmentException('Unable to determine dynamic linker') return linker - def _detect_c_or_cpp_compiler(self, lang: str, for_machine: MachineChoice) -> Compiler: + def _detect_c_or_cpp_compiler(self, lang: Language, for_machine: MachineChoice) -> Compiler: popen_exceptions = {} compilers, ccache, exe_wrap = self._get_compilers(lang, for_machine) is_cross = self.is_cross_build(for_machine) @@ -1161,10 +1161,10 @@ class Environment: if guess_gcc_or_lcc == 'lcc': version = self.get_lcc_version_from_defines(defines) - cls = ElbrusCCompiler if lang == 'c' else ElbrusCPPCompiler + cls = ElbrusCCompiler if lang == Language.C else ElbrusCPPCompiler else: version = self.get_gnu_version_from_defines(defines) - cls = GnuCCompiler if lang == 'c' else GnuCPPCompiler + cls = GnuCCompiler if lang == Language.C else GnuCPPCompiler linker = self._guess_nix_linker(compiler, cls, for_machine) @@ -1174,7 +1174,7 @@ class Environment: linker=linker) if 'Emscripten' in out: - cls = EmscriptenCCompiler if lang == 'c' else EmscriptenCPPCompiler + cls = EmscriptenCCompiler if lang == Language.C else EmscriptenCPPCompiler self.coredata.add_lang_args(cls.language, cls, for_machine, self) # emcc requires a file input in order to pass arguments to the @@ -1206,7 +1206,7 @@ class Environment: # Override previous values version = search_version(arm_ver_str) full_version = arm_ver_str - cls = ArmclangCCompiler if lang == 'c' else ArmclangCPPCompiler + cls = ArmclangCCompiler if lang == Language.C else ArmclangCPPCompiler linker = ArmClangDynamicLinker(for_machine, version=version) self.coredata.add_lang_args(cls.language, cls, for_machine, self) return cls( @@ -1226,7 +1226,7 @@ class Environment: target = match.group(1) else: target = 'unknown target' - cls = ClangClCCompiler if lang == 'c' else ClangClCPPCompiler + cls = ClangClCCompiler if lang == Language.C else ClangClCPPCompiler linker = self._guess_win_linker(['lld-link'], cls, for_machine) return cls( compiler, version, for_machine, is_cross, info, exe_wrap, @@ -1239,9 +1239,9 @@ class Environment: # Even if the for_machine is darwin, we could be using vanilla # clang. if 'Apple' in out: - cls = AppleClangCCompiler if lang == 'c' else AppleClangCPPCompiler + cls = AppleClangCCompiler if lang == Language.C else AppleClangCPPCompiler else: - cls = ClangCCompiler if lang == 'c' else ClangCPPCompiler + cls = ClangCCompiler if lang == Language.C else ClangCPPCompiler if 'windows' in out or self.machines[for_machine].is_windows(): # If we're in a MINGW context this actually will use a gnu @@ -1261,7 +1261,7 @@ class Environment: if 'Intel(R) C++ Intel(R)' in err: version = search_version(err) target = 'x86' if 'IA-32' in err else 'x86_64' - cls = IntelClCCompiler if lang == 'c' else IntelClCPPCompiler + cls = IntelClCCompiler if lang == Language.C else IntelClCPPCompiler self.coredata.add_lang_args(cls.language, cls, for_machine, self) linker = XilinkDynamicLinker(for_machine, [], version=version) return cls( @@ -1286,33 +1286,33 @@ class Environment: else: m = 'Failed to detect MSVC compiler target architecture: \'cl /?\' output is\n{}' raise EnvironmentException(m.format(cl_signature)) - cls = VisualStudioCCompiler if lang == 'c' else VisualStudioCPPCompiler + cls = VisualStudioCCompiler if lang == Language.C else VisualStudioCPPCompiler linker = self._guess_win_linker(['link'], cls, for_machine) return cls( compiler, version, for_machine, is_cross, info, exe_wrap, target, linker=linker) if 'PGI Compilers' in out: - cls = PGICCompiler if lang == 'c' else PGICPPCompiler + cls = PGICCompiler if lang == Language.C else PGICPPCompiler self.coredata.add_lang_args(cls.language, cls, for_machine, self) linker = PGIDynamicLinker(compiler, for_machine, cls.LINKER_PREFIX, [], version=version) return cls( ccache + compiler, version, for_machine, is_cross, info, exe_wrap, linker=linker) if '(ICC)' in out: - cls = IntelCCompiler if lang == 'c' else IntelCPPCompiler + cls = IntelCCompiler if lang == Language.C else IntelCPPCompiler l = self._guess_nix_linker(compiler, cls, for_machine) return cls( ccache + compiler, version, for_machine, is_cross, info, exe_wrap, full_version=full_version, linker=l) if 'ARM' in out: - cls = ArmCCompiler if lang == 'c' else ArmCPPCompiler + cls = ArmCCompiler if lang == Language.C else ArmCPPCompiler self.coredata.add_lang_args(cls.language, cls, for_machine, self) linker = ArmDynamicLinker(for_machine, version=version) return cls( ccache + compiler, version, for_machine, is_cross, info, exe_wrap, full_version=full_version, linker=linker) if 'RX Family' in out: - cls = CcrxCCompiler if lang == 'c' else CcrxCPPCompiler + cls = CcrxCCompiler if lang == Language.C else CcrxCPPCompiler self.coredata.add_lang_args(cls.language, cls, for_machine, self) linker = CcrxDynamicLinker(for_machine, version=version) return cls( @@ -1320,7 +1320,7 @@ class Environment: exe_wrap, full_version=full_version, linker=linker) if 'Microchip Technology' in out: - cls = Xc16CCompiler if lang == 'c' else Xc16CCompiler + cls = Xc16CCompiler if lang == Language.C else Xc16CCompiler self.coredata.add_lang_args(cls.language, cls, for_machine, self) linker = Xc16DynamicLinker(for_machine, version=version) return cls( @@ -1328,7 +1328,7 @@ class Environment: exe_wrap, full_version=full_version, linker=linker) if 'TMS320C2000 C/C++' in out: - cls = C2000CCompiler if lang == 'c' else C2000CPPCompiler + cls = C2000CCompiler if lang == Language.C else C2000CPPCompiler self.coredata.add_lang_args(cls.language, cls, for_machine, self) linker = C2000DynamicLinker(for_machine, version=version) return cls( @@ -1338,15 +1338,15 @@ class Environment: self._handle_exceptions(popen_exceptions, compilers) def detect_c_compiler(self, for_machine): - return self._detect_c_or_cpp_compiler('c', for_machine) + return self._detect_c_or_cpp_compiler(Language.C, for_machine) def detect_cpp_compiler(self, for_machine): - return self._detect_c_or_cpp_compiler('cpp', for_machine) + return self._detect_c_or_cpp_compiler(Language.CPP, for_machine) def detect_cuda_compiler(self, for_machine): popen_exceptions = {} is_cross = self.is_cross_build(for_machine) - compilers, ccache, exe_wrap = self._get_compilers('cuda', for_machine) + compilers, ccache, exe_wrap = self._get_compilers(Language.CUDA, for_machine) info = self.machines[for_machine] for compiler in compilers: if isinstance(compiler, str): @@ -1384,7 +1384,7 @@ class Environment: def detect_fortran_compiler(self, for_machine: MachineChoice): popen_exceptions = {} - compilers, ccache, exe_wrap = self._get_compilers('fortran', for_machine) + compilers, ccache, exe_wrap = self._get_compilers(Language.FORTRAN, for_machine) is_cross = self.is_cross_build(for_machine) info = self.machines[for_machine] for compiler in compilers: @@ -1503,7 +1503,7 @@ class Environment: def _detect_objc_or_objcpp_compiler(self, for_machine: MachineInfo, objc: bool) -> 'Compiler': popen_exceptions = {} - compilers, ccache, exe_wrap = self._get_compilers('objc' if objc else 'objcpp', for_machine) + compilers, ccache, exe_wrap = self._get_compilers(Language.OBJC if objc else Language.OBJCPP, for_machine) is_cross = self.is_cross_build(for_machine) info = self.machines[for_machine] @@ -1547,7 +1547,7 @@ class Environment: self._handle_exceptions(popen_exceptions, compilers) def detect_java_compiler(self, for_machine): - exelist = self.lookup_binary_entry(for_machine, 'java') + exelist = self.lookup_binary_entry(for_machine, Language.JAVA) info = self.machines[for_machine] if exelist is None: # TODO support fallback @@ -1569,7 +1569,7 @@ class Environment: raise EnvironmentException('Unknown compiler "' + ' '.join(exelist) + '"') def detect_cs_compiler(self, for_machine): - compilers, ccache, exe_wrap = self._get_compilers('cs', for_machine) + compilers, ccache, exe_wrap = self._get_compilers(Language.CS, for_machine) popen_exceptions = {} info = self.machines[for_machine] for comp in compilers: @@ -1594,7 +1594,7 @@ class Environment: self._handle_exceptions(popen_exceptions, compilers) def detect_vala_compiler(self, for_machine): - exelist = self.lookup_binary_entry(for_machine, 'vala') + exelist = self.lookup_binary_entry(for_machine, Language.VALA) is_cross = self.is_cross_build(for_machine) info = self.machines[for_machine] if exelist is None: @@ -1614,7 +1614,7 @@ class Environment: def detect_rust_compiler(self, for_machine): popen_exceptions = {} - compilers, ccache, exe_wrap = self._get_compilers('rust', for_machine) + compilers, ccache, exe_wrap = self._get_compilers(Language.RUST, for_machine) is_cross = self.is_cross_build(for_machine) info = self.machines[for_machine] @@ -1696,8 +1696,8 @@ class Environment: # Detect the target architecture, required for proper architecture handling on Windows. # MSVC compiler is required for correct platform detection. - c_compiler = {'c': self.detect_c_compiler(for_machine)} - is_msvc = isinstance(c_compiler['c'], VisualStudioCCompiler) + c_compiler = {Language.C: self.detect_c_compiler(for_machine)} + is_msvc = isinstance(c_compiler[Language.C], VisualStudioCCompiler) if not is_msvc: c_compiler = {} @@ -1707,7 +1707,7 @@ class Environment: popen_exceptions = {} is_cross = self.is_cross_build(for_machine) - results, ccache, exe_wrap = self._get_compilers('d', for_machine) + results, ccache, exe_wrap = self._get_compilers(Language.D, for_machine) for exelist in results: # Search for a D compiler. # We prefer LDC over GDC unless overridden with the DC @@ -1796,7 +1796,7 @@ class Environment: self._handle_exceptions(popen_exceptions, compilers) def detect_swift_compiler(self, for_machine): - exelist = self.lookup_binary_entry(for_machine, 'swift') + exelist = self.lookup_binary_entry(for_machine, Language.SWIFT) is_cross = self.is_cross_build(for_machine) info = self.machines[for_machine] if exelist is None: @@ -1819,36 +1819,36 @@ class Environment: raise EnvironmentException('Unknown compiler "' + ' '.join(exelist) + '"') - def compiler_from_language(self, lang: str, for_machine: MachineChoice): - if lang == 'c': + def compiler_from_language(self, lang: Language, for_machine: MachineChoice): + if lang == Language.C: comp = self.detect_c_compiler(for_machine) - elif lang == 'cpp': + elif lang == Language.CPP: comp = self.detect_cpp_compiler(for_machine) - elif lang == 'objc': + elif lang == Language.OBJC: comp = self.detect_objc_compiler(for_machine) - elif lang == 'cuda': + elif lang == Language.CUDA: comp = self.detect_cuda_compiler(for_machine) - elif lang == 'objcpp': + elif lang == Language.OBJCPP: comp = self.detect_objcpp_compiler(for_machine) - elif lang == 'java': + elif lang == Language.JAVA: comp = self.detect_java_compiler(for_machine) - elif lang == 'cs': + elif lang == Language.CS: comp = self.detect_cs_compiler(for_machine) - elif lang == 'vala': + elif lang == Language.VALA: comp = self.detect_vala_compiler(for_machine) - elif lang == 'd': + elif lang == Language.D: comp = self.detect_d_compiler(for_machine) - elif lang == 'rust': + elif lang == Language.RUST: comp = self.detect_rust_compiler(for_machine) - elif lang == 'fortran': + elif lang == Language.FORTRAN: comp = self.detect_fortran_compiler(for_machine) - elif lang == 'swift': + elif lang == Language.SWIFT: comp = self.detect_swift_compiler(for_machine) else: comp = None return comp - def detect_compiler_for(self, lang: str, for_machine: MachineChoice): + def detect_compiler_for(self, lang: Language, for_machine: MachineChoice): comp = self.compiler_from_language(lang, for_machine) if comp is not None: assert comp.for_machine == for_machine |