Hi Paul, This patch looks really great! Thanks for doing that.
I've changed a couple of things: 1) exit 77 as soon as one "mkdir $file" fails (perhaps this could be done in a more subtle way, but I'm not sure that is really important) 2) exit 0 if no unexpected failure or success (was that exit 77 intended?) 3) `make file="$file"' is written as `file=$file make -e' in all the test suite for portability to non-GNU makes in case there are recursive make invocations (`make maintainer-check' will complain about the former syntax) 4) $ht and $sp do not fail for me. I had to remove these from both lists of expected failures. Do they fail for you? [I think this is independent from the Autoconf patch I posted. The errors messages while checking for config.site do not abort configure.] Below is the new version. But this last point worries me. Paul> The worst case are two tests that cause infinite loops. Ouch! The Paul> script doesn't attempt to run those two tests. Look for 'infinite Paul> loop' in the patch below. This seems to come from this bit of config.status: sed " :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$configure_input|;t t s|@top_builddir@|$ac_top_builddir_sub|;t t s|@srcdir@|$ac_srcdir|;t t s|@abs_srcdir@|$ac_abs_srcdir|;t t s|@top_srcdir@|$ac_top_srcdir|;t t s|@abs_top_srcdir@|$ac_abs_top_srcdir|;t t s|@builddir@|$ac_builddir|;t t s|@abs_builddir@|$ac_abs_builddir|;t t s|@abs_top_builddir@|$ac_abs_top_builddir|;t t s|@INSTALL@|$ac_INSTALL|;t t " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out $ac_abs_srcdir, $ac_top_srcdir, and $ac_abs_top_srcdir all contain a '&', so the matched pattern gets inserted back into the output. Then sed processes the line again and loop infinitely. Paul> I suppose that these lists should either be shortened, or Paul> documented, or both. Agreed, both :) Paul> 2005-07-01 Paul Eggert <[EMAIL PROTECTED]> Paul> * tests/instspc.test: Major rewrite to test for many other Paul> problematic file names, e.g., '$', '"', '('. Automake and Paul> Autoconf can't handle many of them, so report an expected Paul> failure if the usual candidates show up. Index: tests/instspc.test =================================================================== RCS file: /cvs/automake/automake/tests/instspc.test,v retrieving revision 1.3 diff -u -r1.3 instspc.test --- tests/instspc.test 14 May 2005 20:28:55 -0000 1.3 +++ tests/instspc.test 2 Jul 2005 22:14:40 -0000 @@ -1,5 +1,5 @@ #! /bin/sh -# Copyright (C) 2004 Free Software Foundation, Inc. +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is part of GNU Automake. # @@ -18,12 +18,13 @@ # the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02110-1301, USA. -# Check that installation to directory with spaces succeed. -# Report from James Amundson. +# Check that installation to directory with shell metacharacters succeed. +# Original report from James Amundson about file names with spaces. +# Other characters added by Paul Eggert. # This is mostly the same input as nobase.test, but we do not use # libtool libraries, because Libtool does not preserve space in -# filenames (Issue observed with ltmain.sh (GNU libtool) 1.5a (1.1323 +# file names (Issue observed with ltmain.sh (GNU libtool) 1.5a (1.1323 # 2003/11/10 21:06:47)) @@ -32,8 +33,7 @@ set -e -# Make sure this system supports spaces in filenames. -mkdir 'a b' || exit 77 +# Set up files that won't change each time through the loop. cat >> configure.in <<'EOF' AC_PROG_CC @@ -41,6 +41,24 @@ AC_OUTPUT EOF +mkdir sub + +: > sub/base.h +: > sub/nobase.h +: > sub/base.dat +: > sub/nobase.dat +: > sub/base.sh +: > sub/nobase.sh + +cat >source.c <<'EOF' +int +main (int argc, char **argv) +{ + return 0; +} +EOF +cp source.c source2.c + cat > Makefile.am << 'EOF' foodir = $(prefix)/foo fooexecdir = $(prefix)/foo @@ -64,50 +82,127 @@ sub_libbase_a_SOURCES = source.c sub_libnobase_a_SOURCES = source.c -test-install-space: install - test -f "$(DESTDIR)/more space/foo/sub/nobase.h" - test ! -f "$(DESTDIR)/more space/foo/nobase.h" - test -f "$(DESTDIR)/more space/foo/base.h" - test -f "$(DESTDIR)/more space/foo/sub/nobase.dat" - test ! -f "$(DESTDIR)/more space/foo/nobase.dat" - test -f "$(DESTDIR)/more space/foo/base.dat" - test -f "$(DESTDIR)/more space/foo/sub/nobase.sh" - test ! -f "$(DESTDIR)/more space/foo/nobase.sh" - test -f "$(DESTDIR)/more space/foo/base.sh" - test -f "$(DESTDIR)/more space/foo/sub/nobase$(EXEEXT)" - test ! -f "$(DESTDIR)/more space/foo/nobase$(EXEEXT)" - test -f "$(DESTDIR)/more space/foo/base$(EXEEXT)" - test -f "$(DESTDIR)/more space/foo/sub/libnobase.a" - test ! -f "$(DESTDIR)/more space/foo/libnobase.a" - test -f "$(DESTDIR)/more space/foo/libbase.a" +test-install-sep: install + test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase.h' + test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase.h' + test -f '$(DESTDIR)/$(file)-prefix/foo/base.h' + test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase.dat' + test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase.dat' + test -f '$(DESTDIR)/$(file)-prefix/foo/base.dat' + test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase.sh' + test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase.sh' + test -f '$(DESTDIR)/$(file)-prefix/foo/base.sh' + test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase$(EXEEXT)' + test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase$(EXEEXT)' + test -f '$(DESTDIR)/$(file)-prefix/foo/base$(EXEEXT)' + test -f '$(DESTDIR)/$(file)-prefix/foo/sub/libnobase.a' + test ! -f '$(DESTDIR)/$(file)-prefix/foo/libnobase.a' + test -f '$(DESTDIR)/$(file)-prefix/foo/libbase.a' EOF -mkdir sub - -: > sub/base.h -: > sub/nobase.h -: > sub/base.dat -: > sub/nobase.dat -: > sub/base.sh -: > sub/nobase.sh - -cat >source.c <<'EOF' -int -main (int argc, char *argv[]) -{ - return 0; -} -EOF -cp source.c source2.c - $ACLOCAL $AUTOCONF $AUTOMAKE -a -mkdir build -cd build +# Some control characters that are white space: +# back space, carriage return, form feed, horizontal tab, line feed, space +bs='' +cr=' ' +ff='' +ht=' ' +lf=' +' +sp=' ' + +build_failures= +install_failures= + +for file in \ + '!' '"' '#' '$' '%' '&' \' '(' ')' '*' '+' ',' '-' ':' ';' \ + '<' '=' '>' '?' '@' '[' '\' ']' '^' '`' '{' '|' '}' '~' \ + "$bs" "$cr" "$ff" "$ht" "$lf" "$sp" \ + '@<:@' '@:>@' '@S|@' '@%:@' '@&t@' \ + "a${sp}b" "a${sp}${sp}b" "a${lf}b" ... a: +do + for test in build install; do + case $test in + build) + build=$file + dest=`pwd`/sub1;; + install) + build=sub1 + dest=`pwd`/$file;; + esac + + # Make sure this system supports this character in file names. + if mkdir sub1 "./$file"; then + cd "$build" + + # Some tests are known to fail, with infinite loops! + # Don't bother to run them; assume they'll fail. + case $test-$file in + 'build-&' | 'build-@&t@') false;; + *) + ../configure --prefix "/$file-prefix" && + $MAKE && + DESTDIR=$dest file=$file $MAKE -e test-install-sep;; + esac || + eval "${test}_failures=\"\$${test}_failures$lf\$file\"" + + cd .. + else + exit 77 + fi + + rm -fr sub1 "./$file" + done +done + +# The list of the above file names that cannot be used as a build directory +# on a POSIX host. This list should be empty, but is not due to limitations +# in Autoconf, Automake, Make, or M4. +expected_build_failures=' +" +# +$ +% +& +'\'' +\ +` +| +'"$lf"' [EMAIL PROTECTED]|@ [EMAIL PROTECTED]:@ +@&t@ +a'"${lf}"'b' + +# Similarly, the list of file names that cannot be used as an install directory +# on a POSIX host. This list should also be empty. +expected_install_failures=' +" +# +$ +% +'\'' +* +` +'"$lf"' [EMAIL PROTECTED]:@ +a'"${lf}"'b' + +fail=0 +for test in build install; do + eval failures=\$${test}_failures + case $failures in + ?*) + cat >&2 <<EOF +$0: $test test failed for the following file names:$failures +EOF + if eval test \"\$failures\" != \"\$expected_${test}_failures\"; then + fail=1 + fi + esac +done -../configure --prefix '/more space' -$MAKE -dest=`pwd`/'with space'; -DESTDIR=$dest $MAKE -e test-install-space +exit $fail -- Alexandre Duret-Lutz
#! /bin/sh # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is part of GNU Automake. # # GNU Automake 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. # # GNU Automake 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 Automake; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02110-1301, USA. # Check that installation to directory with shell metacharacters succeed. # Original report from James Amundson about file names with spaces. # Other characters added by Paul Eggert. # This is mostly the same input as nobase.test, but we do not use # libtool libraries, because Libtool does not preserve space in # file names (Issue observed with ltmain.sh (GNU libtool) 1.5a (1.1323 # 2003/11/10 21:06:47)) required='gcc' . ./defs || exit 1 set -e # Set up files that won't change each time through the loop. cat >> configure.in <<'EOF' AC_PROG_CC AC_PROG_RANLIB AC_OUTPUT EOF mkdir sub : > sub/base.h : > sub/nobase.h : > sub/base.dat : > sub/nobase.dat : > sub/base.sh : > sub/nobase.sh cat >source.c <<'EOF' int main (int argc, char **argv) { return 0; } EOF cp source.c source2.c cat > Makefile.am << 'EOF' foodir = $(prefix)/foo fooexecdir = $(prefix)/foo foo_HEADERS = sub/base.h nobase_foo_HEADERS = sub/nobase.h dist_foo_DATA = sub/base.dat nobase_dist_foo_DATA = sub/nobase.dat dist_fooexec_SCRIPTS = sub/base.sh nobase_dist_fooexec_SCRIPTS = sub/nobase.sh fooexec_PROGRAMS = sub/base nobase_fooexec_PROGRAMS = sub/nobase sub_base_SOURCES = source.c sub_nobase_SOURCES = source.c fooexec_LIBRARIES = sub/libbase.a nobase_fooexec_LIBRARIES = sub/libnobase.a sub_libbase_a_SOURCES = source.c sub_libnobase_a_SOURCES = source.c test-install-sep: install test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase.h' test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase.h' test -f '$(DESTDIR)/$(file)-prefix/foo/base.h' test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase.dat' test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase.dat' test -f '$(DESTDIR)/$(file)-prefix/foo/base.dat' test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase.sh' test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase.sh' test -f '$(DESTDIR)/$(file)-prefix/foo/base.sh' test -f '$(DESTDIR)/$(file)-prefix/foo/sub/nobase$(EXEEXT)' test ! -f '$(DESTDIR)/$(file)-prefix/foo/nobase$(EXEEXT)' test -f '$(DESTDIR)/$(file)-prefix/foo/base$(EXEEXT)' test -f '$(DESTDIR)/$(file)-prefix/foo/sub/libnobase.a' test ! -f '$(DESTDIR)/$(file)-prefix/foo/libnobase.a' test -f '$(DESTDIR)/$(file)-prefix/foo/libbase.a' EOF $ACLOCAL $AUTOCONF $AUTOMAKE -a # Some control characters that are white space: # back space, carriage return, form feed, horizontal tab, line feed, space bs='' cr=' ' ff='' ht=' ' lf=' ' sp=' ' build_failures= install_failures= for file in \ '!' '"' '#' '$' '%' '&' \' '(' ')' '*' '+' ',' '-' ':' ';' \ '<' '=' '>' '?' '@' '[' '\' ']' '^' '`' '{' '|' '}' '~' \ "$bs" "$cr" "$ff" "$ht" "$lf" "$sp" \ '@<:@' '@:>@' '@S|@' '@%:@' '@&t@' \ "a${sp}b" "a${sp}${sp}b" "a${lf}b" ... a: do for test in build install; do case $test in build) build=$file dest=`pwd`/sub1;; install) build=sub1 dest=`pwd`/$file;; esac # Make sure this system supports this character in file names. if mkdir sub1 "./$file"; then cd "$build" # Some tests are known to fail, with infinite loops! # Don't bother to run them; assume they'll fail. case $test-$file in # 'build-&' | 'build-@&t@') false;; *) ../configure --prefix "/$file-prefix" && $MAKE && DESTDIR=$dest file=$file $MAKE -e test-install-sep;; esac || eval "${test}_failures=\"\$${test}_failures$lf\$file\"" cd .. else exit 77 fi rm -fr sub1 "./$file" done done # The list of the above file names that cannot be used as a build directory # on a POSIX host. This list should be empty, but is not due to limitations # in Autoconf, Automake, Make, or M4. expected_build_failures=' " # $ % & '\'' \ ` | '"$lf"' @S|@ @%:@ @&t@ a'"${lf}"'b' # Similarly, the list of file names that cannot be used as an install directory # on a POSIX host. This list should also be empty. expected_install_failures=' " # $ % '\'' * ` '"$lf"' @%:@ a'"${lf}"'b' fail=0 for test in build install; do eval failures=\$${test}_failures case $failures in ?*) cat >&2 <<EOF $0: $test test failed for the following file names:$failures EOF if eval test \"\$failures\" != \"\$expected_${test}_failures\"; then fail=1 fi esac done exit $fail