Add C++ Standard detection to configure and fix a new C++20 compile issue

* The autoconf-archive package contains macros useful for detecting C++
  standard and testing other C++ capabilities but that package was never
  included in the install_prereq script so many existing build environments
  won't have it.  Even if it is installed, older versions won't newer C++
  standards and will actually cause an error if you try to test for that
  version. To make it available for those environments, the
  ax_cxx_compile_stdcxx.m4 macro has copied from the latest release of
  autoconf-archive into the autoconf directory.

* A convenience wrapper(ast_cxx_check_std) around ax_cxx_compile_stdcxx was
  also added so checking the standard version and setting the
  asterisk-specific PBX_ variables becomes a one-liner:
  `AST_CXX_CHECK_STD([std], [force_latest_std])`.
  Calling that with a version of `17` for instance, will set PBX_CXX17
  to 0 or 1 depending on whether the current c++ compiler supports stdc++17.
  HAVE_CXX17 will also be 'defined" or not depending on the result.

* C++ compilers hardly ever default to the latest standard they support.  g++
  version 14 for instance supports up to C++23 but only uses C++17 by default.
  If you want to use C++23, you have to add `-std=gnu++=23` to the g++
  command line.  If you set the second argument of AST_CXX_CHECK_STD to "yes",
  the macro will automatically keep the highest `-std=gnu++` value that
  worked and pass that to the Makefiles.

* The autoconf-archive package was added to install_prereq for future use.

* Updated configure.ac to use AST_CXX_CHECK_STD() to check for C++
  versions 11, 14, 17, 20 and 23.

* Updated configure.ac to accept the `--enable-latest-cxx-std` option which
  will set the second option to AST_CXX_CHECK_STD() to "yes".  The default
  is "no".

* ast_copy_string() in strings.h declares the 'sz' variable as volatile and
  does an `sz--` on it later.  C++20 no longer allows the `++` and `--`
  increment and decrement operators to be used on variables declared as
  volatile however so that was changed to `sz -= 1`.

(cherry picked from commit 79427c1ac1)
This commit is contained in:
George Joseph
2025-01-03 15:38:52 -07:00
committed by Asterisk Development Team
parent 3fe5aafd03
commit 4eae3395a7
10 changed files with 16995 additions and 3614 deletions

View File

@@ -240,6 +240,25 @@ fi
AC_PROG_CXX
AC_PROG_CPP
AC_PROG_CXXCPP
# Do we want to force the C++ compiler to use the latest standard it supports?
AC_ARG_ENABLE([latest-cxx-std],
[AS_HELP_STRING([--enable-latest-cxx-std],
[Force C++ compiler to use the latest standard it supports])],
[case "${enableval}" in
y|ye|yes) ENABLE_LATEST_CXX_STD=yes ;;
n|no) ENABLE_LATEST_CXX_STD=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-latest-cxx-std) ;;
esac], [ENABLE_LATEST_CXX_STD=no])
# Check to see if the C++ compiler supports STDC++11,14,17,20,23
# These MUST be in ascending order.
AST_CXX_CHECK_STD([11], [${ENABLE_LATEST_CXX_STD}])
AST_CXX_CHECK_STD([14], [${ENABLE_LATEST_CXX_STD}])
AST_CXX_CHECK_STD([17], [${ENABLE_LATEST_CXX_STD}])
AST_CXX_CHECK_STD([20], [${ENABLE_LATEST_CXX_STD}])
AST_CXX_CHECK_STD([23], [${ENABLE_LATEST_CXX_STD}])
# This macro is just copied into our local acinclude.m4 from libtool.m4 so that
# the developers regenerating the configure script don't have to install libtool.
AST_PROG_LD # note, does not work on FreeBSD
@@ -844,7 +863,7 @@ AC_FUNC_CLOSEDIR_VOID
AC_FUNC_ERROR_AT_LINE
AST_FUNC_FORK
AC_FUNC_FSEEKO
AC_PROG_GCC_TRADITIONAL
# AC_PROG_GCC_TRADITIONAL Obsolete
# XXX: these are commented out until we determine whether it matters if our malloc()
# acts exactly like glibc's or not
# AC_FUNC_MALLOC