Add support for libstdc++ assertions in autoconf builds

This is less powerful than stdlib-debug, but at least it does not
change the ABI. This avoids crashes with Qt6 in particular.

The new defaults are:
- stdlib-assertions is enabled by default in development builds;
- stdlib-debug has to be enabled explicitely.

Fixes bug #12215.
This commit is contained in:
Jean-Marc Lasgouttes 2022-12-04 19:22:38 +01:00
parent 6f4f7442ef
commit e658113ea6
2 changed files with 34 additions and 14 deletions

22
INSTALL
View File

@ -109,12 +109,13 @@ flags:
release prerelease development profiling gprof
optimization -O2 -O2 -O -O2 -O2
assertions X X
stdlib-debug X
stdlib-assertions X
stdlib-debug
warnings X X
debug X X X X
maintainer-mode X
The defaults are as follows in terms of version number
The defaults are as follows in terms of version number:
release: stable release (2.x.y)
prerelease: version number contains `alpha', `beta', `rc' or `pre'.
development: version number contains `dev'.
@ -228,12 +229,17 @@ values):
code which checks that some variables have sane values. Opposite
is --disable-assertions.
o --enable-stdlib-debug adds some debug code in the standard
library; this slows down the code, but has been helpful in the
past to find bugs. Note that this is in general incompatible with
the system hunspell library (as of version 1.5). You may have to use
--disable-stdlib-debug when linking development versions against
your system's hunspell library.
o --enable-stdlib-assertions adds some bound checking code in the
libstdc++ standard library; this slows down the code, but has been
helpful in the past to find bugs. This has no effect when using
llvm's libc++ library.
o --enable-stdlib-debug encompasses stdlib-assertions and adds
additional checks in libstdc++. Note that this changes the ABI and
is in general incompatible with the system hunspell library (as of
version 1.5). You may have to use --disable-stdlib-debug when
linking development versions against your system's hunspell
library. This has no effect when using llvm's libc++ library.

View File

@ -310,9 +310,14 @@ AC_ARG_ENABLE(debug,
)
AC_ARG_ENABLE(stdlib-debug,
AS_HELP_STRING([--enable-stdlib-debug],[enable debug mode in the standard library]),,
[AS_CASE([$build_type], [dev*], [enable_stdlib_debug=yes],
[enable_stdlib_debug=no])]
AS_HELP_STRING([--enable-stdlib-debug],[enable debug mode in libstdc++]),,
[enable_stdlib_debug=no]
)
AC_ARG_ENABLE(stdlib-assertions,
AS_HELP_STRING([--enable-stdlib-assertions],[enable assertions in libstdc++]),,
[AS_CASE([$build_type], [dev*], [enable_stdlib_assertions=yes],
[enable_stdlib_assertions=no])]
)
### set up optimization
@ -357,6 +362,10 @@ if test x$GXX = xyes; then
CXX_VERSION="($clang_version)"
fi
case $gxx_version in
2.*|3.*|4.@<:@0-8@:>@*) AC_MSG_ERROR([gcc >= 4.9 is required]);;
esac
AM_CXXFLAGS="$lyx_optim $AM_CXXFLAGS"
if test x$enable_debug = xyes ; then
AM_CXXFLAGS="-g $AM_CXXFLAGS"
@ -381,9 +390,6 @@ if test x$GXX = xyes; then
[AM_CXXFLAGS="$AM_CXXFLAGS -Wno-deprecated-copy"], [], [-Werror])
AC_LANG_POP(C++)
fi
case $gxx_version in
2.*|3.*|4.@<:@0-8@:>@*) AC_MSG_ERROR([gcc >= 4.9 is required]);;
esac
if test x$enable_stdlib_debug = xyes ; then
dnl FIXME: for clang/libc++, one should define _LIBCPP_DEBUG2=0
dnl See http://clang-developers.42468.n3.nabble.com/libc-debug-mode-td3336742.html
@ -396,6 +402,14 @@ if test x$GXX = xyes; then
enable_stdlib_debug=no
fi
fi
if test x$enable_stdlib_assertions = xyes ; then
if test x$lyx_cv_lib_stdcxx = xyes ; then
lyx_flags="$lyx_flags stdlib-assertions"
AC_DEFINE(_GLIBCXX_ASSERTIONS, 1, [libstdc++ assertions mode])
else
enable_stdlib_assertions=no
fi
fi
fi
# Some additional flags may be needed