Subject: bug#18286: [PATCH 2/2] dist: fix bug#18286 "distcheck fails to detect missing files"

From: Stefano Lattarini <[email-masked]>
Date: Tue, 23 Dec 2014 20:23:58 +0100

BTW, this issue had been already reported in the past:
http://lists.gnu.org/archive/html/automake/2006-09/msg00008.html
http://lists.gnu.org/archive/html/automake/2013-01/msg00049.html

"make distcheck" could sometimes fail to detect missing files in the
distribution tarball, especially in those cases where both the generated
files and their dependencies are explicitly in $(srcdir).  An important
example of this are *generated* makefile fragments included at Automake
time in Makefile.am.  A basic example:

    # -*- Makefile.am -*-

    $(srcdir)/fragment.am: $(srcdir)/data.txt $(srcdir)/preproc.sh
        cd $(srcdir) && $(SHELL) preproc.sh <data.txt >fragment.am

    include $(srcdir)/fragment.am

    ...

If the use forgot to add data.txt and/or preproc.sh in the distribution
tarball, "make distcheck" would have erroneously succeeded!

The reason is that, while $(srcdir)/data.txt does not exist, make also
looks in $(srcdir)/$(srcdir)/data.txt, and in the distcheck-issued
VPATH build where $(srcdir) is '..', that file exists, as it is
part of the original development directory.

* t/distdir.am (distcheck): Adjust to have the build directory be
'$(distdir)/_build/sub' rather than just '$(distdir)/_build'.  Thanks
Nicola Fontana for the suggestion.
* t/distcheck-pr18286.sh: Enhance and tighten a little.
* t/list-of-tests.mk (XFAIL_TESTS): Remove 't/distcheck-pr18286.sh',
as it's now passing.
* t/subdir-am-cond.sh: Adjust to avoid a fully spurious failure due
to the new distcheck semantics.
* t/subdir-ac-subst.sh: Likewise.
* t/dejagnu-relative-srcdir.sh: Likewise.
* t/txinfo-builddir.sh: Likewise.
* NEWS: Update.

Helped-by: Nicola Fontana <[email-masked]>
Helped-by: Peter Johansson <[email-masked]>
Signed-off-by: Stefano Lattarini <[email-masked]>
---
 NEWS                         | 16 ++++++++++++++++
 THANKS                       |  1 +
 lib/am/distdir.am            | 14 +++++++++-----
 t/dejagnu-relative-srcdir.sh |  8 ++++----
 t/distcheck-pr18286.sh       |  8 ++++++++
 t/list-of-tests.mk           |  1 -
 t/subdir-ac-subst.sh         | 16 +++++++++-------
 t/subdir-am-cond.sh          | 16 +++++++++-------
 t/txinfo-builddir.sh         |  4 ++--
 9 files changed, 58 insertions(+), 26 deletions(-)

diff --git a/NEWS b/NEWS
index 1fae7ad..8f2d2a7 100644
--- a/NEWS
+++ b/NEWS
@@ -115,6 +115,22 @@ New in 1.14.2:
     something like "... overrides Automake target '$(srcdir)/foo.am".
     This bug is now fixed.
 
+  - Automake bug#18286: "make distcheck" could sometimes fail to detect
+    missing files in the distribution tarball, especially in those cases
+    where both the generated files and their dependencies are explicitly
+    in $(srcdir).  An important example of this are *generated* makefile
+    fragments included at Automake time in Makefile.am; e.g.:
+
+        ...
+        $(srcdir)/fragment.am: $(srcdir)/data.txt $(srcdir)/preproc.sh
+            cd $(srcdir) && $(SHELL) preproc.sh <data.txt >fragment.am
+        include $(srcdir)/fragment.am
+        ...
+
+    If the use forgot to add data.txt and/or preproc.sh in the distribution
+    tarball, "make distcheck" would have erroneously succeeded!  This issue
+    is now fixed.
+
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 New in 1.14.1:
diff --git a/THANKS b/THANKS
index 6be803e..62f22f8 100644
--- a/THANKS
+++ b/THANKS
@@ -281,6 +281,7 @@ Nathanael Nerode                [email-masked]
 Nelson H. F. Beebe              [email-masked]
 Nicholas Wourms                 [email-masked]
 Nick Bowler                     [email-masked]
+Nicola Fontana                  [email-masked]
 Nicolas Joly                    [email-masked]
 Nicolas Thiery                  [email-masked]
 NightStrike                     [email-masked]
diff --git a/lib/am/distdir.am b/lib/am/distdir.am
index a8ad63c..6d9d42f 100644
--- a/lib/am/distdir.am
+++ b/lib/am/distdir.am
@@ -1,5 +1,5 @@
 ## automake - create Makefile.in from Makefile.am
-## Copyright (C) 2001-2013 Free Software Foundation, Inc.
+## Copyright (C) 2001-2014 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
@@ -430,7 +430,7 @@ distcheck: dist
 ## can make our new subdirs.
 	chmod -R a-w $(distdir)
 	chmod u+w $(distdir)
-	mkdir $(distdir)/_build $(distdir)/_inst
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
 ## Undo the write access.
 	chmod a-w $(distdir)
 ## With GNU make, the following command will be executed even with "make -n",
@@ -451,8 +451,12 @@ distcheck: dist
 ## Parallel BSD make may not start a new shell for each command in a recipe,
 ## so be sure to 'cd' back to the original directory after this.
 	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure \
+## If we merely used '$(distdir)/_build' here, "make distcheck" could
+## sometimes fail to detect missing files in the distribution tarball,
+## especially in those cases where both the generated files and their
+## dependencies are explicitly in $(srcdir).  See automake bug#18286.
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
 ?GETTEXT?	    --with-included-gettext \
 ## Additional flags for configure.
 	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
@@ -461,7 +465,7 @@ distcheck: dist
 ## and --prefix values, so don't allow them to be overridden by the user or
 ## the developer.  That used to be allowed, and caused issues in practice
 ## (in corner-case usages); see automake bug#14991.
-	    --srcdir=.. --prefix="$$dc_install_base" \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
 	  && $(MAKE) $(AM_MAKEFLAGS) \
 	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
 	  && $(MAKE) $(AM_MAKEFLAGS) check \
diff --git a/t/dejagnu-relative-srcdir.sh b/t/dejagnu-relative-srcdir.sh
index 6168421..34e6710 100644
--- a/t/dejagnu-relative-srcdir.sh
+++ b/t/dejagnu-relative-srcdir.sh
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+# Copyright (C) 2011-2014 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
@@ -43,7 +43,7 @@ END
 cat > env.test/env.exp << 'END'
 set env_srcdir $env(srcdir)
 send_user "env_srcdir: $env_srcdir\n"
-if { [ regexp "^\.\.?$" $env_srcdir ] } {
+if { [ regexp "^\.(\./\.\.)?$" $env_srcdir ] } {
     pass "test_env_src"
 } else {
     fail "test_env_src"
@@ -52,13 +52,13 @@ END
 
 cat > tcl.test/tcl.exp << 'END'
 send_user "tcl_srcdir: $srcdir\n"
-if { [ regexp "^\.\.?$" $srcdir ] } {
+if { [ regexp "^\.(\./\.\.)?$" $srcdir ] } {
     pass "test_tcl_src"
 } else {
     fail "test_tcl_src"
 }
 send_user "tcl_orig_srcdir: $orig_srcdir\n"
-if { [ regexp "^\.\.?$" $orig_srcdir ] } {
+if { [ regexp "^\.(\./\.\.)?$" $orig_srcdir ] } {
     pass "test_tcl_orig_src"
 } else {
     fail "test_tcl_orig_src"
diff --git a/t/distcheck-pr18286.sh b/t/distcheck-pr18286.sh
index b107735..fe89612 100644
--- a/t/distcheck-pr18286.sh
+++ b/t/distcheck-pr18286.sh
@@ -57,6 +57,14 @@ $AUTOMAKE -a
 
 $MAKE check
 
+# Oops, we failed to distribute some required files!
 run_make -e FAIL -M distcheck
+$FGREP '../../test_data.txt' output
+
+# But if we distribute them, everything will be OK.
+echo 'EXTRA_DIST = test_data.txt gen-testdata.sh' >> Makefile.am
+
+using_gmake || $MAKE Makefile
+$MAKE distcheck
 
 :
diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk
index ad96326..f97f2f6 100644
--- a/t/list-of-tests.mk
+++ b/t/list-of-tests.mk
@@ -31,7 +31,6 @@ t/pm/Version3.pl
 XFAIL_TESTS = \
 t/all.sh \
 t/cond17.sh \
-t/distcheck-pr18286.sh \
 t/gcj6.sh \
 t/override-conditional-2.sh \
 t/override-conditional-pr13940.sh \
diff --git a/t/subdir-ac-subst.sh b/t/subdir-ac-subst.sh
index d3f50bc..b3ede8c 100644
--- a/t/subdir-ac-subst.sh
+++ b/t/subdir-ac-subst.sh
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2002-2013 Free Software Foundation, Inc.
+# Copyright (C) 2002-2014 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
@@ -20,7 +20,7 @@
 
 . test-init.sh
 
-cat >>configure.ac <<'END'
+cat >> configure.ac <<'END'
 if test "$want_opt" = yes; then
   MAYBE_OPT=opt
 else
@@ -31,7 +31,7 @@ AC_CONFIG_FILES([src/Makefile opt/Makefile])
 AC_OUTPUT
 END
 
-cat >Makefile.am << 'END'
+cat > Makefile.am <<'END'
 SUBDIRS = src $(MAYBE_OPT)
 DIST_SUBDIRS = src opt
 
@@ -45,14 +45,16 @@ DIST_SUBDIRS = src opt
 # We rely on 'distcheck' to run 'check-local' and use
 # 'sanity1' and 'sanity2' as evidences that test-build was run.
 
+test_rootdir = $(top_builddir)/../../..
+
 test-build: all
 	test -f src/result
 	if test -n "$(MAYBE_OPT)"; then \
 	   test -f opt/result || exit 1; \
-	   : > $(top_builddir)/../../sanity2 || exit 1; \
+	   : > $(test_rootdir)/sanity2 || exit 1; \
 	else \
 	   test ! -f opt/result || exit 1; \
-	   : > $(top_builddir)/../../sanity1 || exit 1; \
+	   : > $(test_rootdir)/sanity1 || exit 1; \
 	fi
 
 test-dist: distdir
@@ -66,7 +68,7 @@ mkdir src opt
 : > src/source
 : > opt/source
 
-cat >src/Makefile.am << 'END'
+cat > src/Makefile.am <<'END'
 EXTRA_DIST = source
 all-local: result
 CLEANFILES = result
@@ -76,7 +78,7 @@ result: source
 END
 
 # We want in opt/ the same Makefile as in src/.  Let's exercise 'include'.
-cat >opt/Makefile.am << 'END'
+cat > opt/Makefile.am <<'END'
 include ../src/Makefile.am
 END
 
diff --git a/t/subdir-am-cond.sh b/t/subdir-am-cond.sh
index 8a36bc3..69345d1 100644
--- a/t/subdir-am-cond.sh
+++ b/t/subdir-am-cond.sh
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2002-2013 Free Software Foundation, Inc.
+# Copyright (C) 2002-2014 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
@@ -20,13 +20,13 @@
 
 . test-init.sh
 
-cat >>configure.ac <<'END'
+cat >> configure.ac <<'END'
 AM_CONDITIONAL([COND_OPT], [test "$want_opt" = yes])
 AC_CONFIG_FILES([src/Makefile opt/Makefile])
 AC_OUTPUT
 END
 
-cat >Makefile.am << 'END'
+cat > Makefile.am <<'END'
 if COND_OPT
   MAYBE_OPT = opt
 endif
@@ -42,16 +42,18 @@ SUBDIRS = src $(MAYBE_OPT)
 # We rely on 'distcheck' to run 'check-local' and use
 # 'sanity1' and 'sanity2' as evidences that test-build was run.
 
+test_rootdir = $(top_builddir)/../../..
+
 if COND_OPT
 test-build: all
 	test -f src/result
 	test -f opt/result
-	: > $(top_builddir)/../../sanity2
+	: > $(test_rootdir)/sanity2
 else
 test-build: all
 	test -f src/result
 	test ! -f opt/result
-	: > $(top_builddir)/../../sanity1
+	: > $(test_rootdir)/sanity1
 endif
 
 test-dist: distdir
@@ -65,7 +67,7 @@ mkdir src opt
 : > src/source
 : > opt/source
 
-cat >src/Makefile.am << 'END'
+cat > src/Makefile.am <<'END'
 EXTRA_DIST = source
 all-local: result
 CLEANFILES = result
@@ -75,7 +77,7 @@ result: source
 END
 
 # We want in opt/ the same Makefile as in src/.  Let's exercise 'include'.
-cat >opt/Makefile.am << 'END'
+cat > opt/Makefile.am <<'END'
 include ../src/Makefile.am
 END
 
diff --git a/t/txinfo-builddir.sh b/t/txinfo-builddir.sh
index 42d4112..50e3417 100644
--- a/t/txinfo-builddir.sh
+++ b/t/txinfo-builddir.sh
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2012-2013 Free Software Foundation, Inc.
+# Copyright (C) 2012-2014 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
@@ -43,7 +43,7 @@ CLEANFILES = mu.info
 # to think 'version.texi' has been created...
 check-local:
 	test ! -e mu.info
-	test -f ../mu.info
+	test -f $(srcdir)/mu.info
 END
 
 mkdir subdir
-- 
2.1.3