From: Akim Demaille Date: Thu, 10 Feb 2000 10:24:10 +0000 (+0000) Subject: Keep `AC_CHECK_TYPE' backward compatibility and provide a proper X-Git-Tag: autoconf-2.50~1161 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c7bd04fb16d0cb6cade484cc89f7037707b38daa;p=thirdparty%2Fautoconf.git 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. --- diff --git a/ChangeLog b/ChangeLog index 5805f1460..e88b3b928 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2000-02-10 Akim Demaille + + 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 * libm4.m4 (near m4_split): Remove the buggy additional diff --git a/acgeneral.m4 b/acgeneral.m4 index bbe3f2422..7e66223d9 100644 --- a/acgeneral.m4 +++ b/acgeneral.m4 @@ -2795,15 +2795,33 @@ AC_VAR_POPDEF([ac_Sizeof])dnl ]) + ## -------------------- ## ## 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 @@ -2864,9 +2882,7 @@ AC_VAR_POPDEF([ac_Sizeof])dnl # (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, @@ -2880,35 +2896,66 @@ if (sizeof ($1)) 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 diff --git a/autoheader.m4 b/autoheader.m4 index 29b4ad6c5..5da30d8d4 100644 --- a/autoheader.m4 +++ b/autoheader.m4 @@ -215,9 +215,9 @@ AH_DEFUN([AC_CHECK_MEMBERS], ]) -# 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 does not define.])]) diff --git a/lib/autoconf/general.m4 b/lib/autoconf/general.m4 index bbe3f2422..7e66223d9 100644 --- a/lib/autoconf/general.m4 +++ b/lib/autoconf/general.m4 @@ -2795,15 +2795,33 @@ AC_VAR_POPDEF([ac_Sizeof])dnl ]) + ## -------------------- ## ## 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 @@ -2864,9 +2882,7 @@ AC_VAR_POPDEF([ac_Sizeof])dnl # (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, @@ -2880,35 +2896,66 @@ if (sizeof ($1)) 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 diff --git a/tests/semantics.m4 b/tests/semantics.m4 index bbe1d539f..47c12467c 100644 --- a/tests/semantics.m4 +++ b/tests/semantics.m4 @@ -7,6 +7,7 @@ Semantics. EOF + dnl AC_CHECK_DECLS dnl -------------- dnl Check that it performs the correct actions: @@ -66,7 +67,7 @@ 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 @@ -98,6 +99,44 @@ AT_TEST_MACRO(AC_CHECK_TYPES, ])]) +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 --------------