83 lines
2.9 KiB
Plaintext
83 lines
2.9 KiB
Plaintext
# stack-trace.m4
|
|
# serial 3
|
|
dnl Copyright (C) 2024 Free Software Foundation, Inc.
|
|
dnl This file is free software; the Free Software Foundation
|
|
dnl gives unlimited permission to copy and/or distribute it,
|
|
dnl with or without modifications, as long as this notice is preserved.
|
|
dnl This file is offered as-is, without any warranty.
|
|
|
|
AC_DEFUN([gl_STACK_TRACE_EARLY],
|
|
[
|
|
AC_MSG_CHECKING([whether to enable debugging facilities])
|
|
AC_ARG_ENABLE([debug],
|
|
[AS_HELP_STRING([[--disable-debug]],
|
|
[turn off debugging facilities])],
|
|
[case "$enableval" in
|
|
yes | no) ;;
|
|
*) AC_MSG_WARN([invalid argument supplied to --enable-debug])
|
|
enable_debug=yes
|
|
;;
|
|
esac
|
|
],
|
|
[enable_debug=yes])
|
|
AC_MSG_RESULT([$enable_debug])
|
|
|
|
AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
|
|
if test $enable_debug = yes; then
|
|
dnl The first choice is libbacktrace by Ian Lance Taylor.
|
|
dnl Maintained at https://github.com/ianlancetaylor/libbacktrace,
|
|
dnl mirrored into GCC, installed as part of GCC by a few distros.
|
|
dnl It produces source file names and line numbers, if the binary
|
|
dnl is compiled with debug information.
|
|
AC_CACHE_CHECK([for libbacktrace], [gl_cv_lib_backtrace], [
|
|
gl_saved_LIBS="$LIBS"
|
|
LIBS="$gl_saved_LIBS -lbacktrace"
|
|
AC_LINK_IFELSE(
|
|
[AC_LANG_PROGRAM(
|
|
[[#include <backtrace.h>
|
|
]],
|
|
[[struct backtrace_state *state =
|
|
backtrace_create_state (NULL, 0, NULL, NULL);
|
|
]])],
|
|
[gl_cv_lib_backtrace=yes],
|
|
[gl_cv_lib_backtrace=no])
|
|
LIBS="$gl_saved_LIBS"
|
|
])
|
|
if test $gl_cv_lib_backtrace = yes; then
|
|
AC_DEFINE([HAVE_LIBBACKTRACE], [1],
|
|
[Define if you have the libbacktrace library.])
|
|
CAN_PRINT_STACK_TRACE=1
|
|
LIBS="$LIBS -lbacktrace"
|
|
else
|
|
dnl The second choice is libexecinfo.
|
|
dnl It does not produce source file names and line numbers, only addresses
|
|
dnl (which are mostly useless due to ASLR) and _sometimes_ function names.
|
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
|
case "$host_os" in
|
|
*-gnu* | gnu* | darwin* | freebsd* | dragonfly* | netbsd* | openbsd* | solaris*)
|
|
dnl execinfo might be implemented on this platform.
|
|
CAN_PRINT_STACK_TRACE=1
|
|
dnl On *BSD system, link all programs with -lexecinfo. Cf. m4/execinfo.m4.
|
|
case "$host_os" in
|
|
freebsd* | dragonfly* | netbsd* | openbsd*)
|
|
LIBS="$LIBS -lexecinfo"
|
|
;;
|
|
esac
|
|
dnl Link all programs in such a way that the stack trace includes the
|
|
dnl function names. '-rdynamic' is equivalent to '-Wl,-export-dynamic'.
|
|
case "$host_os" in
|
|
*-gnu* | gnu* | openbsd*)
|
|
LDFLAGS="$LDFLAGS -rdynamic"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
fi
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN([gl_STACK_TRACE],
|
|
[
|
|
AC_REQUIRE([AC_C_INLINE])
|
|
])
|