Subject: bug#13928: VPATH issues with subdir-objects

From: Stefano Lattarini <[email-masked]>
Date: Sat, 08 Jun 2013 23:08:14 +0200

[+cc automake-patches]

Reference: <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=13928>

Hello everybody, sorry for the delay.

On 11/03/2013 01:05 PM, Bert Wesarg wrote (more or less):
>
> But when I prefix a source file with '$(src)/' and use
> subdir-objects then I get something like this in the Makefile.in
>
>   $(src)/test-test.o: $(src)/test.c
>
> And after a configure I get in my build dir a directory named
> literally "$(src)".
>
> Why would I want a directory named "$(src)" in my build
> directory? If anything than the $(src) make variable should
> be resolved. Anyway, when running make I get:
>
>   Makefile:299: .deps/test-test.Po: No such file or directory
>   make: *** No rule to make target `.deps/test-test.Po'.  Stop.
>

On 12/03/2013 03:39 PM, Bert Wesarg wrote:
>
> Regarding the actual bug: without knowing much (yet!) about the relevant
> Automake internals, I'm a bit surprised that
>
>   src = src
>   foo_SOURCES = $(src)/foo.c
>
> fails with subdir-objects, but on the other hand
>
>   src = src/foo.c
>   foo_SOURCES = $(src)
>
> seems to work just fine...
> 

Still not sure when I'll manage to look into these issues properly.
But in the meantime, I've at least added a couple of test cases to
expose them.  See the patch below.  Will soon push it to 'micro'.

Regards,
  Stefano

---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ----

>From 004eba9b3c19747652fa9feab9846d646c83f5d8 Mon Sep 17 00:00:00 2001
Message-Id: <004eba9b3[email-masked]>
From: Stefano Lattarini <[email-masked]>
Date: Sat, 8 Jun 2013 22:00:32 +0200
Subject: [PATCH] tests: expose automake bug#13928

* t/subobj-indir-pr13928.sh: New test, still xfailing.
* t/subobj-vpath-pr13928.sh: Likewise.
* t/list-of-tests.mk (XFAIL_TESTS, handwritten_TESTS): Update.

Signed-off-by: Stefano Lattarini <[email-masked]>
---
 t/list-of-tests.mk        |  4 ++++
 t/subobj-indir-pr13928.sh | 49 ++++++++++++++++++++++++++++++++++++++
 t/subobj-vpath-pr13928.sh | 60 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 113 insertions(+)
 create mode 100644 t/subobj-indir-pr13928.sh
 create mode 100644 t/subobj-vpath-pr13928.sh

diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk
index 68ca58c..1d7cf87 100644
--- a/t/list-of-tests.mk
+++ b/t/list-of-tests.mk
@@ -40,6 +40,8 @@ t/java-nobase.sh \
 t/objext-pr10128.sh \
 t/remake-timing-bug-pr8365.sh \
 t/lex-subobj-nodep.sh \
+t/subobj-indir-pr13928.sh \
+t/subobj-vpath-pr13928.sh \
 t/remake-am-pr10111.sh \
 t/remake-m4-pr10111.sh \
 $(perl_fake_XFAIL_TESTS)
@@ -1034,6 +1036,8 @@ t/subobj11c.sh \
 t/subobjname.sh \
 t/subobj-clean-pr10697.sh \
 t/subobj-clean-lt-pr10697.sh \
+t/subobj-indir-pr13928.sh \
+t/subobj-vpath-pr13928.sh \
 t/subpkg.sh \
 t/subpkg2.sh \
 t/subpkg3.sh \
diff --git a/t/subobj-indir-pr13928.sh b/t/subobj-indir-pr13928.sh
new file mode 100644
index 0000000..11b865c
--- /dev/null
+++ b/t/subobj-indir-pr13928.sh
@@ -0,0 +1,49 @@
+#! /bin/sh
+# Copyright (C) 2013 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/>.
+
+# Expose part of Automake bug#13928: config.status generates broken
+# makefiles if the subdir-objects option is used and a _SOURCES
+# variable lists sources whose directory part is specified as a
+# make variable ("foo_SOURCES = $(src)/foo.c").
+
+required=cc
+. test-init.sh
+
+cat >> configure.ac << 'END'
+AC_PROG_CC
+AM_PROG_CC_C_O
+AC_OUTPUT
+END
+
+cat > Makefile.am <<'END'
+AUTOMAKE_OPTIONS = subdir-objects
+src = s
+bin_PROGRAMS = foo
+foo_SOURCES = $(src)/foo.c
+END
+
+mkdir s
+echo 'int main(void) { return 0; }' > s/foo.c
+
+$ACLOCAL && $AUTOCONF && $AUTOMAKE -a || fatal_ "autotools failed"
+
+./configure
+$MAKE
+test -f s/.deps/foo.Po
+find . | $FGREP '$(src)' && exit 1
+$MAKE distcheck
+
+:
diff --git a/t/subobj-vpath-pr13928.sh b/t/subobj-vpath-pr13928.sh
new file mode 100644
index 0000000..96cb219
--- /dev/null
+++ b/t/subobj-vpath-pr13928.sh
@@ -0,0 +1,60 @@
+#! /bin/sh
+# Copyright (C) 2013 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/>.
+
+# Expose part of automake bug#13928: if the subdir-objects option is
+# in use and a source file is listed in a _SOURCES variable with a
+# leading $(srcdir) component, Automake will generate a Makefile that
+# tries to create the corresponding object file in $(srcdir) as well.
+
+required=cc
+. test-init.sh
+
+cat >> configure.ac << 'END'
+AC_PROG_CC
+AM_PROG_CC_C_O
+AC_OUTPUT
+END
+
+cat > Makefile.am <<'END'
+AUTOMAKE_OPTIONS = subdir-objects
+noinst_PROGRAMS = test
+test_SOURCES = $(srcdir)/test.c
+test-objs:
+	test ! -f $(srcdir)/test.$(OBJEXT)
+	test -f test.$(OBJEXT)
+END
+
+$ACLOCAL && $AUTOCONF && $AUTOMAKE -a || fatal_ "autotools failed"
+
+$EGREP 'test\.|DEPDIR|dirstamp|srcdir' Makefile.in || : # For debugging.
+$EGREP '\$.srcdir./test\.[o$]' Makefile.in && exit 1
+$FGREP '$(srcdir)/$(am__dirstamp)' Makefile.in && exit 1
+$FGREP '$(srcdir)/$(DEPDIR)' && exit 1
+
+cat > test.c << 'END'
+int main (void)
+{
+  return 0;
+}
+END
+
+mkdir build && cd build || fatal "preparation of build directory failed"
+../configure || fatal_ "./configure failed"
+
+$MAKE
+$MAKE test-objs
+
+:
-- 
1.8.3.rc3.8.g5e49f30