From: Ralf Wildenhues Date: Sat, 7 Mar 2009 08:00:19 +0000 (+0100) Subject: Improve `make -n dist' and `make -n distcheck' for GNU make. X-Git-Tag: v1.10b~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=31a0b6b54782f24dd7ed84d257095078c1d6e937;p=thirdparty%2Fautomake.git Improve `make -n dist' and `make -n distcheck' for GNU make. Ensure that `make -n dist' and `make -n distcheck' do not change files, due to GNU make executing rules containing `$(MAKE)'. * lib/am/distdir.am (distdir): Separate the creation of `$(distdir)/$$subdir' for `$(DIST_SUBDIRS)' and the recursion into the `$(DIST_SUBDIRS)' in two separate rule commands. (distcheck): Exit recursive rule early when run with `make -n', as detected by a witness file. * tests/maken.test, tests/maken2.test: New tests. * tests/Makefile.am: Update. * NEWS: Update. Signed-off-by: Ralf Wildenhues --- diff --git a/ChangeLog b/ChangeLog index 36250205e..c37f9e910 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2009-03-07 Ralf Wildenhues + + Improve `make -n dist' and `make -n distcheck' for GNU make. + Ensure that `make -n dist' and `make -n distcheck' do not change + files, due to GNU make executing rules containing `$(MAKE)'. + * lib/am/distdir.am (distdir): Separate the creation of + `$(distdir)/$$subdir' for `$(DIST_SUBDIRS)' and the recursion + into the `$(DIST_SUBDIRS)' in two separate rule commands. + (distcheck): Exit recursive rule early when run with `make -n', + as detected by a witness file. + * tests/maken.test, tests/maken2.test: New tests. + * tests/Makefile.am: Update. + * NEWS: Update. + 2009-03-07 Ralf Wildenhues Solaris make testsuite fixes. diff --git a/Makefile.in b/Makefile.in index 6dde4e5df..d1c461554 100644 --- a/Makefile.in +++ b/Makefile.in @@ -494,6 +494,10 @@ distdir: $(DISTFILES) test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -582,6 +586,7 @@ distcheck: dist mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && $(am__cd) $(distdir)/_build \ diff --git a/NEWS b/NEWS index 6fcc1a535..d4b59e950 100644 --- a/NEWS +++ b/NEWS @@ -170,6 +170,9 @@ Bugs fixed in 1.10a: containing the error message, but exit successfully. However, `make dist' will ensure that no such bogus man pages are packaged into a tarball. + - Targets provided by automake behave better with `make -n', in that they + take care not to create files. + * Bugs introduced by 1.10: - Fix output of dummy dependency files in presence of post-processed diff --git a/lib/Automake/Makefile.in b/lib/Automake/Makefile.in index 3217731fd..d5cb88889 100644 --- a/lib/Automake/Makefile.in +++ b/lib/Automake/Makefile.in @@ -477,6 +477,10 @@ distdir: $(DISTFILES) test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ diff --git a/lib/Makefile.in b/lib/Makefile.in index f45ea0b69..8a7489667 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -452,6 +452,10 @@ distdir: $(DISTFILES) test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ diff --git a/lib/am/distdir.am b/lib/am/distdir.am index 5acfa493f..ad5e7713c 100644 --- a/lib/am/distdir.am +++ b/lib/am/distdir.am @@ -220,12 +220,18 @@ endif %?TOPDIR_P% ## directory, then we use `distdir' instead of `top_distdir'; this lets ## us work correctly with an enclosing package. ## +## Split the loop for the directory creation and the one for recursion, +## so that with GNU make -n, only the latter is executed. if %?SUBDIRS% @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -418,6 +424,12 @@ distcheck: dist mkdir $(distdir)/_inst ## Undo the write access. chmod a-w $(distdir) +## With GNU make, the following command will be executed even with `make -n', +## due to the presence of `$(MAKE)'. That is normally all well (and `$(MAKE)' +## is necessary for things like parallel distcheck), but here we don't want +## execution. To avoid MAKEFLAGS parsing hassles, use a witness file that a +## non-`-n' run would have just created. + test -d $(distdir)/_build || exit 0; \ ## Compute the absolute path of `_inst'. Strip any leading DOS drive ## to allow DESTDIR installations. Otherwise "$(DESTDIR)$(prefix)" would ## expand to "c:/temp/am-dc-5668/c:/src/package/package-1.0/_inst". diff --git a/tests/Makefile.am b/tests/Makefile.am index d4687f47d..15e8e6197 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -393,6 +393,8 @@ lzma.test \ maintclean.test \ make.test \ makej.test \ +maken.test \ +maken2.test \ makevars.test \ man.test \ man2.test \ diff --git a/tests/Makefile.in b/tests/Makefile.in index dc0a339c1..5cece9010 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -548,6 +548,8 @@ lzma.test \ maintclean.test \ make.test \ makej.test \ +maken.test \ +maken2.test \ makevars.test \ man.test \ man2.test \ diff --git a/tests/maken.test b/tests/maken.test new file mode 100755 index 000000000..8219ec66e --- /dev/null +++ b/tests/maken.test @@ -0,0 +1,61 @@ +#! /bin/sh +# Copyright (C) 2009 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 3, 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 that `make -n dist' and `make -n distcheck' do not change files +# on disk, due to GNU make executing rules containing `$(MAKE)'. + +# Please keep this test in sync with sister test maken2.test. + +. ./defs || Exit 1 + +set -e + +mkdir sub + +cat >> configure.in << 'END' +AC_CONFIG_FILES([sub/Makefile]) +AC_OUTPUT +END + +cat > Makefile.am <<'END' +SUBDIRS = sub +distcheck-hook: + @: > stamp-distcheck-hook +test-no-distdir: + test ! -d $(distdir) + test ! -f stamp-distcheck-hook + test ! -f sub/stamp-sub-dist-hook +END +cat >sub/Makefile.am <<'END' +dist-hook: + @: > stamp-sub-dist-hook +END + +$ACLOCAL +$AUTOCONF +$AUTOMAKE +./configure + +$sleep +echo stamp > stampfile +$sleep +for target in dist distcheck; do + $MAKE -n $target + $MAKE test-no-distdir + test `ls -1t | sed 1q` = stampfile +done + +Exit 0 diff --git a/tests/maken2.test b/tests/maken2.test new file mode 100755 index 000000000..4569375ac --- /dev/null +++ b/tests/maken2.test @@ -0,0 +1,63 @@ +#! /bin/sh +# Copyright (C) 2009 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 3, 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 that `make -n dist' and `make -n distcheck' show what would happen. +# This currently works for GNU make only. + +# Please keep this test in sync with sister test maken.test. + +required=GNUmake +. ./defs || Exit 1 + +set -e + +mkdir sub + +cat >> configure.in << 'END' +AC_CONFIG_FILES([sub/Makefile]) +AC_OUTPUT +END + +cat > Makefile.am <<'END' +SUBDIRS = sub +distcheck-hook: + @: > stamp-distcheck-hook +test-no-distdir: + test ! -d $(distdir) + test ! -f stamp-distcheck-hook + test ! -f sub/stamp-sub-dist-hook +END +cat >sub/Makefile.am <<'END' +dist-hook: + @: > stamp-sub-dist-hook +END + +$ACLOCAL +$AUTOCONF +$AUTOMAKE +./configure + +$sleep +echo stamp > stampfile +$sleep +for target in dist distcheck; do + $MAKE -n $target + $MAKE test-no-distdir + $MAKE -n $target | grep stamp-sub-dist-hook + test `ls -1t | sed 1q` = stampfile +done + +Exit 0