automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Improve `make -n dist' and `make -n distcheck' for GNU make.


From: Ralf Wildenhues
Subject: Improve `make -n dist' and `make -n distcheck' for GNU make.
Date: Sat, 7 Mar 2009 09:06:30 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

I noticed that `make -n dist' touches the build tree, in that it creates
directories $(distdir) and below.  Also, `make -n distcheck' bails out
with some error due to missing directories.  (BTW, I'm unsure whether
this has been reported before; if yes, speak up and I'll thank ya!)

This happens because, even in the presence of `-n', GNU (and Solaris)
make executes rule commands that contain the string `$(MAKE)'.  This is
all Good[tm] in general, but it means that we should separate commands
that change files from those that only recurse, and where not possible
(distcheck), ensure to bail out early and cleanly.

This patch fixes these issues.  The second test is mostly identical to
the first one, except that it ensures that GNU make produces sufficient
output.

One more patch to improve things for some BSD make versions coming up.
I'm not sure whether rule commands prefixed by `+' are portable enough
or desirable in Automake-provided rules; they have never been used so
far.  So I might want to avoid using it for now.

Pushed to master; I thought about branch-1-10, too, as the patch does
not seem all that intrusive, but master has seen other necessary fixes,
most notably 4a6593e3b (Fix the distdir target to cope with spaces in
absolute file names).

Cheers,
Ralf

    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.

diff --git a/NEWS b/NEWS
index 6fcc1a5..d4b59e9 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/am/distdir.am b/lib/am/distdir.am
index 5acfa49..ad5e771 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 d4687f4..15e8e61 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/maken.test b/tests/maken.test
new file mode 100755
index 0000000..8219ec6
--- /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 <http://www.gnu.org/licenses/>.
+
+# 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 0000000..4569375
--- /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 <http://www.gnu.org/licenses/>.
+
+# 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]