commit:     2170307e8e09491f88b0c5f41d42aa096d1b3632
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Fri Oct  7 15:02:28 2022 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Mon Oct 10 20:52:34 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=2170307e

toolchain-funcs.eclass: Add tc-get-cxx-stdlib() to get C++ stdlib

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 <mgorny <AT> gentoo.org>

 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

Reply via email to