toolchain-funcs.eclass: Add tc-get-compiler-type()
authorMichał Górny <mgorny@gentoo.org>
Wed, 22 Jun 2016 19:50:21 +0000 (21:50 +0200)
committerMichał Górny <mgorny@gentoo.org>
Sun, 26 Jun 2016 15:34:47 +0000 (17:34 +0200)
Add a tc-get-compiler-type() function that can be used to identify
the compiler being used, using the preprocessor defines. Alike
gcc-*version() routines, it uses CPP (which in turn uses CC).

The major usage would be applying compiler-specific quirks and limiting
gcc version checks to compilers that actually are gcc, since e.g. clang
reports gcc version 4.2 -- which would incorrectly cause numerous gcc
version checks in ebuilds to fail.

eclass/tests/toolchain-funcs.sh
eclass/toolchain-funcs.eclass

index 41c1ae59306bbd231afe0d1a9534bfcdc31781dd..6f3799679a0057b4c63bd2a782b7b01ad81adcb3 100755 (executable)
@@ -111,5 +111,45 @@ tc-ld-disable-gold
 )
 tend $?
 
+unset CPP
+
+tbegin "tc-get-compiler-type (gcc)"
+(
+export CC=gcc
+[[ $(tc-get-compiler-type) == gcc ]]
+)
+tend $?
+
+if type -P clang &>/dev/null; then
+       tbegin "tc-get-compiler-type (clang)"
+       (
+       export CC=clang
+       [[ $(tc-get-compiler-type) == clang ]]
+       )
+       tend $?
+fi
+
+if type -P pathcc &>/dev/null; then
+       tbegin "tc-get-compiler-type (pathcc)"
+       (
+       export CC=pathcc
+       [[ $(tc-get-compiler-type) == pathcc ]]
+       )
+       tend $?
+
+       tbegin "! tc-is-gcc (pathcc)"
+       (
+       export CC=pathcc
+       ! tc-is-gcc
+       )
+       tend $?
+
+       tbegin "! tc-is-clang (pathcc)"
+       (
+       export CC=pathcc
+       ! tc-is-clang
+       )
+       tend $?
+fi
 
 texit
index 1baab96aeb709d7438bc1af07a272e13647fdb21..a29784cd14a4072151c68bfc44f4e4909362fac1 100644 (file)
@@ -585,6 +585,28 @@ tc-endian() {
        esac
 }
 
+# @FUNCTION: tc-get-compiler-type
+# @RETURN: keyword identifying the compiler: gcc, clang, pathcc, unknown
+tc-get-compiler-type() {
+       local code='
+#if defined(__PATHSCALE__)
+       HAVE_PATHCC
+#elif defined(__clang__)
+       HAVE_CLANG
+#elif defined(__GNUC__)
+       HAVE_GCC
+#endif
+'
+       local res=$($(tc-getCPP "$@") -E -P - <<<"${code}")
+
+       case ${res} in
+               *HAVE_PATHCC*)  echo pathcc;;
+               *HAVE_CLANG*)   echo clang;;
+               *HAVE_GCC*)             echo gcc;;
+               *)                              echo unknown;;
+       esac
+}
+
 # Internal func.  The first argument is the version info to expand.
 # Query the preprocessor to improve compatibility across different
 # compilers rather than maintaining a --version flag matrix. #335943