Add a new tc-get-cxx-stdlib() that attempts to get the C++ stdlib
variant used by the current C++ compiler.  Currently it supports libc++
and libstdc++ (GCC's stdlib).

Signed-off-by: Michał Górny <[email protected]>
---
 eclass/tests/toolchain-funcs.sh | 22 ++++++++++++++++++++
 eclass/toolchain-funcs.eclass   | 36 +++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/eclass/tests/toolchain-funcs.sh b/eclass/tests/toolchain-funcs.sh
index 56379b10cded..5a35a44ce018 100755
--- a/eclass/tests/toolchain-funcs.sh
+++ b/eclass/tests/toolchain-funcs.sh
@@ -198,4 +198,26 @@ for compiler in gcc clang not-really-a-compiler; do
        fi
 done
 
+if type -P gcc &>/dev/null; then
+       tbegin "tc-get-cxx-stdlib (gcc)"
+       [[ $(CXX=g++ tc-get-cxx-stdlib) == libstdc++ ]]
+       tend $?
+fi
+
+if type -P clang &>/dev/null; then
+       for stdlib in libc++ libstdc++; do
+               if clang++ -stdlib=${stdlib} -x c++ -E -P - &>/dev/null \
+                       <<<'#include <ciso646>'
+               then
+                       tbegin "tc-get-cxx-stdlib (clang, ${stdlib})"
+                       [[ $(CXX=clang++ CXXFLAGS="-stdlib=${stdlib}" 
tc-get-cxx-stdlib) == ${stdlib} ]]
+                       tend $?
+               fi
+       done
+
+       tbegin "tc-get-cxx-stdlib (clang, invalid)"
+       ! CXX=clang++ CXXFLAGS="-stdlib=invalid" tc-get-cxx-stdlib
+       tend $?
+fi
+
 texit
diff --git a/eclass/toolchain-funcs.eclass b/eclass/toolchain-funcs.eclass
index 48bf11606c4a..92494158201e 100644
--- a/eclass/toolchain-funcs.eclass
+++ b/eclass/toolchain-funcs.eclass
@@ -1173,4 +1173,40 @@ gen_usr_ldscript() {
        done
 }
 
+# @FUNCTION: tc-get-cxx-stdlib
+# @DESCRIPTION:
+# Attempt to identify the C++ standard library used by the compiler.
+# If the library is identified, the function returns 0 and prints one
+# of the following:
+#
+# - ``libc++`` for ``sys-libs/libcxx``
+# - ``libstdc++`` for ``sys-devel/gcc``'s libstdc++
+#
+# If the library is not recognized, the function returns 1.
+tc-get-cxx-stdlib() {
+       local code='#include <ciso646>
+
+#if defined(_LIBCPP_VERSION)
+       HAVE_LIBCXX
+#elif defined(__GLIBCXX__)
+       HAVE_LIBSTDCPP
+#endif
+'
+       local res=$(
+               $(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - \
+                       <<<"${code}" 2>/dev/null
+       )
+
+       case ${res} in
+               *HAVE_LIBCXX*)
+                       echo libc++;;
+               *HAVE_LIBSTDCPP*)
+                       echo libstdc++;;
+               *)
+                       return 1;;
+       esac
+
+       return 0
+}
+
 fi
-- 
2.38.0


Reply via email to