Hello Ralf, sorry for the delay. On Wednesday 06 April 2011, Ralf Wildenhues wrote: > Ugh, a looong-standing depmode=makedepend bug that silently breaks > rebuilds in VPATH trees. It has now hit me in the wild. :-( > Just out of curiosity: with which compiler?
> Anyway, this is for maint, and I'd appreciate review, but will > otherwise push soonish. > > (I'll probably have to defer any reviewing until the weekend ...) > > Thanks, > Ralf > > Fix makedepend depmode for VPATH builds. > > * lib/depcomp [makedepend]: Remove any VPATH prefix from the > object file name, so a rebuild doesn't attempt to update the > .Po files in the source tree. > * tests/depcomp9.test: New test. > * tests/Makefile.am (TESTS): Update. > * NEWS: Update. > > diff --git a/NEWS b/NEWS > index d368eec..1fc539d 100644 > --- a/NEWS > +++ b/NEWS > @@ -120,6 +120,8 @@ Bugs fixed in 1.11a: > > - The parallel-tests driver now does not produce erroneous results > with Tru64/OSF 5.1 sh upon unreadable log files any more. > + > + - The makedepend depmode now works better with VPATH builds. > > New in 1.11: > > diff --git a/lib/depcomp b/lib/depcomp > index c3163be..3740d29 100755 > --- a/lib/depcomp > +++ b/lib/depcomp > @@ -1,10 +1,10 @@ > #! /bin/sh > # depcomp - compile a program generating dependencies as side-effects > > -scriptversion=2010-10-07.20; # UTC > +scriptversion=2011-04-06.20; # UTC > > -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010 > -# Free Software Foundation, Inc. > +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, > +# 2011 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 > @@ -557,7 +557,9 @@ makedepend) > touch "$tmpdepfile" > ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" > rm -f "$depfile" > - cat < "$tmpdepfile" > "$depfile" > + # makedepend may prepend the VPATH from the source file name to the object. > + sed_object_re=`echo $object | sed 's/[].[^$\\*|]/\\\\&/g'` > A couple of questions/observations about the sed command: 1. I wasn't sure whether `.', `$', `^' and `*' are to be escaped when used in a bracket expression; however, the POSIX standard at: <http://pubs.opengroup.org/onlinepubs/007908799/xbd/re.html> says they shouldn't be. Also, I couldn't find any reference in the Autoconf manual pointing to a sed implementation that doesn't respect this part of the standard. 2. I guess the doubled `\\' in the sed command is there to account for the extra stripping performed by the backtick `` command substitution, right? But is that truly portable, considering that the doubled `\\' is also into a single-quotes string? Or would it be better to play safe and use an indirection like: sed_quoting_cmd='s/[].[^$\\*|]/\\&/g' sed_object_re=`echo $object | sed -e "$sed_quoting_cmd"` WDYT? > + sed "s|^.*\($sed_object_re *:\)|\1|" "$tmpdepfile" > "$depfile" > sed '1,2d' "$tmpdepfile" | tr ' ' ' > ' | \ > ## Some versions of the HPUX 10.20 sed can't process this invocation > diff --git a/tests/depcomp9.test b/tests/depcomp9.test > new file mode 100755 > index 0000000..c4dd2ed > --- /dev/null > +++ b/tests/depcomp9.test > @@ -0,0 +1,84 @@ > +#! /bin/sh > +# Copyright (C) 2011 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/>. > + > +# makedepend should work in VPATH mode. > + > +# Here's the bug: makedepend will prefix VPATH to the object file name, > +# thus the second make will invoke depcomp with object='../../src/foo.o', > +# causing errors such as: > +# touch: cannot touch `../../src/.deps/foo.TPo': No such file or directory > +# makedepend: error: cannot open "../../src/.deps/foo.TPo" > +# ../../depcomp: line 560: ../../src/.deps/foo.TPo: No such file or directory > + > +# We include subfoo only to be sure that we don't remove too much > +# from the object file name. > + > +required='makedepend' > +. ./defs || Exit 1 > + > +mkdir src src/sub build > + > +cat >> configure.in << 'END' > +AC_PROG_CC > +AM_PROG_CC_C_O > +AC_CONFIG_FILES([src/Makefile]) > +AC_OUTPUT > +END > + > +cat > Makefile.am << 'END' > +SUBDIRS = src > +END > + > +cat > src/Makefile.am << 'END' > +AUTOMAKE_OPTIONS = subdir-objects > +bin_PROGRAMS = foo > +foo_SOURCES = foo.c foo.h sub/subfoo.c > +END > + > +cat > src/foo.h <<EOF > +extern int subfoo (void); > +EOF > + > +cat >src/foo.c <<EOF > +#include "foo.h" > +int main (void) > +{ > + return subfoo (); > +} > +EOF > + > +cat >src/sub/subfoo.c <<EOF > +#include "foo.h" > +int subfoo (void) > +{ > + return 0; > +} > +EOF > + > +$ACLOCAL > +$AUTOCONF > +$AUTOMAKE -a > + > +cd build > +../configure am_cv_CC_dependencies_compiler_type=makedepend > +$MAKE || Exit 77 > Why skip the test here? Wouldn't be better to just let the test fail if $MAKE fails the first time? (Which means the first $MAKE call and the subsequent "$MAKE clean" are just to be removed as redundant). > +$MAKE clean > + > +$MAKE >out 2>&1 || { cat out; Exit 1; } > +cat out > +$FGREP 'src/.deps' out && Exit 1 > + This is probably paranoid but ... what if $(DEPDIR) is != `.deps'? (e.g., it is `_deps'). Thanks, Stefano