bug-automake
[Top][All Lists]
Advanced

[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




reply via email to

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