1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
# ==============================================================================
# http://www.nongnu.org/autoconf-archive/ax_cxx_verbose_terminate_handler.html
# ==============================================================================
#
# SYNOPSIS
#
# AX_CXX_VERBOSE_TERMINATE_HANDLER
#
# DESCRIPTION
#
# Check if the terminate handler for the current compiler/standard library
# prints useful information to stdout/stderr (i.e. the type of the
# uncaught exception and/or the what() string).
#
# The intended use case for this check is to help program authors decide
# if they need to add a top-level try-catch or custom terminate handler to
# print useful information if an uncaught exception occurs, or if this
# task can be left to the standard library implementation. Alternatively,
# it can be used to detect if such output needs to be silenced with a
# custom terminate handler.
#
# Output:
#
# Define HAVE_VERBOSE_TERMINATE_HANDLER if useful information is printed.
#
# LICENSE
#
# Copyright (c) 2009 Kevin Locke <klocke@digitalenginesoftware.com>
# Copyright (c) 2008 Lapo Luchini <lapo@lapo.it>
#
# Copying and distribution of this file, with or without modification, is
# permitted in any medium, without royalty, provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
AC_DEFUN([AX_CXX_VERBOSE_TERMINATE_HANDLER],
[AC_CACHE_CHECK([whether the terminate function prints useful information],
[ax_cv_cxx_verbose_terminate_handler],
[
AC_LANG_PUSH([C++])
AC_RUN_IFELSE(
[AC_LANG_PROGRAM(
[#include <stdexcept>],
[throw std::runtime_error("Test of unhandled exception AABBCCDDEE");])],
dnl The test should never return 0, since it aborts
[ax_cv_cxx_verbose_terminate_handler=no],
dnl If the compilation was successful, run it and capture the output
[AS_IF([test -x conftest$EXEEXT],
[_output="$(./conftest$EXEEXT 2>&1)"],
[_output=""])
dnl Check that the output contains the what() string
AS_CASE("$_output",
[*AABBCCDDEE*],
dnl Check that the output also contains the exception type
[AS_CASE("$_output",
[*runtime_error*],
[ax_cv_cxx_verbose_terminate_handler=yes],
[ax_cv_cxx_verbose_terminate_handler=no])],
[ax_cv_cxx_verbose_terminate_handler=no])
],
dnl When cross-compiling, assume messages are not verbose
[ax_cv_cxx_verbose_terminate_handler=no])
AC_LANG_POP([C++])
])
if test "$ax_cv_cxx_verbose_terminate_handler" = yes; then
AC_DEFINE([HAVE_VERBOSE_TERMINATE_HANDLER], 1,
[define if the terminate function prints useful information])
fi
])
|