| # -*- Autotest -*- |
| |
| AT_BANNER([Semantics.]) |
| |
| # Copyright (C) 2000-2002, 2004-2007, 2009-2017, 2020-2025 Free Software |
| # Foundation, Inc. |
| # |
| # This program is free software: you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation, either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <https://www.gnu.org/licenses/>. |
| |
| |
| ## -------------------------------- ## |
| ## Members of the AC_CHECK family. ## |
| ## -------------------------------- ## |
| |
| |
| # AC_CHECK_LIB |
| # ------------ |
| # Test for symbols in a library that is very likely to be available |
| # and can be used from both C and C++: zlib, which we assume is |
| # available unless <zlib.h> doesn't exist. |
| # We used to use math library symbols for this, but that no longer |
| # works, because some C++ compilers pull in libm by default when the |
| # matching C compiler doesn't, breaking AT_CHECK_MACRO's expectations. |
| AT_CHECK_MACRO([AC_CHECK_LIB], [[ |
| AC_CHECK_HEADER([zlib.h], [], [ |
| AC_MSG_NOTICE([zlib not available, skipping test]) |
| AS_EXIT(77) |
| ]) |
| |
| # Using : for the ACTION-IF-FOUND in each call to AC_CHECK_LIB |
| # prevents LIBS from accumulating copies of "-lz". |
| |
| AC_CHECK_LIB([z], [zlibVersion], [:], [ |
| AC_MSG_ERROR([cannot find zlibVersion in libz]) |
| ]) |
| if test "${ac_cv_lib_z_zlibVersion+set}" != set; then |
| AC_MSG_ERROR([ac_cv_lib_z_zlibVersion not set]) |
| fi |
| |
| |
| # No kidding, using variables was broken in 2.50 :( |
| ac_deflate=deflate |
| AC_CHECK_LIB([z], [$ac_deflate], [:], [ |
| AC_MSG_ERROR([cannot find \$ac_deflate (= $ac_deflate) in libz]) |
| ]) |
| if test "${ac_cv_lib_z_deflate+set}" != set; then |
| AC_MSG_ERROR([ac_cv_lib_z_deflate not set]) |
| fi |
| |
| ac_z=z |
| AC_CHECK_LIB([$ac_z], [deflateEnd], [:], [ |
| AC_MSG_ERROR([cannot find deflateEnd in lib\$ac_z (= lib$ac_z)]) |
| ]) |
| if test "${ac_cv_lib_z_deflateEnd+set}" != set; then |
| AC_MSG_ERROR([ac_cv_lib_z_deflateEnd not set]) |
| fi |
| |
| ac_inflate=inflate |
| AC_CHECK_LIB([$ac_z], [$ac_inflate], [:], [ |
| AC_MSG_ERROR( |
| [cannot find \$ac_inflate (= $ac_inflate) in lib\$ac_z (= lib$ac_z)]) |
| ]) |
| if test "${ac_cv_lib_z_inflate+set}" != set; then |
| AC_MSG_ERROR([ac_cv_lib_z_inflate not set]) |
| fi |
| |
| # Also test for symbols that don't (well, shouldn't) exist. |
| # These should still set their cache variables! |
| AC_CHECK_LIB([z], [deflagrate], [ |
| AC_MSG_ERROR([found deflagrate in libz]) |
| ], [:]) |
| if test "${ac_cv_lib_z_deflagrate+set}" != set; then |
| AC_MSG_ERROR([ac_cv_lib_z_zlibVersion not set]) |
| fi |
| |
| ac_defenestrate=defenestrate |
| AC_CHECK_LIB([z], [$ac_defenestrate], [ |
| AC_MSG_ERROR([found \$ac_defenestrate (= $ac_defenestrate) in libz]) |
| ], [:]) |
| if test "${ac_cv_lib_z_defenestrate+set}" != set; then |
| AC_MSG_ERROR([ac_cv_lib_z_defenestrate not set]) |
| fi |
| |
| AC_CHECK_LIB([$ac_z], [defoliate], [ |
| AC_MSG_ERROR([found defoliate in lib\$ac_z (= lib$ac_z)]) |
| ], [:]) |
| if test "${ac_cv_lib_z_defoliate+set}" != set; then |
| AC_MSG_ERROR([ac_cv_lib_z_defoliate not set]) |
| fi |
| |
| ac_infiltrate=infiltrate |
| AC_CHECK_LIB([$ac_z], [$ac_infiltrate], [ |
| AC_MSG_ERROR( |
| [found \$ac_infiltrate (= $ac_infiltrate) in lib\$ac_z (= lib$ac_z)]) |
| ], [:]) |
| if test "${ac_cv_lib_z_infiltrate+set}" != set; then |
| AC_MSG_ERROR([ac_cv_lib_z_infiltrate not set]) |
| fi |
| ]]) |
| |
| |
| # AC_SEARCH_LIBS |
| # -------------- |
| # Like AC_CHECK_LIBS, we use zlib here because we need the behavior to |
| # be consistent between the C and C++ compilers. |
| AT_CHECK_MACRO([AC_SEARCH_LIBS (needed)], [[ |
| AC_CHECK_HEADER([zlib.h], [], [ |
| AC_MSG_NOTICE([zlib not available, skipping test]) |
| AS_EXIT(77) |
| ]) |
| |
| # Unlike AC_CHECK_LIBS, AC_SEARCH_LIBS sets $LIBS *even if* |
| # ACTION-IF-FOUND is given, so we need to reset it after each test. |
| ac_at_save_LIBS="$LIBS" |
| |
| AC_SEARCH_LIBS([zlibVersion], [z], [:], [:]) |
| if test x"$ac_cv_search_zlibVersion" != x-lz; then |
| AC_MSG_ERROR([wrong zlibVersion search result: $ac_cv_search_zlibVersion]) |
| fi |
| LIBS="$ac_at_save_LIBS" |
| |
| # No kidding, using variables was broken in 2.50 :( |
| ac_deflate=deflate |
| AC_SEARCH_LIBS([$ac_deflate], [z], [:], [:]) |
| if test x"$ac_cv_search_deflate" != x-lz; then |
| AC_MSG_ERROR([wrong deflate search result: $ac_cv_search_deflate]) |
| fi |
| LIBS="$ac_at_save_LIBS" |
| |
| ac_z=z |
| AC_SEARCH_LIBS([deflateEnd], [$ac_z], [:], [:]) |
| if test x"$ac_cv_search_deflateEnd" != x-lz; then |
| AC_MSG_ERROR([wrong deflateEnd search result: $ac_cv_search_deflateEnd]) |
| fi |
| LIBS="$ac_at_save_LIBS" |
| |
| ac_inflate=inflate |
| AC_SEARCH_LIBS([$ac_inflate], [$ac_z], [:], [:]) |
| if test x"$ac_cv_search_inflate" != x-lz; then |
| AC_MSG_ERROR([wrong inflate search result: $ac_cv_search_inflate]) |
| fi |
| LIBS="$ac_at_save_LIBS" |
| |
| # Also test for symbols that don't (well, shouldn't) exist. |
| # These should still set their cache variables! |
| AC_SEARCH_LIBS([deflagrate], [z], [:], [:]) |
| if test x"$ac_cv_search_deflagrate" != xno; then |
| AC_MSG_ERROR([wrong deflagrate search result: $ac_cv_search_deflagrate]) |
| fi |
| LIBS="$ac_at_save_LIBS" |
| |
| ac_defenestrate=defenestrate |
| AC_SEARCH_LIBS([$ac_defenestrate], [z], [:], [:]) |
| if test x"$ac_cv_search_defenestrate" != xno; then |
| AC_MSG_ERROR([wrong defenestrate search result: $ac_cv_search_defenestrate]) |
| fi |
| LIBS="$ac_at_save_LIBS" |
| |
| AC_SEARCH_LIBS([defoliate], [$ac_z], [:], [:]) |
| if test x"$ac_cv_search_defoliate" != xno; then |
| AC_MSG_ERROR([wrong defoliate search result: $ac_cv_search_defoliate]) |
| fi |
| LIBS="$ac_at_save_LIBS" |
| |
| ac_infiltrate=infiltrate |
| AC_SEARCH_LIBS([$ac_infiltrate], [$ac_z], [:], [:]) |
| if test x"$ac_cv_search_infiltrate" != xno; then |
| AC_MSG_ERROR([wrong infiltrate search result: $ac_cv_search_infiltrate]) |
| fi |
| LIBS="$ac_at_save_LIBS" |
| ]]) |
| |
| |
| # AC_SEARCH_LIBS (none needed) |
| # ---------------------------- |
| # This test doesn't need to be nearly as thorough as the above; its |
| # purpose is simply to ensure that when no library is needed, |
| # AC_SEARCH_LIBS really does produce "none needed" as its result. |
| AT_CHECK_MACRO([AC_SEARCH_LIBS (none needed)], [[ |
| # No library should be required to link with printf, but we throw |
| # -lc in the search list so that it includes both libraries that |
| # don't exist and libraries that probably do. |
| AC_SEARCH_LIBS([printf], [oser c ust], [:], [:]) |
| |
| if test x"$ac_cv_search_printf" != "xnone required"; then |
| AC_MSG_ERROR([wrong printf search result: $ac_cv_search_printf]) |
| fi |
| ]]) |
| |
| |
| # AC_CHECK_DECLS |
| # -------------- |
| # Check that it performs the correct actions: |
| AT_CHECK_MACRO([AC_CHECK_DECLS], |
| [[AC_CHECK_DECLS([yes, no, myenum, mystruct, myfunc, mymacro1, mymacro2],,, |
| [[extern int yes; |
| enum { myenum }; |
| extern struct mystruct_s { int x[20]; } mystruct; |
| extern int myfunc (int); |
| #define mymacro1(arg) arg |
| #define mymacro2]]) |
| # Ensure we can detect missing declarations of functions whose |
| # signature may be built into the compiler. |
| AC_CHECK_DECLS([memcpy, strchr, strerror],,, [[]]) |
| # The difference in space-before-open-paren is intentional. |
| AC_CHECK_DECLS([basenam (char *), dirnam(char *), |
| moreargs (char, short, int, long, void *, char *, float, double)],,, |
| [[#ifdef __cplusplus |
| extern "C++" char *basenam (char *); |
| extern "C++" const char *basenam (const char *); |
| #else |
| extern char *basenam (const char *); |
| #endif |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| extern int moreargs (char, short, int, long, void *, |
| char [], float, double); |
| #ifdef __cplusplus |
| } |
| #endif |
| ]]) |
| AC_CHECK_DECL([declared (char *)],, [AS_EXIT([1])], |
| [[#ifdef __cplusplus |
| extern "C++" char *declared (char *); |
| extern "C++" const char *declared (const char *); |
| #else |
| extern char *declared (const char *); |
| #endif |
| ]]) |
| AC_LANG_WERROR |
| AC_CHECK_DECL([undeclared (char *)], [AS_EXIT([1])],, [[]]) |
| if test -z "$ac_[]_AC_LANG_ABBREV[]_werror_flag"; then |
| AC_MSG_ERROR([ac_]_AC_LANG_ABBREV[_werror_flag overwritten]) |
| fi |
| ]], |
| [AT_CHECK_DEFINES( |
| [#define HAVE_DECL_BASENAM 1 |
| #define HAVE_DECL_DIRNAM 0 |
| #define HAVE_DECL_MEMCPY 0 |
| #define HAVE_DECL_MOREARGS 1 |
| #define HAVE_DECL_MYENUM 1 |
| #define HAVE_DECL_MYFUNC 1 |
| #define HAVE_DECL_MYMACRO1 1 |
| #define HAVE_DECL_MYMACRO2 1 |
| #define HAVE_DECL_MYSTRUCT 1 |
| #define HAVE_DECL_NO 0 |
| #define HAVE_DECL_STRCHR 0 |
| #define HAVE_DECL_STRERROR 0 |
| #define HAVE_DECL_YES 1 |
| ])]) |
| |
| |
| # AC_CHECK_FUNCS |
| # -------------- |
| # Check that it performs the correct actions: |
| # Must define HAVE_PRINTF, but not HAVE_AUTOCONF_FTNIRP |
| AT_CHECK_MACRO([AC_CHECK_FUNCS], |
| [AC_CHECK_FUNCS(printf autoconf_ftnirp)], |
| [AT_CHECK_DEFINES( |
| [/* #undef HAVE_AUTOCONF_FTNIRP */ |
| #define HAVE_PRINTF 1 |
| ])]) |
| |
| |
| # AC_REPLACE_FUNCS |
| # ---------------- |
| # Check that it performs the correct actions: autoconf_ftnirp.c must |
| # be compiled, and must define HAVE_PRINTF, but not HAVE_AUTOCONF_FTNIRP |
| # FIXME: Maybe check the traces? |
| AT_SETUP([AC_REPLACE_FUNCS]) |
| |
| AT_DATA([config.in], |
| [@LIBOBJS@ |
| ]) |
| |
| # AC_REPLACE_FUNCS has an AS_LITERAL_IF optimization; test both paths. |
| # Manual invocation of AH_TEMPLATE should only be necessary for functions |
| # whose names are hidden inside a shell variable at m4 expansion time. |
| AT_CONFIGURE_AC( |
| [[AC_CONFIG_FILES([config.libobjs:config.in]) |
| AC_REPLACE_FUNCS([printf autoconf_ftnirp]) |
| funcs='fprintf autoconf_ftnirpf' |
| AH_TEMPLATE([HAVE_FPRINTF], []) |
| AH_TEMPLATE([HAVE_AUTOCONF_FTNIRPF], []) |
| AC_REPLACE_FUNCS([\ |
| $funcs \ |
| fopen \ |
| autoconf_nepof]) |
| AS@&t@_UNSET([funcs])]]) |
| |
| AT_CHECK_AUTOCONF([], [], [], |
| [[configure.ac:9: warning: AC_REPLACE_FUNCS($funcs): you should use literals |
| functions.m4: AC_REPLACE_FUNCS is expanded from... |
| configure.ac:9: the top level |
| ]]) |
| AT_CHECK_AUTOHEADER([], [ |
| HAVE_AUTOCONF_FTNIRP |
| HAVE_AUTOCONF_FTNIRPF |
| HAVE_AUTOCONF_NEPOF |
| HAVE_FOPEN |
| HAVE_FPRINTF |
| HAVE_PRINTF |
| ]) |
| AT_CHECK_CONFIGURE |
| AT_CHECK_ENV |
| AT_CHECK_DEFINES( |
| [/* #undef HAVE_AUTOCONF_FTNIRP */ |
| /* #undef HAVE_AUTOCONF_FTNIRPF */ |
| /* #undef HAVE_AUTOCONF_NEPOF */ |
| #define HAVE_FOPEN 1 |
| #define HAVE_FPRINTF 1 |
| #define HAVE_PRINTF 1 |
| ]) |
| |
| AT_CHECK([sed 's/ */ /g;s/^ //;s/ $//' config.libobjs | tr ' ' ' |
| ' | sort], [], |
| [${LIBOBJDIR}autoconf_ftnirp$U.o |
| ${LIBOBJDIR}autoconf_ftnirpf$U.o |
| ${LIBOBJDIR}autoconf_nepof$U.o |
| ]) |
| |
| AT_CLEANUP |
| |
| |
| # AC_CHECK_HEADERS |
| # ---------------- |
| # Check that it performs the correct actions: |
| # Must define HAVE_FLOAT_H, but not HAVE_AUTOCONF_IO_H. |
| AT_SETUP([AC_CHECK_HEADERS]) |
| |
| AT_DATA([autoconf_io.h], |
| [blah blah |
| ]) |
| |
| AT_CONFIGURE_AC([AC_CHECK_HEADERS([float.h autoconf_io.h])]) |
| AT_CHECK_AUTOCONF |
| AT_CHECK_AUTOHEADER([], [ |
| HAVE_AUTOCONF_IO_H |
| HAVE_FLOAT_H |
| HAVE_INTTYPES_H |
| HAVE_STDINT_H |
| HAVE_STDIO_H |
| HAVE_STDLIB_H |
| HAVE_STRINGS_H |
| HAVE_STRING_H |
| HAVE_SYS_STAT_H |
| HAVE_SYS_TYPES_H |
| HAVE_UNISTD_H |
| STDC_HEADERS |
| ]) |
| AT_CHECK_CONFIGURE([CPPFLAGS=-I.]) |
| AT_CHECK_ENV |
| AT_CHECK_DEFINES( |
| [/* #undef HAVE_AUTOCONF_IO_H */ |
| #define HAVE_FLOAT_H 1 |
| ]) |
| |
| AT_CLEANUP |
| |
| |
| # AC_CHECK_HEADERS_OLD |
| # -------------------- |
| # Check that it performs the correct actions: |
| # Must not check prerequisites, hence define header2.h |
| AT_SETUP([AC_CHECK_HEADERS (preprocessor test)]) |
| |
| AT_DATA([header1.h], |
| [typedef int foo; |
| ]) |
| |
| AT_DATA([header2.h], |
| [typedef foo bar; |
| ]) |
| |
| AT_CONFIGURE_AC([[AC_CHECK_HEADERS([header2.h], [], [], [-])]]) |
| |
| AT_CHECK_AUTOCONF([], 0, [], |
| [[configure.ac:4: warning: Checking for headers with the preprocessor is |
| configure.ac:4: deprecated. Specify prerequisite code to AC_CHECK_HEADER |
| configure.ac:4: instead of using fourth argument '-'. (Many headers need |
| configure.ac:4: no prerequisites. If you truly need to test whether |
| configure.ac:4: something passes the preprocessor but not the compiler, |
| configure.ac:4: use AC_PREPROC_IFELSE.) |
| headers.m4: _AC_CHECK_HEADER_PREPROC is expanded from... |
| headers.m4: AC_CHECK_HEADER is expanded from... |
| headers.m4: AC_CHECK_HEADERS is expanded from... |
| configure.ac:4: the top level |
| ]]) |
| AT_CHECK_AUTOHEADER([-W no-obsolete], [HAVE_HEADER2_H]) |
| AT_CHECK_CONFIGURE([CPPFLAGS=-I.]) |
| AT_CHECK_ENV |
| AT_CHECK_DEFINES( |
| [#define HAVE_HEADER2_H 1 |
| ]) |
| |
| AT_CLEANUP |
| |
| |
| # AC_CHECK_HEADERS_NEW |
| # -------------------- |
| # Check that it performs the correct actions: |
| # Must check prerequisites, hence define header2.h but not header3.h |
| AT_SETUP([AC_CHECK_HEADERS (compiler test)]) |
| |
| AT_DATA([header1.h], |
| [typedef int foo; |
| ]) |
| |
| AT_DATA([header2.h], |
| [typedef foo bar; |
| ]) |
| |
| AT_DATA([header3.h], |
| [typedef bar wow; |
| ]) |
| |
| AT_CONFIGURE_AC( |
| [AC_CHECK_HEADERS(header2.h header3.h, [], [], [[@%:@include "header1.h"]])]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_AUTOHEADER([], [ |
| HAVE_HEADER2_H |
| HAVE_HEADER3_H |
| ]) |
| AT_CHECK_CONFIGURE([CPPFLAGS=-I.]) |
| AT_CHECK_ENV |
| AT_CHECK_DEFINES( |
| [#define HAVE_HEADER2_H 1 |
| /* #undef HAVE_HEADER3_H */ |
| ]) |
| |
| AT_CLEANUP |
| |
| |
| # AC_CHECK_MEMBER |
| # --------------- |
| # Check that it performs the correct actions. |
| # Must define HAVE_STRUCT_YES_S_YES, but not HAVE_STRUCT_YES_S_NO. |
| AT_CHECK_MACRO([AC_CHECK_MEMBER], |
| [[AC_CHECK_MEMBER([struct yes_s.yes], |
| [AC_DEFINE([HAVE_STRUCT_YES_S_YES], [1], |
| [Define to 1 if 'yes' is a member of 'struct yes_s'.])],, |
| [struct sub { int x; }; |
| struct yes_s { int yes; struct sub substruct; };]) |
| AC_CHECK_MEMBER([struct yes_s.no], |
| [AC_DEFINE([HAVE_STRUCT_YES_S_NO], [1], |
| [Define to 1 if 'no' is a member of 'struct yes_s'.])],, |
| [struct sub { int x; }; |
| struct yes_s { int yes; struct sub substruct; };]) |
| AC_CHECK_MEMBER([struct yes_s.substruct], |
| [AC_DEFINE([HAVE_STRUCT_YES_S_SUBSTRUCT], [1], |
| [Define to 1 if 'substruct' is a member of 'struct yes_s'.])],, |
| [struct sub { int x; }; |
| struct yes_s { int yes; struct sub substruct; };])]], |
| [AT_CHECK_DEFINES( |
| [/* #undef HAVE_STRUCT_YES_S_NO */ |
| #define HAVE_STRUCT_YES_S_SUBSTRUCT 1 |
| #define HAVE_STRUCT_YES_S_YES 1 |
| ])]) |
| |
| # AC_CHECK_MEMBERS |
| # ---------------- |
| # Check that it performs the correct actions. |
| # Must define HAVE_STRUCT_YES_S_YES, but not HAVE_STRUCT_YES_S_NO. |
| AT_CHECK_MACRO([AC_CHECK_MEMBERS], |
| [[AC_CHECK_MEMBERS([struct yes_s.yes, struct yes_s.no, struct yes_s.substruct],,, |
| [struct sub { int x; }; |
| struct yes_s { int yes; struct sub substruct; };])]], |
| [AT_CHECK_DEFINES( |
| [/* #undef HAVE_STRUCT_YES_S_NO */ |
| #define HAVE_STRUCT_YES_S_SUBSTRUCT 1 |
| #define HAVE_STRUCT_YES_S_YES 1 |
| ]) |
| AT_CHECK([grep 'yes.*member of.*yes_s' config.h], [], [ignore]) |
| ]) |
| |
| |
| # AC_CHECK_ALIGNOF |
| # ---------------- |
| AT_CHECK_MACRO([AC_CHECK_ALIGNOF], |
| [[AC_CHECK_ALIGNOF(char) |
| AC_CHECK_ALIGNOF(charchar, |
| [[#include <stddef.h> |
| #include <stdio.h> |
| typedef char charchar[2];]]) |
| AC_CHECK_ALIGNOF(charcharchar) |
| ]], |
| [AT_CHECK_DEFINES( |
| [#define ALIGNOF_CHAR 1 |
| #define ALIGNOF_CHARCHAR 1 |
| #define ALIGNOF_CHARCHARCHAR 0 |
| ])]) |
| |
| |
| # AC_CHECK_ALIGNOF struct |
| # ----------------------- |
| AT_CHECK_MACRO([AC_CHECK_ALIGNOF struct], |
| [[AC_CHECK_ALIGNOF([struct { char c; }]) |
| AC_CHECK_ALIGNOF([struct nosuchstruct]) |
| ]], |
| [AT_CHECK([[grep "#define ALIGNOF_STRUCT___CHAR_C___ [1-9]" config.h]], |
| 0, ignore) |
| AT_CHECK([[grep "#define ALIGNOF_STRUCT_NOSUCHSTRUCT 0" config.h]], |
| 0, ignore) |
| ]) |
| |
| # AC_CHECK_SIZEOF |
| # --------------- |
| AT_CHECK_MACRO([AC_CHECK_SIZEOF], |
| [[AC_CHECK_SIZEOF(char) |
| AC_CHECK_SIZEOF(charchar,, |
| [[#include <stdio.h> |
| typedef char charchar[2];]]) |
| AC_CHECK_SIZEOF(charcharchar) |
| ]], |
| [AT_CHECK_DEFINES( |
| [#define SIZEOF_CHAR 1 |
| #define SIZEOF_CHARCHAR 2 |
| #define SIZEOF_CHARCHARCHAR 0 |
| ])]) |
| |
| |
| # AC_CHECK_SIZEOF struct |
| # ---------------------- |
| AT_CHECK_MACRO([AC_CHECK_SIZEOF struct], |
| [[AC_C_CONST |
| AC_CHECK_SIZEOF([struct x], [], [struct x { char c; int x; };]) |
| AC_CHECK_SIZEOF([const struct x], [], [struct x { const char *p; int x; };]) |
| AC_CHECK_SIZEOF([struct nosuchstruct]) |
| # Taken from autoconf.texi:Generic Compiler Characteristics. |
| AC_CHECK_SIZEOF([int *]) |
| ]], |
| [AT_CHECK([[grep "#define SIZEOF_STRUCT_X [1-9]" config.h]], |
| 0, ignore) |
| AT_CHECK([[grep "#define SIZEOF_CONST_STRUCT_X [1-9]" config.h]], |
| 0, ignore) |
| AT_CHECK([[grep "#define SIZEOF_STRUCT_NOSUCHSTRUCT 0" config.h]], |
| 0, ignore) |
| AT_CHECK([[grep "#define SIZEOF_INT_P [1-9]" config.h]], |
| 0, ignore) |
| ]) |
| |
| |
| # AC_CHECK_TYPES |
| # -------------- |
| # Check that it performs the correct actions. |
| # Must define HAVE_STRUCT_YES_S, HAVE_INT, but not HAVE_STRUCT_NO_S. |
| # 'int' and 'struct yes_s' are both checked to test both the compiler |
| # builtin types, and defined types. |
| AT_CHECK_MACRO([AC_CHECK_TYPES], |
| [[AC_CHECK_TYPES([int, struct yes_s, struct no_s],,, |
| [struct yes_s { int yes ;} ;])]], |
| [AT_CHECK_DEFINES( |
| [#define HAVE_INT 1 |
| /* #undef HAVE_STRUCT_NO_S */ |
| #define HAVE_STRUCT_YES_S 1 |
| ])]) |
| |
| |
| # AC_CHECK_TYPES |
| # -------------- |
| # Check that we properly dispatch properly to the old implementation |
| # or to the new one. |
| AT_SETUP([AC_CHECK_TYPES: backward compatibility]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| define([_AC_CHECK_TYPE_NEW], [NEW]) |
| 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 int) |
| AC_CHECK_TYPE(table_42, [int[42]]) |
| # Nice machine! |
| AC_CHECK_TYPE(uint8_t, uint65536_t) |
| AC_CHECK_TYPE(a,b,c,d) |
| #to-here) |
| AC_OUTPUT |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK([[sed -e '/^#(cut-from-here/,/^#to-here)/!d' -e '/^#/d' configure]], |
| 0, |
| [NEW |
| OLD |
| OLD |
| OLD |
| OLD |
| NEW |
| ]) |
| |
| AT_CLEANUP |
| |
| |
| # AC_CHECK_FILES |
| # -------------- |
| # FIXME: To really test HAVE_AC_EXISTS2 and HAVE_AC_MISSING2 we need to |
| # open AH_TEMPLATE to 'configure.ac', which is not yet the case. |
| # Don't use AT_CHECK_MACRO for this one because AC_CHECK_FILES can't be |
| # used when cross compiling. |
| |
| AT_CHECK_CONFIGURE_AC([AC_CHECK_FILES], |
| [[touch at-exists1 at-exists2 |
| ac_exists2=at-exists2 |
| ac_missing2=at-missing2 |
| AC_CHECK_FILES(at-exists1 at-missing1 $ac_exists2 $ac_missing2) |
| rm at-exists1 at-exists2]], |
| [], [], |
| [AT_CHECK_DEFINES( |
| [#define HAVE_AT_EXISTS1 1 |
| /* #undef HAVE_AT_MISSING1 */ |
| ])]) |
| |
| |
| |
| ## ------------------------------ ## |
| ## AC_CHECK_PROG & AC_PATH_PROG. ## |
| ## ------------------------------ ## |
| |
| |
| # AT_CHECK_PROGS_PREPARE |
| # ---------------------- |
| # Create a sub directory 'path' with 6 subdirs which all 7 contain |
| # an executable 'tool'. '6' contains a 'better' tool. |
| m4_define([AT_CHECK_PROGS_PREPARE], |
| [mkdir path |
| |
| cat >path/tool <<\EOF |
| #! /bin/sh |
| exit 0 |
| EOF |
| chmod +x path/tool |
| |
| for i in 1 2 3 4 5 6 |
| do |
| mkdir path/$i |
| cp path/tool path/$i |
| done |
| cp path/tool path/6/better]) |
| |
| |
| # -------------------------------- # |
| # AC_CHECK_PROG & AC_CHECK_PROGS. # |
| # -------------------------------- # |
| |
| AT_SETUP([AC_CHECK_PROG & AC_CHECK_PROGS]) |
| |
| AT_CHECK_PROGS_PREPARE |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| pwd=`pwd` |
| p="1${PATH_SEPARATOR}2${PATH_SEPARATOR}3${PATH_SEPARATOR}4${PATH_SEPARATOR}5${PATH_SEPARATOR}6" |
| path=`echo $p | sed -e 's,\([[0-9]]\),'"$pwd"'/path/\1,g'` |
| fail=false |
| |
| AC_CHECK_PROG(TOOL1, tool, found, not-found, $path) |
| test "$TOOL1" = found || fail=: |
| |
| # Yes, the semantics of this macro is weird. |
| AC_CHECK_PROG(TOOL2, tool,, not-found, $path) |
| test "$TOOL2" = not-found || fail=: |
| |
| AC_CHECK_PROG(TOOL3, tool, tool, not-found, $path, $pwd/path/1/tool) |
| test "$TOOL3" = "$pwd/path/2/tool" || fail=: |
| |
| AC_CHECK_PROG(TOOL4, better, better, not-found, $path, $pwd/path/1/tool) |
| test "$TOOL4" = better || fail=: |
| |
| # When a tool is not found, and no value is given for not-found, |
| # the variable is left empty. |
| AC_CHECK_PROGS(TOOL5, missing,, $path) |
| test -z "$TOOL5" || fail=: |
| |
| AC_CHECK_PROGS(TOOL6, missing tool better,, $path) |
| test "$TOOL6" = tool || fail=: |
| |
| $fail && |
| AC_MSG_ERROR([[CHECK_PROG failed]]) |
| |
| AC_OUTPUT |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| |
| AT_CLEANUP |
| |
| |
| |
| ## ---------------- ## |
| ## AC_C_BIGENDIAN. ## |
| ## ---------------- ## |
| |
| AT_SETUP([AC_C_BIGENDIAN]) |
| AT_KEYWORDS([cross]) |
| |
| # Make sure that AC_C_BIGENDIAN behave the same whether we are |
| # cross-compiling or not. |
| |
| _AT_CHECK_AC_MACRO( |
| [[AC_C_BIGENDIAN( |
| [ac_endian=big], |
| [ac_endian=little], |
| [ac_endian=unknown], |
| [ac_endian=universal]) |
| echo $ac_endian > at-endian |
| ]]) |
| |
| rm -f config.hin # So that next run of autoheader is quiet. |
| _AT_CHECK_AC_MACRO( |
| [[# Force cross compiling. |
| cross_compiling=yes |
| ac_tool_warned=yes |
| AC_C_BIGENDIAN( |
| [ac_endian=big], |
| [ac_endian=little], |
| [ac_endian=unknown], |
| [ac_endian=universal]) |
| ac_prevendian=`cat at-endian` |
| # Check that we have found the same result as in the previous run |
| # or unknown (because the cross-compiling check is allowed to fail; |
| # although it might be interesting to suppress this comparison, just |
| # to know on which system it fails if it ever does). |
| if test $ac_endian != $ac_prevendian && test $ac_endian != unknown; then |
| AC_MSG_ERROR([unexpected endianness: first run found '$ac_prevendian' but second run found '$ac_endian']) |
| fi |
| ]]) |
| |
| # Make sure AC_C_BIGENDIAN with no argument will create a config.h template |
| # containing "WORDS_BIGENDIAN". |
| AT_CONFIGURE_AC([[AC_C_BIGENDIAN]]) |
| # --force is necessary, the computer might be too fast. |
| AT_CHECK_AUTOHEADER([--force], [ |
| AC_APPLE_UNIVERSAL_BUILD |
| HAVE_INTTYPES_H |
| HAVE_STDINT_H |
| HAVE_STDIO_H |
| HAVE_STDLIB_H |
| HAVE_STRINGS_H |
| HAVE_STRING_H |
| HAVE_SYS_STAT_H |
| HAVE_SYS_TYPES_H |
| HAVE_UNISTD_H |
| STDC_HEADERS |
| WORDS_BIGENDIAN |
| ]) |
| AT_CHECK([grep WORDS_BIGENDIAN config.hin], [], [ignore]) |
| |
| AT_CLEANUP |
| |
| |
| # ------------------------------ # |
| # AC_PATH_PROG & AC_PATH_PROGS. # |
| # ------------------------------ # |
| |
| AT_SETUP([AC_PATH_PROG & AC_PATH_PROGS]) |
| |
| AT_CHECK_PROGS_PREPARE |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| pwd=`pwd` |
| p="1${PATH_SEPARATOR}2${PATH_SEPARATOR}3${PATH_SEPARATOR}4${PATH_SEPARATOR}5${PATH_SEPARATOR}6" |
| path=`echo $p | sed -e 's,\([[0-9]]\),'"$pwd"'/path/\1,g'` |
| fail=false |
| |
| AC_PATH_PROG(TOOL1, tool, not-found, $path) |
| test "$TOOL1" = "$pwd/path/1/tool" || fail=: |
| |
| AC_PATH_PROG(TOOL2, better, not-found, $path) |
| test "$TOOL2" = "$pwd/path/6/better" || fail=: |
| |
| # When a tool is not found, and no value is given for not-found, |
| # the variable is left empty. |
| AC_PATH_PROGS(TOOL3, missing,, $path) |
| test -z "$TOOL3" || fail=: |
| |
| AC_PATH_PROGS(TOOL4, missing tool better,, $path) |
| test "$TOOL4" = "$pwd/path/1/tool" || fail=: |
| |
| $fail && |
| AC_MSG_ERROR([[PATH_PROG failed]]) |
| |
| AC_OUTPUT |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| |
| AT_CLEANUP |
| |
| |
| |
| # ----------------------------- # |
| # AC_PATH_PROGS_FEATURE_CHECK. # |
| # ----------------------------- # |
| |
| AT_SETUP([AC_PATH_PROGS_FEATURE_CHECK]) |
| |
| # This test doesn't work if `pwd` contains white space |
| case `pwd` in |
| *\ * | *\ *) AT_CHECK([exit 77]) ;; |
| esac |
| |
| AT_CHECK_PROGS_PREPARE |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| pwd=`pwd` |
| p="1${PATH_SEPARATOR}2${PATH_SEPARATOR}3${PATH_SEPARATOR}4${PATH_SEPARATOR}5${PATH_SEPARATOR}6" |
| path=`echo $p | sed -e 's,\([[0-9]]\),'"$pwd"'/path/\1,g'` |
| fail=false |
| |
| # Find first candidate and stop search |
| AC_PATH_PROGS_FEATURE_CHECK(TOOL1, [tool better], |
| [$ac_path_TOOL1 && ac_cv_path_TOOL1=$ac_path_TOOL1 ac_path_TOOL1_found=:], |
| fail=:, $path) |
| test -z "$TOOL1" || fail=: |
| test "$ac_cv_path_TOOL1" = "$pwd/path/1/tool" || fail=: |
| |
| # Keep searching each candidate |
| AC_PATH_PROGS_FEATURE_CHECK(TOOL2, [tool better], |
| [$ac_path_TOOL2 && ac_cv_path_TOOL2=$ac_path_TOOL2], |
| fail=:, $path) |
| test "$ac_cv_path_TOOL2" = "$pwd/path/6/better" || fail=: |
| |
| # Only accept better candidate |
| AC_PATH_PROGS_FEATURE_CHECK(TOOL3, [tool better], |
| [case "$ac_path_TOOL3" in #( |
| *better) ac_cv_path_TOOL3=$ac_path_TOOL3;; |
| esac], |
| fail=:, $path) |
| test "$ac_cv_path_TOOL3" = "$pwd/path/6/better" || fail=: |
| |
| # When a tool is not found, and no action is given for not-found, |
| # the variable is left empty. |
| AC_PATH_PROGS_FEATURE_CHECK(TOOL4, missing, |
| [ac_cv_path_TOOL4=$ac_path_TOOL4], [], $path) |
| test -z "$ac_cv_path_TOOL4" || fail=: |
| |
| # Test action when tool is not found |
| AC_PATH_PROGS_FEATURE_CHECK(TOOL5, missing, [], |
| [ac_cv_path_TOOL5='not found'], $path) |
| test "$ac_cv_path_TOOL5" = "not found" || fail=: |
| |
| # Test that pre-set tool bypasses feature test |
| TOOL6=$pwd/path/6/better |
| AC_PATH_PROGS_FEATURE_CHECK(TOOL6, tool, fail=:, fail=:, $path) |
| test "$ac_cv_path_TOOL6" = "$pwd/path/6/better" || fail=: |
| |
| # A blank pre-set does not bypass feature test |
| TOOL7= |
| AC_PATH_PROGS_FEATURE_CHECK(TOOL7, [tool better], |
| [$ac_path_TOOL7 && ac_cv_path_TOOL7=$ac_path_TOOL7 ac_path_TOOL7_found=:], |
| fail=:, $path) |
| test -z "$TOOL7" || fail=: |
| test "$ac_cv_path_TOOL7" = "$pwd/path/1/tool" || fail=: |
| |
| $fail && |
| AC_MSG_ERROR([[PATH_PROG failed]]) |
| |
| AC_OUTPUT |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| |
| AT_CLEANUP |
| |
| |
| |
| |
| ## -------------- ## |
| ## AC_PATH_XTRA. ## |
| ## -------------- ## |
| |
| |
| AT_SETUP([AC_PATH_XTRA]) |
| |
| _AT_CHECK_AC_MACRO([AC_PATH_XTRA]) |
| |
| # Check X_DISPLAY_MISSING. |
| AT_CHECK_CONFIGURE([--without-x]) |
| AT_CHECK_DEFINES( |
| [#define X_DISPLAY_MISSING 1 |
| ]) |
| |
| AT_CLEANUP |
| |
| ## -------------------------------------------------------------------- ## |
| ## AC_SYS_LARGEFILE, AC_SYS_YEAR2038, and AC_SYS_YEAR2038_RECOMMENDED. ## |
| ## -------------------------------------------------------------------- ## |
| |
| AT_CHECK_MACRO([AC_SYS_LARGEFILE], [], |
| [AT_CHECK([./configure --help | |
| $EGREP -e '-(dis|en)able-(largefile|year2038)\>'], |
| [0], |
| [ --disable-largefile omit support for large files |
| --enable-year2038 support timestamps after 2038 |
| ], |
| [])]) |
| |
| AT_CHECK_MACRO([AC_SYS_YEAR2038], [], |
| [AT_CHECK([./configure --help | |
| $EGREP -e '-(dis|en)able-(largefile|year2038)\>'], |
| [0], |
| [ --disable-largefile omit support for large files |
| --disable-year2038 don't support timestamps after 2038 |
| ], |
| [])]) |
| |
| AT_CHECK_MACRO([AC_SYS_YEAR2038_RECOMMENDED], [], |
| [AT_CHECK([./configure --help | |
| $EGREP -e '-(dis|en)able-(largefile|year2038)\>'], |
| [0], |
| [ --disable-largefile omit support for large files |
| --disable-year2038 don't support timestamps after 2038 |
| ], |
| [])], |
| [], [], |
| [dnl Skip this test on systems that do not support 64-bit time_t at |
| dnl all. AC_SYS_YEAR2038_RECOMMENDED will make configure fail on |
| dnl those systems. I'd like to make this be a test that it *does* |
| dnl make configure fail on those systems, but that would require |
| dnl adding features to AT_CHECK_MACRO. |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| AC_PROG_CC |
| AC_SYS_YEAR2038 |
| AC_COMPUTE_INT([sizeof_time_t], [sizeof(time_t)], |
| [@%:@include <time.h>], |
| [sizeof_time_t=0]) |
| AS@&t@_IF([test $sizeof_time_t -lt 8], |
| [AC_MSG_FAILURE([could not widen time_t])]) |
| AC_OUTPUT |
| ]]) |
| AT_CHECK_AUTOCONF |
| AT_CAPTURE_FILE([config.log]) |
| AT_CHECK([./configure $configure_options || exit 77], [0], [ignore], []) |
| ]) |
| |
| ## ------------------------------- ## |
| ## Obsolete non-updatable macros. ## |
| ## ------------------------------- ## |
| |
| |
| AT_CHECK_MACRO([AC_SYS_RESTARTABLE_SYSCALLS], , ,[-W no-obsolete], [no-cross]) |
| AT_CHECK_MACRO([AC_FUNC_SETVBUF_REVERSED], , ,[-W no-obsolete]) |
| AT_CHECK_MACRO([AC_FUNC_WAIT3], , ,[-W no-obsolete], [no-cross]) |
| |
| |
| ## ------------------------------------- ## |
| ## Obsolete macros requiring arguments. ## |
| ## ------------------------------------- ## |
| |
| # These all wrap the macro under test in an AC_CACHE_CHECK and an |
| # AC_DEFINE so the full verification machinery of AT_CHECK_MACRO is |
| # effective. Caution: AT_CHECK_AU_MACRO expects that after an |
| # autoupdate run, a naive grep will not find the old macro name |
| # anywhere in the updated configure.ac, not even as part of a |
| # longer identifier. (But it's case sensitive.) |
| |
| AT_CHECK_AU_MACRO([AC_TRY_CPP], |
| [[AC_CACHE_CHECK([working ac_try_cpp], [ac_cv_ac_try_cpp_works], [ |
| AC_TRY_CPP([ |
| @%:@if 2 + 2 != 4 |
| @%:@error "SEVEN!" /* in memory of Stanislaw Lem */ |
| @%:@endif |
| ], [ac_cv_ac_try_cpp_works=yes], |
| [ac_cv_ac_try_cpp_works=no]) |
| ]) |
| if test $ac_cv_ac_try_cpp_works = yes; then |
| AC_DEFINE([ac_try_cpp_works], [1], [label]) |
| fi |
| ]]) |
| |
| |
| AT_CHECK_AU_MACRO([AC_TRY_COMPILE], |
| [[AC_CACHE_CHECK([working ac_try_compile], [ac_cv_ac_try_compile_works], [ |
| AC_TRY_COMPILE([int variable;], [return variable;], |
| [ac_cv_ac_try_compile_works=yes], |
| [ac_cv_ac_try_compile_works=no]) |
| ]) |
| if test $ac_cv_ac_try_compile_works = yes; then |
| AC_DEFINE([ac_try_compile_works], [1], [label]) |
| fi |
| ]]) |
| |
| |
| AT_CHECK_AU_MACRO([AC_TRY_LINK], |
| [[AC_CACHE_CHECK([working ac_try_link], [ac_cv_ac_try_link_works], [ |
| AC_TRY_LINK([@%:@include <stdio.h>], [return !feof(stdin);], |
| [ac_cv_ac_try_link_works=yes], |
| [ac_cv_ac_try_link_works=no]) |
| ]) |
| if test $ac_cv_ac_try_link_works = yes; then |
| AC_DEFINE([ac_try_link_works], [1], [label]) |
| fi |
| ]]) |
| |
| |
| # Oddly enough, AC_COMPILE_CHECK was shorthand for AC_MSG_CHECKING + |
| # AC_TRY_LINK, not AC_TRY_COMPILE. When not cached, this will print |
| # checking for working ac_compile_check... checking for feof ... yes |
| # but whatever. |
| AT_CHECK_AU_MACRO([AC_COMPILE_CHECK], |
| [[AC_CACHE_CHECK([working ac_compile_check], [ac_cv_ac_compile_check_works], [ |
| AC_COMPILE_CHECK([feof], [@%:@include <stdio.h>], [return !feof(stdin);], |
| [ac_cv_ac_compile_check_works=yes], |
| [ac_cv_ac_compile_check_works=no]) |
| ]) |
| if test $ac_cv_ac_compile_check_works = yes; then |
| AC_DEFINE([ac_compile_check_works], [1], [label]) |
| fi |
| ]]) |
| |
| |
| AT_CHECK_AU_MACRO([AC_TRY_RUN], |
| [[AC_CACHE_CHECK([working ac_try_run], [ac_cv_ac_try_run_works], [ |
| AC_TRY_RUN([int main(void) { return 0; }], |
| [ac_cv_ac_try_run_works=yes], |
| [ac_cv_ac_try_run_works=no], |
| [ac_cv_ac_try_run_works=yes]) # cross compile, assume it works |
| ]) |
| if test $ac_cv_ac_try_run_works = yes; then |
| AC_DEFINE([ac_try_run_works], [1], [label]) |
| fi |
| ]]) |
| |
| |
| # For purpose of this test, we don't care whether these libraries |
| # exist (as long as the result is consistent between C and C++) |
| # but we _do_ need to make sure that autoupdate correctly handles |
| # AC_HAVE_LIBRARY's acceptance of "-lfoo" and "libfoo.a" as the |
| # LIBRARY argument, where AC_CHECK_LIB only takes "foo". |
| AT_CHECK_AU_MACRO([AC_HAVE_LIBRARY], |
| [[AC_HAVE_LIBRARY([alice]) |
| AC_HAVE_LIBRARY([-lbob]) |
| AC_HAVE_LIBRARY([libmallory.a]) |
| ]]) |
| |
| |
| ## ----------------------------------------- ## |
| ## Expansion of whitespace-separated lists. ## |
| ## ----------------------------------------- ## |
| |
| |
| m4_define([AT_CHECK_EXPANSION_IN_FUNCS], |
| [AT_SETUP([Macro expansion in $1]m4_if([$2],[literal],[],[ (literal)])) |
| |
| AT_CONFIGURE_AC([[ |
| m4@&t@_define([fn_bar],[fn_quux]) |
| $1([dn@&t@l |
| fn_foo dn@&t@l |
| fn_nocomment |
| fn_bar dn@&t@l Ordinary comment |
| fn_blurf dn@&t@l Apos'trophed comment |
| ]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [0], [], |
| [configure.ac:6: warning: whitespace-separated list contains macros; |
| configure.ac:6: in a future version of Autoconf they will not be expanded |
| configure.ac:6: note: 'dn@&t@l' is a macro |
| functions.m4: $1 is expanded from... |
| configure.ac:6: the top level |
| ]) |
| AT_CHECK_AUTOHEADER([-W no-obsolete], [ |
| HAVE_FN_BLURF |
| HAVE_FN_FOO |
| HAVE_FN_NOCOMMENT |
| HAVE_FN_QUUX |
| ]) |
| AT_CHECK_CONFIGURE |
| AT_CLEANUP |
| |
| m4_if([$2], [literal], [], [ |
| AT_SETUP([Macro expansion in $1 (variable)]) |
| |
| AT_CONFIGURE_AC([[ |
| m4@&t@_define([fn_bar],[fn_quux]) |
| fns="fn_foo" _AH_CHECK_FUNC([fn_foo]) |
| fns="$fns fn_nocomment" _AH_CHECK_FUNC([fn_nocomment]) |
| $1([dn@&t@l |
| $[]fns |
| fn_bar dn@&t@l Ordinary comment |
| fn_blurf dn@&t@l Apos'trophed comment |
| ]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [0], [], |
| [configure.ac:8: warning: whitespace-separated list contains macros; |
| configure.ac:8: in a future version of Autoconf they will not be expanded |
| configure.ac:8: note: 'dn@&t@l' is a macro |
| functions.m4: $1 is expanded from... |
| configure.ac:8: the top level |
| configure.ac:8: warning: $1($fns): you should use literals |
| functions.m4: $1 is expanded from... |
| configure.ac:8: the top level |
| ]) |
| AT_CHECK_AUTOHEADER([-W no-obsolete], [ |
| HAVE_FN_BLURF |
| HAVE_FN_FOO |
| HAVE_FN_NOCOMMENT |
| HAVE_FN_QUUX |
| ]) |
| AT_CHECK_CONFIGURE |
| AT_CLEANUP |
| ])]) |
| |
| m4_define([AT_CHECK_EXPANSION_IN_HEADERS], |
| [AT_SETUP([Macro expansion in $1]m4_if([$2],[literal],[],[ (literal)])) |
| |
| AT_CONFIGURE_AC([[ |
| m4@&t@_define([bar],[quux]) |
| $1([dn@&t@l |
| foo.h dn@&t@l |
| nocomment.h |
| bar.h dn@&t@l Ordinary comment |
| blurf.h dn@&t@l Apos'trophed comment |
| ]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [0], [], |
| [configure.ac:6: warning: whitespace-separated list contains macros; |
| configure.ac:6: in a future version of Autoconf they will not be expanded |
| configure.ac:6: note: 'dn@&t@l' is a macro |
| headers.m4: $1 is expanded from... |
| configure.ac:6: the top level |
| ]) |
| AT_CHECK_AUTOHEADER([-W no-obsolete], [ |
| HAVE_BLURF_H |
| HAVE_FOO_H |
| HAVE_INTTYPES_H |
| HAVE_NOCOMMENT_H |
| HAVE_QUUX_H |
| HAVE_STDINT_H |
| HAVE_STDIO_H |
| HAVE_STDLIB_H |
| HAVE_STRINGS_H |
| HAVE_STRING_H |
| HAVE_SYS_STAT_H |
| HAVE_SYS_TYPES_H |
| HAVE_UNISTD_H |
| STDC_HEADERS |
| ]) |
| AT_CHECK_CONFIGURE |
| AT_CLEANUP |
| |
| m4_if([$2], [literal], [], [ |
| AT_SETUP([Macro expansion in $1 (variable)]) |
| |
| AT_CONFIGURE_AC([[ |
| m4@&t@_define([bar],[quux]) |
| hs="foo.h" _AH_CHECK_HEADER([foo.h]) |
| hs="$hs nocomment.h" _AH_CHECK_HEADER([nocomment.h]) |
| $1([dn@&t@l |
| $[]hs |
| bar.h dn@&t@l Ordinary comment |
| blurf.h dn@&t@l Apos'trophed comment |
| ]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [0], [], |
| [configure.ac:8: warning: whitespace-separated list contains macros; |
| configure.ac:8: in a future version of Autoconf they will not be expanded |
| configure.ac:8: note: 'dn@&t@l' is a macro |
| headers.m4: $1 is expanded from... |
| configure.ac:8: the top level |
| configure.ac:8: warning: $1($hs): you should use literals |
| headers.m4: $1 is expanded from... |
| configure.ac:8: the top level |
| ]) |
| AT_CHECK_AUTOHEADER([-W no-obsolete], [ |
| HAVE_BLURF_H |
| HAVE_FOO_H |
| HAVE_INTTYPES_H |
| HAVE_NOCOMMENT_H |
| HAVE_QUUX_H |
| HAVE_STDINT_H |
| HAVE_STDIO_H |
| HAVE_STDLIB_H |
| HAVE_STRINGS_H |
| HAVE_STRING_H |
| HAVE_SYS_STAT_H |
| HAVE_SYS_TYPES_H |
| HAVE_UNISTD_H |
| STDC_HEADERS |
| ]) |
| AT_CHECK_CONFIGURE |
| AT_CLEANUP |
| ])]) |
| |
| AT_CHECK_EXPANSION_IN_FUNCS([AC_CHECK_FUNCS]) |
| AT_CHECK_EXPANSION_IN_FUNCS([AC_CHECK_FUNCS_ONCE], [literal]) |
| AT_CHECK_EXPANSION_IN_FUNCS([AC_REPLACE_FUNCS]) |
| |
| AT_CHECK_EXPANSION_IN_HEADERS([AC_CHECK_HEADERS]) |
| AT_CHECK_EXPANSION_IN_HEADERS([AC_CHECK_HEADERS_ONCE], [literal]) |
| |
| AT_SETUP([Macro expansion in AC_CHECK_FILES]) |
| |
| AT_CONFIGURE_AC([[ |
| m4@&t@_define([f_bar], [f_quux]) |
| AC_CHECK_FILES([dn@&t@l |
| /nonex/f_foo |
| /nonex/f_bar dn@&t@l Ordinary comment |
| /nonex/f_blurf dn@&t@l Apos'trophed comment |
| ]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [0], [], |
| [configure.ac:6: warning: whitespace-separated list contains macros; |
| configure.ac:6: in a future version of Autoconf they will not be expanded |
| configure.ac:6: note: 'dn@&t@l' is a macro |
| general.m4: AC_CHECK_FILES is expanded from... |
| configure.ac:6: the top level |
| ]) |
| AT_CHECK_AUTOHEADER([-W no-obsolete], [ |
| HAVE__NONEX_F_BLURF |
| HAVE__NONEX_F_FOO |
| HAVE__NONEX_F_QUUX |
| ]) |
| |
| AT_CHECK_CONFIGURE |
| AT_CLEANUP |
| |
| AT_SETUP([Macro expansion in AC_CONFIG_MACRO_DIRS]) |
| |
| AT_CONFIGURE_AC([[ |
| m4@&t@_define([d_bar], [d_quux]) |
| AC_CONFIG_MACRO_DIRS([dn@&t@l |
| d_foo |
| d_bar dn@&t@l Ordinary comment |
| d_blurf dn@&t@l Apos'trophed comment |
| ]) |
| ]]) |
| AT_CHECK_AUTOCONF([-t AC_CONFIG_MACRO_DIR_TRACE], [0], |
| [configure.ac:6:AC_CONFIG_MACRO_DIR_TRACE:d_foo |
| configure.ac:6:AC_CONFIG_MACRO_DIR_TRACE:d_quux |
| configure.ac:6:AC_CONFIG_MACRO_DIR_TRACE:d_blurf |
| ], |
| [configure.ac:6: warning: whitespace-separated list contains macros; |
| configure.ac:6: in a future version of Autoconf they will not be expanded |
| configure.ac:6: note: 'dn@&t@l' is a macro |
| general.m4: AC_CONFIG_MACRO_DIRS is expanded from... |
| configure.ac:6: the top level |
| ]) |
| |
| AT_CLEANUP |
| |
| AT_SETUP([Macro expansion in AC_CONFIG_SUBDIRS]) |
| |
| (set -ex |
| for d in d_foo d_bar d_blurf d_quux; do |
| mkdir $d |
| printf '%s\n%s\n' '#! /bin/sh' "echo entered $d/configure" \ |
| > $d/configure |
| chmod +x $d/configure |
| done) |
| |
| AT_CONFIGURE_AC([[ |
| m4@&t@_define([d_bar], [d_quux]) |
| AC_CONFIG_SUBDIRS([dn@&t@l |
| d_foo |
| d_bar dn@&t@l Ordinary comment |
| d_blurf dn@&t@l Apos'trophed comment |
| ]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [0], [], |
| [configure.ac:6: warning: whitespace-separated list contains macros; |
| configure.ac:6: in a future version of Autoconf they will not be expanded |
| configure.ac:6: note: 'dn@&t@l' is a macro |
| status.m4: AC_CONFIG_SUBDIRS is expanded from... |
| configure.ac:6: the top level |
| ]) |
| AT_CHECK_AUTOHEADER([-W no-obsolete]) |
| AT_CHECK_CONFIGURE([], [0], [stdout]) |
| AT_CHECK([grep '^entered' stdout], [0], |
| [[entered d_foo/configure |
| entered d_quux/configure |
| entered d_blurf/configure |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## ------------------------------------- ## |
| ## AC_PROG_LEX with and without yywrap. ## |
| ## ------------------------------------- ## |
| |
| # We don't currently have a good way of verifying that each mode |
| # does what it's supposed to, but we can at least put them through |
| # their paces as much as the autogenerated AT_CHECK_MACRO invocation |
| # used to, back when AC_PROG_LEX took no arguments. |
| |
| AT_CHECK_MACRO([AC_PROG_LEX with noyywrap], [AC_PROG_LEX([noyywrap])]) |
| |
| AT_CHECK_MACRO([AC_PROG_LEX with yywrap], [AC_PROG_LEX([yywrap])], |
| [], [], [], |
| [# Skip this test on OSes where there is no -ll nor -lfl. |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT([lexlib-probe], [1]) |
| AC_PROG_CC |
| AC_SEARCH_LIBS([yywrap], [l fl], [], [AS_EXIT(77)]) |
| AC_OUTPUT |
| ]]) |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| ]) |
| |
| |
| AT_SETUP([AC_PROG_LEX in legacy mode]) |
| |
| AT_CONFIGURE_AC([[AC_PROG_LEX]]) |
| AT_CHECK_AUTOHEADER([], [ignore]) |
| AT_CHECK_AUTOCONF([], [], [], |
| [[configure.ac:4: warning: AC_PROG_LEX without either yywrap or noyywrap is obsolete |
| programs.m4: _AC_PROG_LEX is expanded from... |
| programs.m4: AC_PROG_LEX is expanded from... |
| configure.ac:4: the top level |
| ]]) |
| |
| AT_CHECK_CONFIGURE |
| |
| AT_CLEANUP |
| |
| |
| ## ---------------------------------- ## |
| ## Invalid arguments to AC_PROG_LEX. ## |
| ## ---------------------------------- ## |
| |
| AT_SETUP([Invalid arguments to AC_PROG_LEX]) |
| |
| AT_CONFIGURE_AC( |
| [[AC_PROG_LEX([nonsense]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [1], [], |
| [[configure.ac:4: error: AC_PROG_LEX: unrecognized argument: nonsense |
| programs.m4: _AC_PROG_LEX is expanded from... |
| programs.m4: AC_PROG_LEX is expanded from... |
| configure.ac:4: the top level |
| autom4te: error: m4 failed with exit status: 1 |
| ]]) |
| |
| AT_CONFIGURE_AC( |
| [[AC_PROG_LEX([too],[many]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [1], [], |
| [[configure.ac:4: error: too many arguments to AC_PROG_LEX |
| programs.m4: AC_PROG_LEX is expanded from... |
| configure.ac:4: the top level |
| autom4te: error: m4 failed with exit status: 1 |
| ]]) |
| |
| AT_CONFIGURE_AC( |
| [[AC_PROG_LEX([yywrap noyywrap]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [1], [], |
| [[configure.ac:4: error: AC_PROG_LEX: yywrap and noyywrap are mutually exclusive |
| programs.m4: _AC_PROG_LEX is expanded from... |
| programs.m4: AC_PROG_LEX is expanded from... |
| configure.ac:4: the top level |
| autom4te: error: m4 failed with exit status: 1 |
| ]]) |
| |
| AT_CONFIGURE_AC( |
| [[AC_PROG_LEX([noyywrap yywrap]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [1], [], |
| [[configure.ac:4: error: AC_PROG_LEX: yywrap and noyywrap are mutually exclusive |
| programs.m4: _AC_PROG_LEX is expanded from... |
| programs.m4: AC_PROG_LEX is expanded from... |
| configure.ac:4: the top level |
| autom4te: error: m4 failed with exit status: 1 |
| ]]) |
| |
| AT_CONFIGURE_AC( |
| [[AC_PROG_LEX([yywrap nonsense]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [1], [], |
| [[configure.ac:4: error: AC_PROG_LEX: unrecognized argument: yywrap nonsense |
| programs.m4: _AC_PROG_LEX is expanded from... |
| programs.m4: AC_PROG_LEX is expanded from... |
| configure.ac:4: the top level |
| autom4te: error: m4 failed with exit status: 1 |
| ]]) |
| |
| AT_CONFIGURE_AC( |
| [[AC_PROG_LEX([nonsense noyywrap]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [1], [], |
| [[configure.ac:4: error: AC_PROG_LEX: unrecognized argument: nonsense noyywrap |
| programs.m4: _AC_PROG_LEX is expanded from... |
| programs.m4: AC_PROG_LEX is expanded from... |
| configure.ac:4: the top level |
| autom4te: error: m4 failed with exit status: 1 |
| ]]) |
| |
| # A double invocation with matching arguments should be accepted |
| # without complaint. FIXME: verify that it runs the test only once. |
| AT_CONFIGURE_AC( |
| [[AC_PROG_LEX([noyywrap]) |
| AC_PROG_LEX([noyywrap]) |
| ]]) |
| AT_CHECK_AUTOCONF |
| |
| # A double invocation with matching arguments should trigger a warning. |
| AT_CONFIGURE_AC( |
| [[AC_PROG_LEX([yywrap]) |
| AC_PROG_LEX([noyywrap]) |
| ]]) |
| AT_CHECK_AUTOCONF([], [0], [], |
| [[configure.ac:5: warning: AC_PROG_LEX used twice with mismatched options |
| programs.m4: _AC_PROG_LEX is expanded from... |
| programs.m4: AC_PROG_LEX is expanded from... |
| configure.ac:5: the top level |
| ]]) |
| |
| AT_CLEANUP |