summaryrefslogtreecommitdiff
path: root/m4
diff options
context:
space:
mode:
authorPeter Simons <simons@cryp.to>2009-12-17 20:23:25 +0100
committerPeter Simons <simons@cryp.to>2009-12-17 23:51:48 +0100
commitdf5181a03b1f00d1badd868cf55b0cfcd2d71932 (patch)
tree20095a37adcf70073150eec1ffb2a63b133d50f7 /m4
parent4731a89b700698c672f1c384eb6bdbc1ec13a2e7 (diff)
downloadautoconf-archive-df5181a03b1f00d1badd868cf55b0cfcd2d71932.tar.gz
AX_CXX_HELPFUL_TERMINATE_HANDLER: initial version
Submitted by Kevin Locke in <https://savannah.nongnu.org/patch/index.php?7005>: | As a compliment (or possibly replacement) to the current | AX_CXX_VERBOSE_TERMINATE_HANDLER macro, I present the | AX_CXX_HELPFUL_TERMINATE_HANDLER macro. Rather than specifically looking for | the GNU libstdc++ verbose_terminate_handler, this macro uses a test program | which throws an uncaught exception then checks if the output contains | information about the exception. This way it can detect helpful terminate | handlers other than the current one provided with GNU libstdc++. | | The design of this macro is not perfect. Most importantly, the logic for | capturing and testing the output of the test program is not very elegant. I | had first attempted to check for output from within the test program (by | redirecting std::cerr, capturing SIGABRT, etc.) but it was excessively ugly | and not very portable. The result is that the logic in the macro itself is a | little more awkward so that the test program is trivial. I think it was a | good trade, but feedback is welcome.
Diffstat (limited to 'm4')
-rw-r--r--m4/ax_cxx_helpful_terminate_handler.m474
1 files changed, 74 insertions, 0 deletions
diff --git a/m4/ax_cxx_helpful_terminate_handler.m4 b/m4/ax_cxx_helpful_terminate_handler.m4
new file mode 100644
index 0000000..411f4a1
--- /dev/null
+++ b/m4/ax_cxx_helpful_terminate_handler.m4
@@ -0,0 +1,74 @@
+# ==============================================================================
+# http://www.nongnu.org/autoconf-archive/ax_cxx_helpful_terminate_handler.html
+# ==============================================================================
+#
+# SYNOPSIS
+#
+# AX_CXX_HELPFUL_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_HELPFUL_TERMINATE_HANDLER if useful information is printed.
+#
+# LICENSE
+#
+# Copyright (c) 2009 Kevin Locke <klocke@digitalenginesoftware.com>
+#
+# 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_HELPFUL_TERMINATE_HANDLER],
+[AC_CACHE_CHECK([whether the terminate function prints useful information],
+[ax_cv_cxx_helpful_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_helpful_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_helpful_terminate_handler=yes],
+ [ax_cv_cxx_helpful_terminate_handler=no])],
+ [ax_cv_cxx_helpful_terminate_handler=no])
+
+ ],
+
+ dnl When cross-compiling, assume messages are not helpful
+ [ax_cv_cxx_helpful_terminate_handler=no])
+ AC_LANG_POP([C++])
+])
+if test "$ax_cv_cxx_helpful_terminate_handler" = yes; then
+ AC_DEFINE([HAVE_HELPFUL_TERMINATE_HANDLER], 1,
+ [define if the terminate function prints useful information])
+fi
+])