+2000-02-10 Akim Demaille <akim@epita.fr>
+
+ Keep `AC_CHECK_TYPE' backward compatibility and provide a proper
+ `AC_CHECK_TYPE',
+ Based on ideas from Paul Eggert and Alexandre Oliva.
+
+ * acgeneral.m4 (AC_CHECK_TYPE_INTERNAL): Renamed as
+ (_AC_CHECK_TYPE_NEW): this.
+ (AC_CHECK_TYPES): Adjusted.
+ (AC_CHECK_TYPE): Renamed as
+ (_AC_CHECK_TYPE_OLD): This. Adjusted to _AC_CHECK_TYPE_NEW.
+ No longer support extra includes, stick to 2.13's interface.
+ (_AC_CHECK_TYPE_BUILTIN_P): New macro.
+ (AC_CHECK_TYPE): New macro.
+ * autoheader.m4 (autoheader::AC_CHECK_TYPE): Renamed as...
+ (autoheader::_AC_CHECK_TYPE_OLD): this.
+ * tests/atspecific.m4 (TEST_MACRO): Skip /^_AC_/ macros.
+ * tests/semantics.m4: Test the choices of AC_CHECK_TYPE (wrt _NEW
+ or _OLD implemenation).
+ * doc/autoconf.texi (Generic Types): Reorganized. Explain
+ everything about AC_CHECK_TYPE and Co.
+
2000-02-10 Akim Demaille <akim@epita.fr>
* libm4.m4 (near m4_split): Remove the buggy additional
])
+
## -------------------- ##
## Checking for types. ##
## -------------------- ##
+# Up to 2.13 included, Autoconf used to provide the macro
+#
+# AC_CHECK_TYPE(TYPE, DEFAULT)
+#
+# Since, it provides another version which fits better with the other
+# AC_CHECK_ families:
+#
+# AC_CHECK_TYPE(TYPE,
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
+# [INCLUDES])
+#
+# In order to provide backward compatibility, the new scheme is
+# implemented as _AC_CHECK_TYPE_NEW, the old scheme as _AC_CHECK_TYPE_OLD,
+# and AC_CHECK_TYPE branches to one or the other, depending upon its
+# arguments.
-# AC_CHECK_TYPE_INTERNAL(TYPE,
-# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
-# [INCLUDES])
-# ----------------------------------------------------------------
+
+
+# _AC_CHECK_TYPE_NEW(TYPE,
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
+# [INCLUDES])
+# ------------------------------------------------------------
# Check whether the type TYPE is supported by the system, maybe via the
# the provided includes. This macro implements the former task of
# AC_CHECK_TYPE, with one big difference though: AC_CHECK_TYPE was
# (not necessarily size_t etc.). Equally, instead of defining an unused
# variable, we just use a cast to avoid warnings from the compiler.
# Suggested by Paul Eggert.
-#
-# FIXME: This is *the* macro which ought to be named AC_CHECK_TYPE.
-AC_DEFUN(AC_CHECK_TYPE_INTERNAL,
+AC_DEFUN([_AC_CHECK_TYPE_NEW],
[AC_REQUIRE([AC_HEADER_STDC])dnl
AC_VAR_PUSHDEF([ac_Type], [ac_cv_type_$1])dnl
AC_CACHE_CHECK([for $1], ac_Type,
AC_SHELL_IFELSE([test AC_VAR_GET(ac_Type) = yes],
[$2], [$3])dnl
AC_VAR_POPDEF([ac_Type])dnl
-])# AC_CHECK_TYPE_INTERNAL
+])# _AC_CHECK_TYPE_NEW
# AC_CHECK_TYPES((TYPE, ...),
# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
# [INCLUDES])
# --------------------------------------------------------
-# TYPEs is an m4 list.
-AC_DEFUN(AC_CHECK_TYPES,
+# TYPEs is an m4 list. There are no ambiguities here, we mean the newer
+# AC_CHECK_TYPE.
+AC_DEFUN([AC_CHECK_TYPES],
[m4_foreach([AC_Type], [$1],
- [AC_SPECIALIZE([AC_CHECK_TYPE_INTERNAL], AC_Type,
+ [AC_SPECIALIZE([_AC_CHECK_TYPE_NEW], AC_Type,
[AC_DEFINE_UNQUOTED(AC_TR_CPP(HAVE_[]AC_Type))
$2],
[$3],
[$4])])])
-# AC_CHECK_TYPE(TYPE, DEFAULT, [INCLUDES])
-# ----------------------------------------
+# _AC_CHECK_TYPE_OLD(TYPE, DEFAULT)
+# ---------------------------------
# FIXME: This is an extremely badly chosen name, since this
# macro actually performs an AC_REPLACE_TYPE. Some day we
-# have to clean this up. The macro AC_TYPE_PTRDIFF_T shows the
-# need for a checking only macro.
-AC_DEFUN(AC_CHECK_TYPE,
-[AC_CHECK_TYPE_INTERNAL([$1],,
- [AC_DEFINE_UNQUOTED($1, $2)],
- [$3])dnl
-])# AC_CHECK_TYPE
+# have to clean this up.
+AC_DEFUN([_AC_CHECK_TYPE_OLD],
+[_AC_CHECK_TYPE_NEW([$1],,
+ [AC_DEFINE_UNQUOTED([$1], [$2])])dnl
+])# _AC_CHECK_TYPE_OLD
+
+# _AC_CHECK_TYPE_BUILTIN_P(STRING)
+# --------------------------------
+# Return `1' if STRING seems to be a builtin C/C++ type, i.e., if it
+# starts with `_Bool', `bool', `char', `double', `float', `int',
+# `long', `short', `signed', or `unsigned' followed by characters
+# that are defining types.
+define([_AC_CHECK_TYPE_BUILTIN_P],
+[ifelse(regexp([$1], [^\(_Bool\|bool|\char\|double\|float\|int\|long\|short\|\(un\)?signed\)\([_a-zA-Z0-9() *]\|\[\|\]\)*$]),
+ 0, 1, 0)dnl
+])# _AC_CHECK_TYPE_BUILTIN_P
+
+
+# AC_CHECK_TYPE(TYPE, DEFAULT)
+# or
+# AC_CHECK_TYPE(TYPE,
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
+# [INCLUDES])
+# -------------------------------------------------------
+#
+# Dispatch respectively to _AC_CHECK_TYPE_OLD or _AC_CHECK_TYPE_NEW.
+# 1. More than two arguments => NEW
+# 2. $2 seems to be builtin type => OLD
+# 3. $2 seems to be a type => NEW plus a warning
+# 4. default => NEW
+AC_DEFUN([AC_CHECK_TYPE],
+[ifelse($#, 3, [_AC_CHECK_TYPE_NEW($@)],
+ $#, 4, [_AC_CHECK_TYPE_NEW($@)],
+ _AC_CHECK_TYPE_BUILTIN_P([$2]), 1, [_AC_CHECK_TYPE_OLD($@)],
+ regexp([$2], [^[_a-zA-Z0-9 ]+\([_a-zA-Z0-9() *]\|\[\|\]\)*$]), 0, [m4_warn([$0: assuming `$2' is not a type])_AC_CHECK_TYPE_NEW($@)],
+ [_AC_CHECK_TYPE_NEW($@)])[]dnl
+])# AC_CHECK_TYPE
])
-# AC_CHECK_TYPE(TYPE, SUBTITUTE)
-# ------------------------------
-AH_DEFUN([AC_CHECK_TYPE],
+# _AC_CHECK_TYPE_OLD(TYPE, DEFAULT)
+# ---------------------------------
+AH_DEFUN([_AC_CHECK_TYPE_OLD],
[AH_TEMPLATE([$1], [Define to `$2' if <sys/types.h> does not define.])])
])
+
## -------------------- ##
## Checking for types. ##
## -------------------- ##
+# Up to 2.13 included, Autoconf used to provide the macro
+#
+# AC_CHECK_TYPE(TYPE, DEFAULT)
+#
+# Since, it provides another version which fits better with the other
+# AC_CHECK_ families:
+#
+# AC_CHECK_TYPE(TYPE,
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
+# [INCLUDES])
+#
+# In order to provide backward compatibility, the new scheme is
+# implemented as _AC_CHECK_TYPE_NEW, the old scheme as _AC_CHECK_TYPE_OLD,
+# and AC_CHECK_TYPE branches to one or the other, depending upon its
+# arguments.
-# AC_CHECK_TYPE_INTERNAL(TYPE,
-# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
-# [INCLUDES])
-# ----------------------------------------------------------------
+
+
+# _AC_CHECK_TYPE_NEW(TYPE,
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
+# [INCLUDES])
+# ------------------------------------------------------------
# Check whether the type TYPE is supported by the system, maybe via the
# the provided includes. This macro implements the former task of
# AC_CHECK_TYPE, with one big difference though: AC_CHECK_TYPE was
# (not necessarily size_t etc.). Equally, instead of defining an unused
# variable, we just use a cast to avoid warnings from the compiler.
# Suggested by Paul Eggert.
-#
-# FIXME: This is *the* macro which ought to be named AC_CHECK_TYPE.
-AC_DEFUN(AC_CHECK_TYPE_INTERNAL,
+AC_DEFUN([_AC_CHECK_TYPE_NEW],
[AC_REQUIRE([AC_HEADER_STDC])dnl
AC_VAR_PUSHDEF([ac_Type], [ac_cv_type_$1])dnl
AC_CACHE_CHECK([for $1], ac_Type,
AC_SHELL_IFELSE([test AC_VAR_GET(ac_Type) = yes],
[$2], [$3])dnl
AC_VAR_POPDEF([ac_Type])dnl
-])# AC_CHECK_TYPE_INTERNAL
+])# _AC_CHECK_TYPE_NEW
# AC_CHECK_TYPES((TYPE, ...),
# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
# [INCLUDES])
# --------------------------------------------------------
-# TYPEs is an m4 list.
-AC_DEFUN(AC_CHECK_TYPES,
+# TYPEs is an m4 list. There are no ambiguities here, we mean the newer
+# AC_CHECK_TYPE.
+AC_DEFUN([AC_CHECK_TYPES],
[m4_foreach([AC_Type], [$1],
- [AC_SPECIALIZE([AC_CHECK_TYPE_INTERNAL], AC_Type,
+ [AC_SPECIALIZE([_AC_CHECK_TYPE_NEW], AC_Type,
[AC_DEFINE_UNQUOTED(AC_TR_CPP(HAVE_[]AC_Type))
$2],
[$3],
[$4])])])
-# AC_CHECK_TYPE(TYPE, DEFAULT, [INCLUDES])
-# ----------------------------------------
+# _AC_CHECK_TYPE_OLD(TYPE, DEFAULT)
+# ---------------------------------
# FIXME: This is an extremely badly chosen name, since this
# macro actually performs an AC_REPLACE_TYPE. Some day we
-# have to clean this up. The macro AC_TYPE_PTRDIFF_T shows the
-# need for a checking only macro.
-AC_DEFUN(AC_CHECK_TYPE,
-[AC_CHECK_TYPE_INTERNAL([$1],,
- [AC_DEFINE_UNQUOTED($1, $2)],
- [$3])dnl
-])# AC_CHECK_TYPE
+# have to clean this up.
+AC_DEFUN([_AC_CHECK_TYPE_OLD],
+[_AC_CHECK_TYPE_NEW([$1],,
+ [AC_DEFINE_UNQUOTED([$1], [$2])])dnl
+])# _AC_CHECK_TYPE_OLD
+
+# _AC_CHECK_TYPE_BUILTIN_P(STRING)
+# --------------------------------
+# Return `1' if STRING seems to be a builtin C/C++ type, i.e., if it
+# starts with `_Bool', `bool', `char', `double', `float', `int',
+# `long', `short', `signed', or `unsigned' followed by characters
+# that are defining types.
+define([_AC_CHECK_TYPE_BUILTIN_P],
+[ifelse(regexp([$1], [^\(_Bool\|bool|\char\|double\|float\|int\|long\|short\|\(un\)?signed\)\([_a-zA-Z0-9() *]\|\[\|\]\)*$]),
+ 0, 1, 0)dnl
+])# _AC_CHECK_TYPE_BUILTIN_P
+
+
+# AC_CHECK_TYPE(TYPE, DEFAULT)
+# or
+# AC_CHECK_TYPE(TYPE,
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
+# [INCLUDES])
+# -------------------------------------------------------
+#
+# Dispatch respectively to _AC_CHECK_TYPE_OLD or _AC_CHECK_TYPE_NEW.
+# 1. More than two arguments => NEW
+# 2. $2 seems to be builtin type => OLD
+# 3. $2 seems to be a type => NEW plus a warning
+# 4. default => NEW
+AC_DEFUN([AC_CHECK_TYPE],
+[ifelse($#, 3, [_AC_CHECK_TYPE_NEW($@)],
+ $#, 4, [_AC_CHECK_TYPE_NEW($@)],
+ _AC_CHECK_TYPE_BUILTIN_P([$2]), 1, [_AC_CHECK_TYPE_OLD($@)],
+ regexp([$2], [^[_a-zA-Z0-9 ]+\([_a-zA-Z0-9() *]\|\[\|\]\)*$]), 0, [m4_warn([$0: assuming `$2' is not a type])_AC_CHECK_TYPE_NEW($@)],
+ [_AC_CHECK_TYPE_NEW($@)])[]dnl
+])# AC_CHECK_TYPE
EOF
+
dnl AC_CHECK_DECLS
dnl --------------
dnl Check that it performs the correct actions:
dnl Must define HAVE_STRUCT_YES, HAVE_INT, but not HAVE_STRUCT_NO.
dnl `int' and `struct yes' are both checked to test both the compiler
dnl builtin types, and defined types.
-AT_TEST_MACRO(AC_CHECK_TYPES,
+AT_TEST_MACRO(AC_CHECK_SIZEOF,
[AC_CHECK_SIZEOF(char)
AC_CHECK_SIZEOF(charchar,,
[#include <stdio.h>
])])
+dnl AC_CHECK_TYPES
+dnl --------------
+dnl Check that we properly dispatch properly to the old implementation
+dnl or to the new one.
+AT_SETUP([AC_CHECK_TYPES])
+
+AT_DATA(configure.in,
+[[AC_INIT
+m4_define([_AC_CHECK_TYPE_NEW], [NEW])
+m4_define([_AC_CHECK_TYPE_OLD], [OLD])
+#(cut-from-here
+AC_CHECK_TYPE(ptrdiff_t)
+AC_CHECK_TYPE(ptrdiff_t, int)
+AC_CHECK_TYPE(quad, long long)
+AC_CHECK_TYPE(table_42, [int[42]])
+dnl Nice machine!
+AC_CHECK_TYPE(uint8_t, uint65536_t)
+AC_CHECK_TYPE(a,b,c,d)
+#to-here)
+AC_OUTPUT
+]])
+
+AT_CHECK([../autoconf -m .. -l $at_srcdir], 0,,
+[configure.in:10: warning: AC_CHECK_TYPE: assuming `uint65536_t' is not a type
+])
+AT_CHECK([[sed -e '/^#(cut-from-here/, /^#to-here)/!d' -e '/^#/d' configure]],
+ 0,
+ [NEW
+OLD
+OLD
+OLD
+NEW
+NEW
+])
+
+AT_CLEANUP(autoconf.err)
+
+
dnl AC_CHECK_FILES
dnl --------------