automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

improved Automake test for file names with funny characters


From: Paul Eggert
Subject: improved Automake test for file names with funny characters
Date: Fri, 01 Jul 2005 14:50:26 -0700
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux)

Following up on a discussion in the Autoconf and Automake mailing
lists, here's a proposed patch to Automake to have it test better for
file names with funny characters.  If you look for the
expected_build_failures and expected_install_failures variables,
you'll see the test cases that Automake/Autoconf/Make etc. cannot
handle now.  For example, file names containing '$'.  I suppose that
these lists should either be shortened, or documented, or both.

The worst case are two tests that cause infinite loops.  Ouch!  The
script doesn't attempt to run those two tests.  Look for 'infinite
loop' in the patch below.

Watch out: there are unusual control characters in this patch.  I'll
attach a copy of the patched file too, just in case.

2005-07-01  Paul Eggert  <address@hidden>

        * tests/instspc.test: Major rewrite to test for many other
        problematic file names, e.g., '$', '"', '('.  Automake and
        Autoconf can't handle many of them, so report an expected
        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 -p -u -r1.3 instspc.test
--- tests/instspc.test  14 May 2005 20:28:55 -0000      1.3
+++ tests/instspc.test  1 Jul 2005 21:49:37 -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,8 +18,9 @@
 # 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
@@ -32,8 +33,7 @@ required='gcc'
 
 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_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
@@ -64,50 +82,135 @@ nobase_fooexec_LIBRARIES = sub/libnobase
 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=' '
+
+# Make sure this system supports spaces and other strange
+# characters in file names.
+
+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" $MAKE -e file="$file" test-install-sep;;
+      esac ||
+       eval "${test}_failures=\"\$${test}_failures$lf\$file\""
+
+      cd ..
+    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='
+"
+#
+$
+%
+&
+'\''
+\
+`
+|
+'"$ht"'
+'"$lf"'
+'"$sp"'
address@hidden|@
address@hidden:@
+@&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='
+"
+#
+$
+%
+'\''
+*
+`
+'"$ht"'
+'"$lf"'
+'"$sp"'
address@hidden:@
+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 test $fail != 1 &&
+       eval test \"\$failures\" = \"\$expected_${test}_failures\"; then
+      fail=77
+    else
+      fail=1
+    fi
+  esac
+done
 
-../configure --prefix '/more  space'
-$MAKE
-dest=`pwd`/'with  space';
-DESTDIR=$dest $MAKE -e test-install-space
+exit $fail

Attachment: instspc.test
Description: revised instspc.test


reply via email to

[Prev in Thread] Current Thread [Next in Thread]