From d7fb4311ce271bf84fb44553b435036356720e5b Mon Sep 17 00:00:00 2001 From: Ralf Wildenhues Date: Tue, 3 Mar 2009 21:10:43 +0100 Subject: [PATCH] Fix w32 path handling in the `compile' script. * lib/compile: Handle colons and backslashes in win32 paths. * tests/compile2.test: New test. * tests/Makefile.am: Update. Report and initial patch by Peter Rosin. Signed-off-by: Ralf Wildenhues --- ChangeLog | 9 +++++ lib/compile | 11 +++--- tests/Makefile.am | 1 + tests/Makefile.in | 1 + tests/compile2.test | 85 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 5 deletions(-) create mode 100755 tests/compile2.test diff --git a/ChangeLog b/ChangeLog index 19dbab4b4..c347d1ba4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-03-03 Ralf Wildenhues + Peter Rosin + + Fix w32 path handling in the `compile' script. + * lib/compile: Handle colons and backslashes in win32 paths. + * tests/compile2.test: New test. + * tests/Makefile.am: Update. + Report and initial patch by Peter Rosin. + 2009-03-03 Ralf Wildenhues Fix `use constant' usage for MSYS Perl 5.6.0. diff --git a/lib/compile b/lib/compile index 35af80994..af472ac9a 100755 --- a/lib/compile +++ b/lib/compile @@ -1,9 +1,10 @@ #! /bin/sh # Wrapper for compilers which do not understand `-c -o'. -scriptversion=2005-05-14.22 +scriptversion=2009-03-03.21 -# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software +# Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify @@ -102,13 +103,13 @@ if test -z "$ofile" || test -z "$cfile"; then fi # Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. -# Note: use `[/.-]' here to ensure that we don't use the same name +# Note: use `[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break diff --git a/tests/Makefile.am b/tests/Makefile.am index 3a55de003..2d8a9741c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -121,6 +121,7 @@ comment8.test \ comment9.test \ commen10.test \ compile.test \ +compile2.test \ compile_f90_c_cxx.test \ compile_f_c_cxx.test \ cond.test \ diff --git a/tests/Makefile.in b/tests/Makefile.in index 259ca62ea..92434abd0 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -276,6 +276,7 @@ comment8.test \ comment9.test \ commen10.test \ compile.test \ +compile2.test \ compile_f90_c_cxx.test \ compile_f_c_cxx.test \ cond.test \ diff --git a/tests/compile2.test b/tests/compile2.test new file mode 100755 index 000000000..9f5d7b380 --- /dev/null +++ b/tests/compile2.test @@ -0,0 +1,85 @@ +#! /bin/sh +# Copyright (C) 2009 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, 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 . + +# Make sure `compile' deals correctly with w32 style paths. + +. ./defs || Exit 1 + +set -e + +cp "$testsrcdir/../lib/compile" . + +cat >mycc <<'END' +source_seen=no +for arg +do + test "X$arg" = X-o && exit 1 + test "X$arg" = "X$amtest_source" && source_seen=yes +done +if test "$source_seen" != yes; then + echo "$0: no source file seen" >&2 + exit 1 +fi +if test ! -f "$amtest_source"; then + echo "$0: $amtest_source not readable" >&2 + exit 1 +fi +if test ! -d "$amtest_lock"; then + echo "$0: no lockdir $amtest_lock" >&2 + exit 1 +fi +touch "$amtest_obj" +END + +chmod +x ./mycc + +# In case this test runs on a system with backslash directory separators: +mkdir libltdl libltdl/libltdl + +# Backslashes in the input and the output name should be accepted. +# Since this test might run on non-w32 systems, we need to be careful not +# to use any backslash sequences which might be interpreted by `echo'. +amtest_source='libltdl\libltdl\slist.c' +amtest_object='libtldl\libltdl\libltdl_libltdl_la-slist.obj' +amtest_obj='slist.o' +amtest_lock='slist_o.d' +export amtest_source amtest_object amtest_obj amtest_lock + +: > "$amtest_source" +./compile ./mycc -c "$amtest_source" -o "$amtest_object" +test -f "$amtest_object" + + +# Absolute w32 paths should be accepted. +# Do not actually run this test on anything that could be w32. +test -d "C:\\" && exit 77 +# This test is taken from Autoconf's _AS_PATH_SEPARATOR_PREPARE. +(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + exit 77 +} + +amtest_source='C:\libltdl\libltdl\slist.c' +amtest_object='C:\libtldl\libltdl\libltdl_libltdl_la-slist.obj' +amtest_obj='slist.o' +amtest_lock='slist_o.d' +export amtest_source amtest_object amtest_obj amtest_lock + +: > "$amtest_source" +./compile ./mycc -c "$amtest_source" -o "$amtest_object" +test -f "$amtest_object" + +: -- 2.47.2