diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index 76b22059a..fe89f0eba 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -400,9 +400,9 @@ class Environment: errmsg += '\nRunning "{0}" gave "{1}"'.format(c, e) raise EnvironmentException(errmsg) - def detect_c_compiler(self, want_cross): + def _detect_c_or_cpp_compiler(self, lang, evar, want_cross): popen_exceptions = {} - compilers, ccache, is_cross, exe_wrap = self._get_compilers('c', 'CC', want_cross) + compilers, ccache, is_cross, exe_wrap = self._get_compilers(lang, evar, want_cross) for compiler in compilers: if isinstance(compiler, str): compiler = [compiler] @@ -424,24 +424,34 @@ class Environment: continue gtype = self.get_gnu_compiler_type(defines) version = self.get_gnu_version_from_defines(defines) - return GnuCCompiler(ccache + compiler, version, gtype, is_cross, exe_wrap, defines) + cls = GnuCCompiler if lang == 'c' else GnuCPPCompiler + return cls(ccache + compiler, version, gtype, is_cross, exe_wrap, defines) if 'clang' in out: if 'Apple' in out or for_darwin(want_cross, self): cltype = CLANG_OSX else: cltype = CLANG_STANDARD - return ClangCCompiler(ccache + compiler, version, cltype, is_cross, exe_wrap) + cls = ClangCCompiler if lang == 'c' else ClangCPPCompiler + return cls(ccache + compiler, version, cltype, is_cross, exe_wrap) if 'Microsoft' in out or 'Microsoft' in err: # Visual Studio prints version number to stderr but # everything else to stdout. Why? Lord only knows. version = search_version(err) - return VisualStudioCCompiler(compiler, version, is_cross, exe_wrap) + cls = VisualStudioCCompiler if lang == 'c' else VisualStudioCPPCompiler + return cls(compiler, version, is_cross, exe_wrap) if '(ICC)' in out: # TODO: add microsoft add check OSX inteltype = ICC_STANDARD - return IntelCCompiler(ccache + compiler, version, inteltype, is_cross, exe_wrap) + cls = IntelCCompiler if lang == 'c' else IntelCPPCompiler + return cls(ccache + compiler, version, inteltype, is_cross, exe_wrap) self._handle_compiler_exceptions(popen_exceptions, compilers) + def detect_c_compiler(self, want_cross): + return self._detect_c_or_cpp_compiler('c', 'CC', want_cross) + + def detect_cpp_compiler(self, want_cross): + return self._detect_c_or_cpp_compiler('cpp', 'CXX', want_cross) + def detect_fortran_compiler(self, want_cross): popen_exceptions = {} compilers, ccache, is_cross, exe_wrap = self._get_compilers('fortran', 'FC', want_cross) @@ -496,46 +506,6 @@ class Environment: path = os.path.split(__file__)[0] return os.path.join(path, 'depfixer.py') - def detect_cpp_compiler(self, want_cross): - popen_exceptions = {} - compilers, ccache, is_cross, exe_wrap = self._get_compilers('cpp', 'CXX', want_cross) - for compiler in compilers: - if isinstance(compiler, str): - compiler = [compiler] - basename = os.path.basename(compiler[-1]).lower() - if basename == 'cl' or basename == 'cl.exe': - arg = '/?' - else: - arg = '--version' - try: - p, out, err = Popen_safe(compiler + [arg]) - except OSError as e: - popen_exceptions[' '.join(compiler + [arg])] = e - continue - version = search_version(out) - if 'Free Software Foundation' in out: - defines = self.get_gnu_compiler_defines(compiler) - if not defines: - popen_exceptions[compiler] = 'no pre-processor defines' - continue - gtype = self.get_gnu_compiler_type(defines) - version = self.get_gnu_version_from_defines(defines) - return GnuCPPCompiler(ccache + compiler, version, gtype, is_cross, exe_wrap, defines) - if 'clang' in out: - if 'Apple' in out: - cltype = CLANG_OSX - else: - cltype = CLANG_STANDARD - return ClangCPPCompiler(ccache + compiler, version, cltype, is_cross, exe_wrap) - if 'Microsoft' in out or 'Microsoft' in err: - version = search_version(err) - return VisualStudioCPPCompiler(compiler, version, is_cross, exe_wrap) - if '(ICC)' in out: - # TODO: add microsoft add check OSX - inteltype = ICC_STANDARD - return IntelCPPCompiler(ccache + compiler, version, inteltype, is_cross, exe_wrap) - self._handle_compiler_exceptions(popen_exceptions, compilers) - def detect_objc_compiler(self, want_cross): popen_exceptions = {} compilers, ccache, is_cross, exe_wrap = self._get_compilers('objc', 'OBJC', want_cross)