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 | 40 ++++++++++++++++++++++++++++++++++++++++
eclass/toolchain-funcs.eclass | 22 ++++++++++++++++++++++
2 files changed, 62 insertions(+)
diff --git a/eclass/tests/toolchain-funcs.sh b/eclass/tests/toolchain-funcs.sh
index 41c1ae5..6f37996 100755
--- a/eclass/tests/toolchain-funcs.sh
+++ b/eclass/tests/toolchain-funcs.sh
@@ -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
diff --git a/eclass/toolchain-funcs.eclass b/eclass/toolchain-funcs.eclass
index 1baab96..a29784c 100644
--- a/eclass/toolchain-funcs.eclass
+++ b/eclass/toolchain-funcs.eclass
@@ -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
--
2.9.0