This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: AC_CHECK_DECLS(basename) (Was: Re: Ping: patches required for --enable-build-with-cxx)
- From: Joern Rennecke <joern dot rennecke at embecosm dot com>
- To: Paolo Bonzini <bonzini at gnu dot org>
- Cc: gcc at gcc dot gnu dot org, dj at redhat dot com, ian at airs dot com, neroden at gcc dot gnu dot org, aoliva at redhat dot com, Autoconf List <autoconf at gnu dot org>, Bruno Haible <bruno at clisp dot org>
- Date: Tue, 09 Feb 2010 05:46:15 -0500
- Subject: Re: AC_CHECK_DECLS(basename) (Was: Re: Ping: patches required for --enable-build-with-cxx)
- References: <20100208015552.xka92b8d2cg0s0og-nzlynne@webmail.spamcop.net> <4B6FC97B.80001@gnu.org> <20100208035819.wntyq01vokoc0s4g-nzlynne@webmail.spamcop.net> <4B6FD453.2050400@gnu.org> <20100208201720.5z8d1q6tqg4kgokg-nzlynne@webmail.spamcop.net> <f865508f1002090115x2fcad0b8k2a1abaf9c8e292f1@mail.gmail.com>
Quoting Paolo Bonzini <bonzini@gnu.org>:
I'm adding autoconf@gnu.org to the destinations, since this is a
pretty fundamental problem with AC_CHECK_DECL and C++
I've whipped up a patch with a modified version of AC_CHECK_DECLS -
I've called it AC_CHECK_PROTOS - that can optionally have argument types
for a function (without spaces). Then I've used this new macro in the
libcpp configure.ac to replace AC_CHECK_DECLS.
This bootstrapped and regtested fine on i686-pc-linux-gnu , and it now
also bootstraps with '--enable-build-with-cxx (although the regtest results
are still affected by PR testsuite/42843).
As I've seen you re-wrote the AC_CHECK_DECLS from 2.63 to 2.64 to save
on configure script size, one design criterion was to avoid unnecessary
passing of extra arguments outside of the shell function.
However, I wonder if there is a better way to do the string processing -
I only do autoconf hacking sporadically, and my code looks somewhat
different from the original style.
2010-02-09 Joern Rennecke <joern.rennecke@embecosm.com>
libcpp:
* aclocal (_AC_CHECK_PROTO_BODY): New shell function.
(AC_CHECK_PROTO, _AC_CHECK_PROTOS, AC_CHECK_PROTOS): New macros.
* configure.ac: Use AC_CHECK_PROTOS instead of AC_CHECK_DECLS.
* configure: Regenerate.
Index: libcpp/configure.ac
===================================================================
--- libcpp/configure.ac (revision 156598)
+++ libcpp/configure.ac (working copy)
@@ -81,8 +81,8 @@ define(libcpp_UNLOCKED_FUNCS, clearerr_u
fread_unlocked fwrite_unlocked getchar_unlocked getc_unlocked dnl
putchar_unlocked putc_unlocked)
AC_CHECK_FUNCS(libcpp_UNLOCKED_FUNCS)
-AC_CHECK_DECLS(m4_split(m4_normalize(abort asprintf basename errno getopt \
- libcpp_UNLOCKED_FUNCS vasprintf)))
+AC_CHECK_PROTOS(m4_split(m4_normalize(abort asprintf basename(char*) errno \
+ getopt libcpp_UNLOCKED_FUNCS vasprintf)))
# Checks for library functions.
AC_FUNC_ALLOCA
Index: libcpp/aclocal.m4
===================================================================
--- libcpp/aclocal.m4 (revision 156598)
+++ libcpp/aclocal.m4 (working copy)
@@ -22,3 +22,75 @@ m4_include([../config/lib-link.m4])
m4_include([../config/lib-prefix.m4])
m4_include([../config/override.m4])
m4_include([../config/warnings.m4])
+
+## ---------------------------------------------------------------- ##
+## Checking for declared symbols. ##
+## This is like *AC_CHECK_DECL*, except that for c++, we may use a ##
+## prototype to check for a (possibly overloaded) function. ##
+## ---------------------------------------------------------------- ##
+
+
+# _AC_CHECK_PROTO_BODY
+# -------------------
+# Shell function body for AC_CHECK_PROTO.
+m4_define([_AC_CHECK_PROTO_BODY],
+[ AS_LINENO_PUSH([$[]1])
+ [as_decl_name=`echo $][2|sed 's/(.*//'`]
+ [as_decl_use=`echo $][2|sed -e 's/(/((/' -e 's/\()\|,\)/) 0&/'`]
+ AC_CACHE_CHECK([whether $as_decl_name is declared], [$[]3],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$[]4],
+[@%:@ifndef $[]as_decl_name
+@%:@ifdef __cplusplus
+ $[]as_decl_type
+ (void) $[]as_decl_use;
+@%:@else
+ (void) $[]as_decl_name;
+@%:@endif
+@%:@endif
+])],
+ [AS_VAR_SET([$[]3], [yes])],
+ [AS_VAR_SET([$[]3], [no])])])
+ AS_LINENO_POP
+])# _AC_CHECK_PROTO_BODY
+
+# AC_CHECK_PROTO(SYMBOL,
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
+# [INCLUDES = DEFAULT-INCLUDES])
+# -------------------------------------------------------
+# Check whether SYMBOL (a function, variable, or constant) is declared.
+AC_DEFUN([AC_CHECK_PROTO],
+[AC_REQUIRE_SHELL_FN([ac_fn_]_AC_LANG_ABBREV[_check_proto],
+ [AS_FUNCTION_DESCRIBE([ac_fn_]_AC_LANG_ABBREV[_check_proto],
+ [LINENO SYMBOL VAR],
+ [Tests whether SYMBOL is declared, setting cache variable VAR accordingly.])],
+ [_$0_BODY])]dnl
+[AS_VAR_PUSHDEF([ac_Symbol], [ac_cv_have_decl_$1])]dnl
+[ac_fn_[]_AC_LANG_ABBREV[]_check_proto ]dnl
+["$LINENO" "$1" "ac_Symbol" "AS_ESCAPE([AC_INCLUDES_DEFAULT([$4])], [""])"
+AS_VAR_IF([ac_Symbol], [yes], [$2], [$3])
+AS_VAR_POPDEF([ac_Symbol])dnl
+])# AC_CHECK_PROTO
+
+
+# _AC_CHECK_PROTOS(SYMBOL, ACTION-IF_FOUND, ACTION-IF-NOT-FOUND,
+# INCLUDES)
+# -------------------------------------------------------------
+# Helper to AC_CHECK_PROTOS, which generates the check for a single
+# SYMBOL with INCLUDES, performs the AC_DEFINE, then expands
+# ACTION-IF-FOUND or ACTION-IF-NOT-FOUND.
+m4_define([_AC_CHECK_PROTOS],
+[AC_CHECK_PROTO([$1], [ac_have_decl=1], [ac_have_decl=0], [$4])]dnl
+[AC_DEFINE_UNQUOTED(AS_TR_CPP(patsubst(HAVE_DECL_[$1],[(.*])), [$ac_have_decl],
+ [Define to 1 if you have the declaration of `$1',
+ and to 0 if you don't.])]dnl
+[m4_ifvaln([$2$3], [AS_IF([test $ac_have_decl = 1], [$2], [$3])])])
+
+# AC_CHECK_PROTOS(SYMBOLS,
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
+# [INCLUDES = DEFAULT-INCLUDES])
+# --------------------------------------------------------
+# Defines HAVE_DECL_SYMBOL to 1 if declared, 0 otherwise. See the
+# documentation for a detailed explanation of this difference with
+# other AC_CHECK_*S macros. SYMBOLS is an m4 list.
+AC_DEFUN([AC_CHECK_PROTOS],
+[m4_map_args_sep([_$0(], [, [$2], [$3], [$4])], [], $1)])