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 <br...@clisp.org> Ralf Wildenhues <ralf.wildenh...@gmx.de> 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