[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: improved Automake test for file names with funny characters
From: |
Alexandre Duret-Lutz |
Subject: |
Re: improved Automake test for file names with funny characters |
Date: |
Sun, 03 Jul 2005 00:40:51 +0200 |
User-agent: |
Gnus/5.110003 (No Gnus v0.3) Emacs/21.3.50 (gnu/linux) |
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 <address@hidden>
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"'
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='
+"
+#
+$
+%
+'\''
+*
+`
+'"$lf"'
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 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
- improved Automake test for file names with funny characters, Paul Eggert, 2005/07/01
- Re: improved Automake test for file names with funny characters,
Alexandre Duret-Lutz <=
- Re: improved Automake test for file names with funny characters, Paul Eggert, 2005/07/04
- Re: improved Automake test for file names with funny characters, Alexandre Duret-Lutz, 2005/07/19
- Re: improved Automake test for file names with funny characters, Stepan Kasal, 2005/07/20
- Re: improved Automake test for file names with funny characters, Paul Eggert, 2005/07/20
- Re: improved Automake test for file names with funny characters, Stepan Kasal, 2005/07/21
- Re: improved Automake test for file names with funny characters, Alexandre Duret-Lutz, 2005/07/27
- Re: improved Automake test for file names with funny characters, Alexandre Duret-Lutz, 2005/07/27
Re: improved Automake test for file names with funny characters, Paul Eggert, 2005/07/04