[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: 'compile' script calls mv in a way that fails
From: |
Ralf Wildenhues |
Subject: |
Re: 'compile' script calls mv in a way that fails |
Date: |
Tue, 6 Oct 2009 22:37:36 +0200 |
User-agent: |
Mutt/1.5.20 (2009-08-09) |
Hi Bruno,
* Bruno Haible wrote on Sat, Oct 03, 2009 at 02:40:17PM CEST:
> When automake's 'compile' script is called for files in the current directory,
> it invokes 'mv' in a way that fails.
[...]
> When GNU mv produces this error message, it also errs out with exit code 1.
> Here is a proposed patch (tested):
Thanks for the bug report and the test case. We should fix the issue
also when objext is 'obj'; and we should have a test case.
I think the 'compile' script was written as it was because the idea was
that automake wouldn't ever produce a compile command with -o when the
default output name equals the target one. This however isn't true for
subdir-objects mode, and it cannot be assumed to be true for compile
rules written by the user either.
Applied as below to maint, for master and branch-1.11.
Cheers,
Ralf
2009-10-06 Bruno Haible <address@hidden>
Ralf Wildenhues <address@hidden>
Fix 'compile' script to not call mv when target equals source.
* lib/compile: Don't attempt to move the generated file to its
target destination when it is already at the target destination.
Avoids an mv failure with subdir-objects.
* tests/ccnoco3.test: New test.
* tests/Makefile.am: Adjust.
diff --git a/lib/compile b/lib/compile
index ec64c62..c0096a7 100755
--- a/lib/compile
+++ b/lib/compile
@@ -1,7 +1,7 @@
#! /bin/sh
# Wrapper for compilers which do not understand `-c -o'.
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2009-10-06.20; # UTC
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software
# Foundation, Inc.
@@ -124,9 +124,9 @@ trap "rmdir '$lockdir'; exit 1" 1 2 15
ret=$?
if test -f "$cofile"; then
- mv "$cofile" "$ofile"
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
elif test -f "${cofile}bj"; then
- mv "${cofile}bj" "$ofile"
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
fi
rmdir "$lockdir"
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 62529a6..bab2ac3 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -103,6 +103,7 @@ canon5.test \
canon-name.test \
ccnoco.test \
ccnoco2.test \
+ccnoco3.test \
check.test \
check2.test \
check3.test \
diff --git a/tests/ccnoco3.test b/tests/ccnoco3.test
new file mode 100755
index 0000000..2e9cd37
--- /dev/null
+++ b/tests/ccnoco3.test
@@ -0,0 +1,81 @@
+#! /bin/sh
+# Copyright (C) 2001, 2002, 2008, 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 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/>.
+
+# Test to make sure `compile' doesn't call 'mv SRC SRC'.
+
+required=gcc
+. ./defs || Exit 1
+
+set -e
+
+cat >> configure.in << 'END'
+AC_PROG_CC
+AM_PROG_CC_C_O
+AC_OUTPUT
+END
+
+cat > Makefile.am << 'END'
+AUTOMAKE_OPTIONS = subdir-objects
+bin_PROGRAMS = wish
+wish_SOURCES = a.c
+END
+
+mkdir sub
+
+cat > a.c << 'END'
+#include <stdio.h>
+
+int main ()
+{
+ printf ("hi\n");
+}
+END
+
+cat > Mycomp << 'END'
+#!/bin/sh
+
+case " "$* in
+ *\ -c*\ -o* | *\ -o*\ -c*)
+ exit 1
+ ;;
+esac
+
+exec gcc "$@"
+END
+
+chmod +x Mycomp
+
+# Ignore user CFLAGS.
+CFLAGS=
+export CFLAGS
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE --copy --add-missing
+
+mkdir build
+cd build
+
+# Make sure the compiler doesn't understand `-c -o'
+CC=`pwd`/../Mycomp
+export CC
+
+../configure
+$MAKE 2>stderr || { cat stderr >&2; Exit 1; }
+cat stderr >&2
+grep 'mv.*the same file' stderr && Exit 1
+
+Exit 0