autoconf/tests/semantics.at

1431 lines
39 KiB
Plaintext

# -*- Autotest -*-
AT_BANNER([Semantics.])
# Copyright (C) 2000-2002, 2004-2007, 2009-2017, 2020-2024 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