diff options
author | Peter Simons <simons@cryp.to> | 2009-12-17 20:23:25 +0100 |
---|---|---|
committer | Peter Simons <simons@cryp.to> | 2009-12-17 23:51:48 +0100 |
commit | df5181a03b1f00d1badd868cf55b0cfcd2d71932 (patch) | |
tree | 20095a37adcf70073150eec1ffb2a63b133d50f7 /m4 | |
parent | 4731a89b700698c672f1c384eb6bdbc1ec13a2e7 (diff) | |
download | autoconf-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.m4 | 74 |
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 +]) |