Subject: Re: bug#8473: depcomp bug with HP-UX cc and VPATH build

From: Stefano Lattarini <[email-masked]>
Date: Mon, 11 Apr 2011 09:51:40 +0200

Hello Ralf and Bruno.

I've spotted a couple of harmful typos in the patch, and I also
have a very minor nit.

On Monday 11 April 2011, Ralf Wildenhues wrote:
>     Fix hp depmode for VPATH builds with GNU make.
>     
>     * lib/depcomp: Be sure to remove VPATH-prefixed object from
>     dependency output when creating stub rule.
>     * tests/depcomp10.test: New test.
>     * tests/Makefile.am (TESTS): Update.
>     * NEWS: Update.
>     Report by Bruno Haible.
> 
> diff --git a/NEWS b/NEWS
> index 3cd5ab0..c8219bd 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -57,7 +57,7 @@ Bugs fixed in 1.11.0a:
>    - 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.
> +  - The makedepend and hp depmodes now works better with VPATH builds.
>  
>    - Java sources specified with check_JAVA are not compiled anymore upon
>      "make all", but only upon "make check".
> diff --git a/lib/depcomp b/lib/depcomp
> index 8097c19..e996e5d 100755
> --- a/lib/depcomp
> +++ b/lib/depcomp
> @@ -1,7 +1,7 @@
>  #! /bin/sh
>  # depcomp - compile a program generating dependencies as side-effects
>  
> -scriptversion=2011-04-09-11; # UTC
> +scriptversion=2011-04-11-05; # UTC
>  
>  # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2011,
>  # Free Software Foundation, Inc.
> @@ -158,10 +158,12 @@ gcc)
>  ' < "$tmpdepfile" |
>  ## Some versions of gcc put a space before the `:'.  On the theory
>  ## that the space means something, we add a space to the output as
> -## well.
> +## well.  hp depmode also adds that space, but also prefixes the VPATH
> +## to the object.  Take care to not repeat it in the output.
>  ## Some versions of the HPUX 10.20 sed can't process this invocation
>  ## correctly.  Breaking it into two sed invocations is a workaround.
> -    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
> +    sed -e 's/^\\$//' -e '/^$/d' -e -e "s|.*$object$||" '/:$/d' \
>
Is the doubled "-e -e" above intended, or (as I'd guess) a typo?

> +      | sed -e 's/$/ :/' >> "$depfile"
>    rm -f "$tmpdepfile"
>    ;;
>  
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index bf07f2b..4e87805 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -278,6 +278,7 @@ depcomp7.test \
>  depcomp8a.test \
>  depcomp8b.test \
>  depcomp9.test \
> +depcomp10.test \
>  depdist.test \
>  depend.test \
>  depend2.test \
> diff --git a/tests/depcomp10.test b/tests/depcomp10.test
> new file mode 100644
> index 0000000..4fdee40
> --- /dev/null
> +++ b/tests/depcomp10.test
> @@ -0,0 +1,81 @@
> +#! /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/>.
> +
> +# hp depmode should work with GNU make in VPATH mode (bug similar to
> +# depcomp9.test).
> +
> +# Here's the bug: hp depmode will prefix VPATH to the object file name,
> +# thus the second gmake will invoke depcomp with object='../../src/foo.o',
> +# causing errors such as:
> +#   cpp: "", line 0: error 4066: Cannot create "../../gllib/.deps/nonblocking.TPo" file for "-M../../gllib/.deps/nonblocking.TPo" option. (No such file or dir
> ++ectory[errno=2])
>
This stray "+ectory[errno=2])" string here (copy & paste blunder?) causes
the script to abort unconditionally:

  $ sh depcomp10.test
  depcomp10.test: line 24: syntax error near unexpected token `)'
  depcomp10.test: line 24: `+ectory[errno=2])'

> +
> +required=GNUmake
> +. ./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=hp
> +$MAKE || Exit 77
>
Here I'd put the same comment that is in depcomp9.test:

 # Do not error out with the first make, as the forced 'hp' depmode
 # might not actually work, but we have overridden the _AM_DEPENDENCIES
 # tests.  The actual error only happens the second time the objects
 # are built, because 'hp' has silently messed up the .Po files the
 # first time.

> +$MAKE clean
> +
> +$MAKE >out 2>&1 || { cat out; Exit 1; }
> +cat out
> +grep 'src/[._]deps' out && Exit 1
> +
> +:
> 
> 

Regards,
  Stefano