autoconf
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: AC_CHECK_DECLS(basename) (Was: Re: Ping: patches required for --enab


From: Joern Rennecke
Subject: Re: AC_CHECK_DECLS(basename) (Was: Re: Ping: patches required for --enable-build-with-cxx)
Date: Tue, 09 Feb 2010 05:46:15 -0500
User-agent: Internet Messaging Program (IMP) H3 (4.1.4)

Quoting Paolo Bonzini <address@hidden>:

I'm adding address@hidden 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  <address@hidden>

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],
address@hidden:@ifndef $[]as_decl_name
address@hidden:@ifdef __cplusplus
+  $[]as_decl_type
+  (void) $[]as_decl_use;
address@hidden:@else
+  (void) $[]as_decl_name;
address@hidden:@endif
address@hidden:@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)])

reply via email to

[Prev in Thread] Current Thread [Next in Thread]