Subject: Re: bug#8473: depcomp bug with HP-UX cc and VPATH build
From: Ralf Wildenhues <[email-masked]>
To: Bruno Haible <[email-masked]>, [email-masked]
Cc: [email-masked]
Date: Mon, 11 Apr 2011 07:13:00 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Hi Bruno,

* Bruno Haible wrote on Mon, Apr 11, 2011 at 02:44:48AM CEST:
> The dependencies mechanism of Automake leads to a compilation failure when
> used in a VPATH build (with GNU make, of course)

Actually, in this case you could have avoided this particular bug by
using HP make.  :-p

Automake still strives to be portable to non-GNU make, even if you have
decided to (understandably) not worry about the numerous and hideous
VPATH issues.

>   source='../../gllib/nonblocking.c' object='../../gllib/nonblocking.o' libtool=no \
>   DEPDIR=.deps depmode=hp /bin/sh ../../build-aux/depcomp \
>   cc -Ae -O -DHAVE_CONFIG_H -I. -I../../gllib -I..  -DGNULIB_STRICT_CHECKING=1   -g -c ../../gllib/nonblocking.c
>   cpp: "", line 0: error 4066: Cannot create "../../gllib/.deps/nonblocking.TPo" file for "-M../../gllib/.deps/nonblocking.TPo" option. (No such file or directory[errno=2])
>   gmake[4]: *** [../../gllib/nonblocking.o] Error 1

How nice, I just fixed a similar bug in makedepend mode last week.

I'm pushing this to maint (and merging to branch-1.11 and master) to fix
the above.

Thanks for the report,
Ralf

    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' \
+      | 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])
+
+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
+$MAKE clean
+
+$MAKE >out 2>&1 || { cat out; Exit 1; }
+cat out
+grep 'src/[._]deps' out && Exit 1
+
+: