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

Stefano Lattarini <[email protected]>
Newsgroups gmane.comp.sysutils.automake.patches
Message-ID <01a7a4a7bea81b4e2d03d08b45d605b98501e024.1419362614.git.stefano.lattarini@gmail.com>
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 protected]>
Helped-by: Peter Johansson <[email protected]>
Signed-off-by: Stefano Lattarini <[email protected]>
---
 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 protected]
 Nelson H. F. Beebe              [email protected]
 Nicholas Wourms                 [email protected]
 Nick Bowler                     [email protected]
+Nicola Fontana                  [email protected]
 Nicolas Joly                    [email protected]
 Nicolas Thiery                  [email protected]
 NightStrike                     [email protected]
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.