Hash :
b5c39684
Author :
Date :
2011-10-24T23:18:34
tests: fix spurious failures due to missing 'yywrap()' function The AC_PROG_LEX Autoconf macro does not diagnose a failure to find the "lex library" expected to provide a `yywrap' function (function which is required to link most lex-generated programs). On the contrary, when all the link attempts (i.e., with `-ll' and `-lfl') fail, configure declares that no lex library is needed, and simply proceeds with the configuration process -- only for the build to possibly fail later, at make time. This behaviour is intended; the Autoconf manual reads: ``You are encouraged to use Flex in your sources, since it is both more pleasant to use than plain Lex and the C source it produces is portable. In order to ensure portability, however, you must either provide a function `yywrap' or, if you don't use it (e.g., your scanner has no `#include'-like feature), simply include a `%noyywrap' statement in the scanner's source.'' This AC_PROG_LEX behaviour is causing some spurious failures of the Automake testsuite in environments which lack a proper library providing `yywrap' (this happens for example on Fedora-based systems). The proper workaround is to simply provide a fall-back implementation of `yywrap' in our lexers. See also partially-overlapping commit `v1.11-871-geb147a1' (from the 'testsuite-work' branch), which was motivated by similar spurious failures experienced when cross-compiling. Reported by Jim Meyering: <http://lists.gnu.org/archive/html/automake-patches/2011-10/msg00092.html> * tests/cond35.test: Provide a dummy `yywrap' function. * tests/lex3.test: Likewise. * tests/lexvpath.test: Likewise. * tests/silent-lex-generic.test: Likewise. * tests/silent-lex-gcc.test: Likewise.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
#!/bin/sh
# Copyright (C) 2010, 2011 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 2, 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 <http://www.gnu.org/licenses/>.
# Check silent-rules mode for Lex, forcing gcc depmode.
# Keep this in sync with sister test `silent-lex-generic.test'.
required='flex gcc'
. ./defs || Exit 1
mkdir sub
cat >>configure.in <<'EOF'
AM_SILENT_RULES
AM_PROG_CC_C_O
AC_PROG_LEX
AC_CONFIG_FILES([sub/Makefile])
AC_OUTPUT
EOF
cat > Makefile.am <<'EOF'
# Need generic and non-generic rules.
bin_PROGRAMS = foo1 foo2
foo1_SOURCES = foo.l
foo2_SOURCES = $(foo1_SOURCES)
foo2_CFLAGS = $(AM_CFLAGS)
SUBDIRS = sub
LDADD = $(LEXLIB)
EOF
cat > sub/Makefile.am <<'EOF'
AUTOMAKE_OPTIONS = subdir-objects
# Need generic and non-generic rules.
bin_PROGRAMS = bar1 bar2
bar1_SOURCES = bar.l
bar2_SOURCES = $(bar1_SOURCES)
bar2_CFLAGS = $(AM_CFLAGS)
LDADD = $(LEXLIB)
EOF
cat > foo.l <<'EOF'
%%
"END" return EOF;
.
%%
/* Avoid possible link errors. */
int yywrap (void) { return 1; }
int main (void) { return 0; }
EOF
cp foo.l sub/bar.l
$ACLOCAL
$AUTOMAKE --add-missing
$AUTOCONF
# Force gcc ("fast") depmode.
# This apparently useless "for" loop is here to simplify the syncing
# with sister test `silent-lex-gcc.test'.
for config_args in \
am_cv_CC_dependencies_compiler_type=gcc
do
./configure $config_args --enable-silent-rules
$MAKE >stdout || { cat stdout; Exit 1; }
cat stdout
$EGREP ' (-c|-o)' stdout && Exit 1
$EGREP '(mv|ylwrap) ' stdout && Exit 1
grep 'LEX .*foo\.' stdout
grep 'LEX .*bar\.' stdout
grep ' CC .*foo\.' stdout
grep ' CC .*bar\.' stdout
grep 'CCLD .*foo1' stdout
grep 'CCLD .*bar1' stdout
grep 'CCLD .*foo2' stdout
grep 'CCLD .*bar2' stdout
# Cleaning and then rebuilding with the same V flag (and without
# removing the generated sources in between) shouldn't trigger a
# different set of rules.
$MAKE clean
$MAKE >stdout || { cat stdout; Exit 1; }
cat stdout
$EGREP ' (-c|-o)' stdout && Exit 1
$EGREP '(mv|ylwrap) ' stdout && Exit 1
# Don't look for LEX, as probably lex hasn't been re-run.
grep ' CC .*foo\.' stdout
grep ' CC .*bar\.' stdout
grep 'CCLD .*foo1' stdout
grep 'CCLD .*bar1' stdout
grep 'CCLD .*foo2' stdout
grep 'CCLD .*bar2' stdout
# Ensure a truly clean rebuild.
$MAKE clean
rm -f foo.c sub/bar.c
$MAKE V=1 >stdout || { cat stdout; Exit 1; }
cat stdout
grep ' -c ' stdout
grep ' -o ' stdout
grep 'ylwrap ' stdout
$EGREP '(LEX|CC|CCLD) ' stdout && Exit 1
# Cleaning and then rebuilding with the same V flag (and without
# removing the generated sources in between) shouldn't trigger a
# different set of rules.
$MAKE clean
$MAKE V=1 >stdout || { cat stdout; Exit 1; }
cat stdout
# Don't look for ylwrap, as probably lex hasn't been re-run.
grep ' -c ' stdout
grep ' -o ' stdout
$EGREP '(LEX|CC|CCLD) ' stdout && Exit 1
# Ensure a truly clean reconfiguration/rebuild.
$MAKE clean
$MAKE maintainer-clean
rm -f foo.c sub/bar.c
done
: