#!/usr/bin/env python # Copyright (c) 2012 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Compiler version checking tool for gcc Print gcc version as XY if you are running gcc X.Y.*. This is used to tweak build flags for gcc 4.4. """ import os import re import subprocess import sys def GetVersion(compiler): try: # Note that compiler could be something tricky like "distcc g++". compiler = compiler + " -dumpversion" pipe = subprocess.Popen(compiler, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) gcc_output, gcc_error = pipe.communicate() if pipe.returncode: raise subprocess.CalledProcessError(pipe.returncode, compiler) result = re.match(r"(\d+)\.(\d+)", gcc_output) return result.group(1) + result.group(2) except Exception, e: if gcc_error: sys.stderr.write(gcc_error) print >> sys.stderr, "compiler_version.py failed to execute:", compiler print >> sys.stderr, e return "" def GetVersionFromEnvironment(compiler_env): """ Returns the version of compiler If the compiler was set by the given environment variable and exists, return its version, otherwise None is returned. """ cxx = os.getenv(compiler_env, None) if cxx: cxx_version = GetVersion(cxx) if cxx_version != "": return cxx_version return None def main(): # Check if CXX_target or CXX environment variable exists an if it does use # that compiler. # TODO: Fix ninja (see http://crbug.com/140900) instead and remove this code # In ninja's cross compile mode, the CXX_target is target compiler, while # the CXX is host. The CXX_target needs be checked first, though the target # and host compiler have different version, there seems no issue to use the # target compiler's version number as gcc_version in Android. cxx_version = GetVersionFromEnvironment("CXX_target") if cxx_version: print cxx_version return 0 cxx_version = GetVersionFromEnvironment("CXX") if cxx_version: print cxx_version return 0 # Otherwise we check the g++ version. gccversion = GetVersion("g++") if gccversion != "": print gccversion return 0 return 1 if __name__ == "__main__": sys.exit(main())