automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Fix makedepend depmode to cope with VPATH builds


From: Stefano Lattarini
Subject: Re: Fix makedepend depmode to cope with VPATH builds
Date: Fri, 8 Apr 2011 13:05:53 +0200
User-agent: KMail/1.13.3 (Linux/2.6.30-2-686; KDE/4.4.4; i686; ; )

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



reply via email to

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