From b2f771441af6d3fc26c4e4ab8273573f55d6723c Mon Sep 17 00:00:00 2001 From: Stefano Lattarini Date: Tue, 23 Dec 2014 12:11:58 +0100 Subject: tests: expose bug in handling of user-defined makefile fragments generation If a user defines one single Makefile fragment to be included (via Automake includes) in his main Makefile.am, and givse a rule to generate that file from other data, Automake will spuriously complain about with something like "overrides Automake target '$(srcdir)/foo.am". * t/am-include-only-one-generated-fragment.sh: Expose the bug (this test is still XFAILing). * t/list-of-tests.mk: Add the new test. Signed-off-by: Stefano Lattarini --- t/am-include-only-one-generated-fragment.sh | 48 +++++++++++++++++++++++++++++ t/list-of-tests.mk | 2 ++ 2 files changed, 50 insertions(+) create mode 100644 t/am-include-only-one-generated-fragment.sh diff --git a/t/am-include-only-one-generated-fragment.sh b/t/am-include-only-one-generated-fragment.sh new file mode 100644 index 000000000..57a8aecbf --- /dev/null +++ b/t/am-include-only-one-generated-fragment.sh @@ -0,0 +1,48 @@ +#! /bin/sh +# Copyright (C) 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 +# 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 . + +# Check that inclusion of only one '.am' that can be regenerated via +# a user-defined Makefile rule does not incur in spurious automake +# warnings about "target redefinition". + +. test-init.sh + +cat >> configure.ac <<'END' +AC_CONFIG_FILES([sub/Makefile]) +AC_OUTPUT +END + +cat > Makefile.am <<'END' +include foobar.am +$(srcdir)/foobar.am: $(srcdir)/touch.sh + $(SHELL) $(srcdir)/touch.sh $(srcdir)/foobar.am +EXTRA_DIST = touch.sh +END + +mkdir sub +cat > sub/Makefile.am <<'END' +include $(top_srcdir)/quux.am +$(top_srcdir)/quux.am: $(top_srcdir)/touch.sh + $(SHELL) $(top_srcdir)/touch.sh $@ +END + +: > foobar.am +: > quux.am + +$ACLOCAL +$AUTOMAKE + +: diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk index 462497ee3..28b512cf6 100644 --- a/t/list-of-tests.mk +++ b/t/list-of-tests.mk @@ -30,6 +30,7 @@ t/pm/Version3.pl XFAIL_TESTS = \ t/all.sh \ +t/am-include-only-one-generated-fragment.sh \ t/cond17.sh \ t/gcj6.sh \ t/override-conditional-2.sh \ @@ -142,6 +143,7 @@ t/amopts-location.sh \ t/amopts-variable-expansion.sh \ t/amsubst.sh \ t/am-default-source-ext.sh \ +t/am-include-only-one-generated-fragment.sh \ t/ansi2knr-no-more.sh \ t/ar-lib.sh \ t/ar-lib2.sh \ -- cgit v1.2.1 From 55270ac3222bb00e60505ec7c2d63f0047152bfa Mon Sep 17 00:00:00 2001 From: Stefano Lattarini Date: Tue, 23 Dec 2014 13:10:21 +0100 Subject: include: fix bug in handling of user-defined makefile fragments generation If a user defined one single Makefile fragment to be included (via Automake includes) in his main Makefile.am, and gave a rule to generate that file from other data, Automake used to spuriously complain about with something like "overrides Automake target '$(srcdir)/foo.am". This change remove that spurious error (via a simple hack rather than a systematic change, but oh well). * lib/am/configure.am (%MAKEFILE-IN-DEPS%) [?HAVE-MAKEFILE-IN-DEPS?]: Add a trailing "$(am__empty)" to the list of targets, which is enough to trick Automake into not complaining about "duplicated targets" in case the '%MAKEFILE-IN-DEPS%' list expands to a single target that is also declared in some user-defined rule. * t/list-of-tests.mk (XFAIL_TESTS): Remove now-passing test 't/am-include-only-one-generated-fragment.sh'. * NEWS: Update. Signed-off-by: Stefano Lattarini --- NEWS | 13 +++++++++++++ lib/am/configure.am | 6 +++++- t/list-of-tests.mk | 1 - 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 614eba64d..1fae7ad4c 100644 --- a/NEWS +++ b/NEWS @@ -104,6 +104,19 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +New in 1.14.2: + +* Bugs fixed: + + - In older Automake versions, if a user defined one single Makefile + fragment (say 'foo.am') to be included (via Automake includes) in + his main Makefile.am, and defined a custom make rule to generate that + file from other data, Automake used to spuriously complain about with + something like "... overrides Automake target '$(srcdir)/foo.am". + This bug is now fixed. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + New in 1.14.1: * Bugs fixed: diff --git a/lib/am/configure.am b/lib/am/configure.am index 6f39f7dbe..d159e1b55 100644 --- a/lib/am/configure.am +++ b/lib/am/configure.am @@ -83,7 +83,11 @@ endif %?TOPDIR_P% esac; ## Avoid the "deleted header file" problem for the dependencies. -?HAVE-MAKEFILE-IN-DEPS?%MAKEFILE-IN-DEPS%: +## Add the trailing "$(am__empty)" to trick Automake into not spuriously +## complaining about "duplicated targets" in case the %MAKEFILE-IN-DEPS% +## list expands to a single target that is also declared in some +## user-defined rule. +?HAVE-MAKEFILE-IN-DEPS?%MAKEFILE-IN-DEPS% $(am__empty): DIST_COMMON += %MAKEFILE-AM% diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk index 28b512cf6..c07eb72bd 100644 --- a/t/list-of-tests.mk +++ b/t/list-of-tests.mk @@ -30,7 +30,6 @@ t/pm/Version3.pl XFAIL_TESTS = \ t/all.sh \ -t/am-include-only-one-generated-fragment.sh \ t/cond17.sh \ t/gcj6.sh \ t/override-conditional-2.sh \ -- cgit v1.2.1 From 2629aa9e713c584c799677987ffb03156b8aae8e Mon Sep 17 00:00:00 2001 From: Stefano Lattarini Date: Tue, 23 Dec 2014 11:36:20 +0100 Subject: tests: expose automake bug#18286 "distcheck fails to detect missing files" * t/distcheck-pr18286.sh: New test, still XFAILing. * t/list-of-tests.mk: Add it. Signed-off-by: Stefano Lattarini --- t/distcheck-pr18286.sh | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ t/list-of-tests.mk | 2 ++ 2 files changed, 64 insertions(+) create mode 100644 t/distcheck-pr18286.sh diff --git a/t/distcheck-pr18286.sh b/t/distcheck-pr18286.sh new file mode 100644 index 000000000..b10773579 --- /dev/null +++ b/t/distcheck-pr18286.sh @@ -0,0 +1,62 @@ +#! /bin/sh +# Copyright (C) 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 +# 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 . + +# Ensure "make distcheck" detects all missing files, without getting +# confused by the fact that they exists in the "original" source tree +# from which "make distcheck" is run. See automake bug#18286. + +. test-init.sh + +echo AC_OUTPUT >> configure.ac + +cat > Makefile.am <<'END' +$(srcdir)/test_data.am: $(srcdir)/test_data.txt $(srcdir)/gen-testdata.sh + cd $(srcdir) && $(SHELL) gen-testdata.sh test_data.am + +include $(srcdir)/test_data.am + +check-local: + is $(testdata) == foo bar +END + +cat > test_data.txt <<'END' +foo +bar +END + + +cat > gen-testdata.sh <<'END' +#!/bin/sh +printf 'testdata = \\\n' +sed 's/$/ \\/' +echo '$(empty_string)' +END +chmod a+x gen-testdata.sh + +$sleep +./gen-testdata.sh test_data.am + +$ACLOCAL +$AUTOCONF +$AUTOMAKE -a + +./configure + +$MAKE check + +run_make -e FAIL -M distcheck + +: diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk index c07eb72bd..ad96326f3 100644 --- a/t/list-of-tests.mk +++ b/t/list-of-tests.mk @@ -31,6 +31,7 @@ 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 \ @@ -427,6 +428,7 @@ t/distcheck-no-prefix-or-srcdir-override.sh \ t/distcheck-override-infodir.sh \ t/distcheck-pr9579.sh \ t/distcheck-pr10470.sh \ +t/distcheck-pr18286.sh \ t/dmalloc.sh \ t/doc-parsing-buglets-colneq-subst.sh \ t/doc-parsing-buglets-tabs.sh \ -- cgit v1.2.1 From 01a7a4a7bea81b4e2d03d08b45d605b98501e024 Mon Sep 17 00:00:00 2001 From: Stefano Lattarini Date: Tue, 23 Dec 2014 18:39:32 +0100 Subject: dist: fix bug#18286 "distcheck fails to detect missing files" 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 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 Helped-by: Peter Johansson Signed-off-by: Stefano Lattarini --- 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 1fae7ad4c..8f2d2a77f 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 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 6be803e16..62f22f8fb 100644 --- a/THANKS +++ b/THANKS @@ -281,6 +281,7 @@ Nathanael Nerode neroden@twcny.rr.com Nelson H. F. Beebe beebe@math.utah.edu Nicholas Wourms nwourms@netscape.net Nick Bowler nbowler@elliptictech.com +Nicola Fontana ntd@entidi.it Nicolas Joly njoly@pasteur.fr Nicolas Thiery nthiery@Icare.mines.edu NightStrike nightstrike@gmail.com diff --git a/lib/am/distdir.am b/lib/am/distdir.am index a8ad63cef..6d9d42f28 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 6168421ce..34e67101e 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 b10773579..fe8961287 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 ad96326f3..f97f2f6b4 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 d3f50bc92..b3ede8cee 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 8a36bc36d..69345d1a3 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 42d4112d7..50e34172f 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 -- cgit v1.2.1