From 0ef249aa26f653677c5368bb51af34f7577ba5b9 Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Wed, 27 Apr 2022 15:10:05 -0400 Subject: Introduce package to capture dependency on C++ stdlib Here we introduce a new "virtual" package into the initial package database, `system-cxx-std-lib`. This gives users a convenient, platform agnostic way to link against C++ libraries, addressing #20010. Fixes #20010. --- m4/fp_find_cxx_std_lib.m4 | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 m4/fp_find_cxx_std_lib.m4 (limited to 'm4') diff --git a/m4/fp_find_cxx_std_lib.m4 b/m4/fp_find_cxx_std_lib.m4 new file mode 100644 index 0000000000..d0bb3195c6 --- /dev/null +++ b/m4/fp_find_cxx_std_lib.m4 @@ -0,0 +1,58 @@ +# FP_FIND_CXX_STD_LIB +# ------------------- +# +# Identify which C++ standard library implementation the C++ toolchain links +# against. +AC_DEFUN([FP_FIND_CXX_STD_LIB],[ + # If this is non-empty then assume that the user has specified these + # manually. + if test -z "$CXX_STD_LIB_LIBS"; then + cat >actest.cpp <<-EOF +#include +#if defined(_LIBCPP_VERSION) +libc++ +#elif defined(__GLIBCXX__) +libstdc++ +#else +unknown +#endif +EOF + AC_MSG_CHECKING([C++ standard library flavour]) + if "$CXX" -E actest.cpp -o actest.out; then + if grep "libc++" actest.out; then + CXX_STD_LIB_LIBS="c++ c++abi" + p="`"$CXX" --print-file-name libc++.so`" + d="`dirname "$p"`" + dnl On some platforms (e.g. Windows) the C++ standard library + dnl can be found in the system search path. In this case $CXX + dnl --print-file-name will simply print the filename without a + dnl directory part. Consequently, dirname will return `.`. However, + dnl we don't want to include such paths in the package database. + if test "$d" = "."; then d=""; fi + CXX_STD_LIB_LIB_DIRS="$d" + CXX_STD_LIB_DYN_LIB_DIRS="$d" + AC_MSG_RESULT([libc++]) + elif grep "libstdc++" actest.out; then + CXX_STD_LIB_LIBS="stdc++" + p="`"$CXX" --print-file-name libstdc++.so`" + d="`dirname "$p"`" + if test "$d" = "."; then d=""; fi + CXX_STD_LIB_LIB_DIRS="$d" + CXX_STD_LIB_DYN_LIB_DIRS="$d" + AC_MSG_RESULT([libstdc++]) + else + rm -f actest.cpp actest.out + AC_MSG_ERROR([Unknown C++ standard library implementation.]) + fi + rm -f actest.cpp actest.out + else + rm -f actest.cpp actest.out + AC_MSG_ERROR([Failed to compile test program]) + fi + fi + + AC_SUBST([CXX_STD_LIB_LIBS]) + AC_SUBST([CXX_STD_LIB_LIB_DIRS]) + AC_SUBST([CXX_STD_LIB_DYN_LIB_DIRS]) +]) + -- cgit v1.2.1