summaryrefslogtreecommitdiffstats
path: root/m4macros/ax_cpp20.m4
diff options
context:
space:
mode:
authorAndrei Pavel <andrei@isc.org>2022-10-05 16:18:35 +0200
committerAndrei Pavel <andrei@isc.org>2022-10-21 16:45:24 +0200
commit38c7b0f4e74e49d5808bf9fc4c79333ee6b3291a (patch)
tree9e67f638e6e400c2ffe3f42ab2dfb7226093787f /m4macros/ax_cpp20.m4
parent[#2311] migrate autoconf to libyang2 and sysrepo2 (diff)
downloadkea-38c7b0f4e74e49d5808bf9fc4c79333ee6b3291a.tar.xz
kea-38c7b0f4e74e49d5808bf9fc4c79333ee6b3291a.zip
[#2311] detect C++20 in autoconf
And enforce -std=c++20 when building --with-libyang-cpp or --with-sysrepo-cpp.
Diffstat (limited to 'm4macros/ax_cpp20.m4')
-rw-r--r--m4macros/ax_cpp20.m433
1 files changed, 33 insertions, 0 deletions
diff --git a/m4macros/ax_cpp20.m4 b/m4macros/ax_cpp20.m4
new file mode 100644
index 0000000000..da116c9dd4
--- /dev/null
+++ b/m4macros/ax_cpp20.m4
@@ -0,0 +1,33 @@
+AC_DEFUN([AX_ISC_CPP20], [
+ AC_MSG_CHECKING(c++20 support)
+
+ # Save flags.
+ CPPFLAGS_SAVED="${CPPFLAGS}"
+ LIBS_SAVED="${LIBS}"
+
+ # Provide -std=c++20 flag temporarily.
+ CPPFLAGS="${CPPFLAGS} -std=c++20"
+
+ # Simulate the definition of std::derived_from.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [#include <concepts>
+ template<class Derived, class Base>
+ concept derived_from =
+ std::is_base_of_v<Base, Derived> &&
+ std::is_convertible_v<const volatile Derived*, const volatile Base*>;
+
+ struct BaseClass {};
+ struct DerivedClass : BaseClass {};
+ ],
+ [static_assert(std::derived_from<BaseClass, DerivedClass> == false);
+ static_assert(std::derived_from<DerivedClass, BaseClass> == true);]
+ )],
+ [AC_MSG_RESULT([yes])
+ CPP20_SUPPORTED=true],
+ [AC_MSG_RESULT([no])
+ CPP20_SUPPORTED=false])
+
+ # Restore flags.
+ CPPFLAGS="${CPPFLAGS_SAVED}"
+])