build: improve backtrace support/detection
libexecinfo is used to provide backtrace() on *BSD. The API is
compatible with glibc's, so this is a "free" improvement.
To improve configure behaviour, the following configure options are
modified/introduced:
* --enable-gcc-rdynamic now defaults to "on" if the compiler is gcc.
(I sadly wasn't able to find any documentation on the availability of
this option for llvm, even though at least the version I have
installed does support it)
* --enable-backtrace has been added. This behaves as off/auto/on
switch, i.e. giving either {dis,en}able will result in the requested
behaviour (or an error if support wasn't found)
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
diff --git a/configure.ac b/configure.ac
index ff7a4d5..8964006 100755
--- a/configure.ac
+++ b/configure.ac
@@ -273,7 +273,9 @@
AC_ARG_ENABLE(linux24_tcp_md5,
[ --enable-linux24-tcp-md5 enable support for old, Linux-2.4 RFC2385 patch])
AC_ARG_ENABLE(gcc-rdynamic,
-[ --enable-gcc-rdynamic enable gcc linking with -rdynamic for better backtraces])
+[ --enable-gcc-rdynamic enable linking with -rdynamic for better backtraces (default if gcc)])
+AC_ARG_ENABLE(backtrace,
+[ --disable-backtrace, disable crash backtraces (default autodetect)])
AC_ARG_ENABLE(time-check,
[ --disable-time-check disable slow thread warning messages])
AC_ARG_ENABLE(pcreposix,
@@ -288,8 +290,10 @@
CFLAGS="${CFLAGS} -Wpacked -Wpadded"
fi
-if test x"${enable_gcc_rdynamic}" = x"yes" ; then
- LDFLAGS="${LDFLAGS} -rdynamic"
+if test x"${enable_gcc_rdynamic}" != x"no" ; then
+ if test x"${enable_gcc_rdynamic}" = x"yes" -o x"$COMPILER" = x"GCC"; then
+ LDFLAGS="${LDFLAGS} -rdynamic"
+ fi
fi
if test x"${enable_time_check}" != x"no" ; then
@@ -1566,12 +1570,21 @@
dnl ---------------------------
dnl check for glibc 'backtrace'
dnl ---------------------------
-AC_CHECK_HEADER([execinfo.h],
- [AC_CHECK_FUNC([backtrace],
- [AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
- AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
+if test x"${enable_backtrace}" != x"no" ; then
+ backtrace_ok=no
+ AC_CHECK_HEADER([execinfo.h], [
+ AC_SEARCH_LIBS([backtrace], [execinfo], [
+ AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
+ AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
+ backtrace_ok=yes
+ ],, [-lm])
])
-])
+
+ if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
+ dnl user explicitly requested backtrace but we failed to find support
+ AC_MSG_FAILURE([failed to find backtrace support])
+ fi
+fi
dnl -----------------------------------------
dnl check for malloc mallinfo struct and call