]> git.ipfire.org Git - thirdparty/automake.git/commitdiff
distdir: avoid duplicate `find' traversal with subpackages.
authorRalf Wildenhues <Ralf.Wildenhues@gmx.de>
Sun, 3 May 2009 07:47:58 +0000 (09:47 +0200)
committerRalf Wildenhues <Ralf.Wildenhues@gmx.de>
Sun, 3 May 2009 07:50:00 +0000 (09:50 +0200)
* lib/am/distdir.am (distdir) [%?SUBDIRS%]: When recursing, set
`am__skip_mode_fix'.
[%?TOPDIR_P%]: When `$(am__skip_mode_fix)' is set, avoid tree
walk.
* tests/subpkg4.test: New test, to ensure that we still walk the
whole tree while fixing permissions.  We don't ensure it is
walked once only.
* tests/Makefile.am: Update.

Signed-off-by: Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
ChangeLog
Makefile.in
lib/Automake/Makefile.in
lib/Makefile.in
lib/am/distdir.am
tests/Makefile.am
tests/Makefile.in
tests/subpkg4.test [new file with mode: 0755]

index c8e46894f9aa4c6fe24ee5a329ce56b44cb250ac..0ca67fa4b1fbd3bf7a5c08e4cb4c7e3d1c54e83d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2009-05-03  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
+       distdir: avoid duplicate `find' traversal with subpackages.
+       * lib/am/distdir.am (distdir) [%?SUBDIRS%]: When recursing, set
+       `am__skip_mode_fix'.
+       [%?TOPDIR_P%]: When `$(am__skip_mode_fix)' is set, avoid tree
+       walk.
+       * tests/subpkg4.test: New test, to ensure that we still walk the
+       whole tree while fixing permissions.  We don't ensure it is
+       walked once only.
+       * tests/Makefile.am: Update.
+
        Disable test cleanup trap with OSF1/Tru64 sh.
        * configure.ac: Test whether /bin/sh has working 'set -e'
        in conjunction with an exit trap.  Set $am_cv_sh_errexit_works
index 320635ab33782b3c559e8ad803af02f8e1bea833..56a3126717a8f38e2e5d36d69ffe1140c399b7b5 100644 (file)
@@ -552,13 +552,14 @@ distdir: $(DISTFILES)
            $(am__relativize); \
            new_top_distdir=$$reldir; \
            echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-           echo "     am__remove_distdir=: am__skip_length_check=: distdir)"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
            ($(am__cd) $$subdir && \
              $(MAKE) $(AM_MAKEFLAGS) \
                top_distdir="$$new_top_distdir" \
                distdir="$$new_distdir" \
                am__remove_distdir=: \
                am__skip_length_check=: \
+               am__skip_mode_fix=: \
                distdir) \
              || exit 1; \
          fi; \
@@ -566,7 +567,8 @@ distdir: $(DISTFILES)
        $(MAKE) $(AM_MAKEFLAGS) \
          top_distdir="$(top_distdir)" distdir="$(distdir)" \
          dist-hook
-       -find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+       -test -n "$(am__skip_mode_fix)" \
+       || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
          ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
index 9a62aa207c8392caacff69d75698414edc7dff48..25c2843e97f2e630f1c8f921600abea4db64495e 100644 (file)
@@ -498,13 +498,14 @@ distdir: $(DISTFILES)
            $(am__relativize); \
            new_top_distdir=$$reldir; \
            echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-           echo "     am__remove_distdir=: am__skip_length_check=: distdir)"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
            ($(am__cd) $$subdir && \
              $(MAKE) $(AM_MAKEFLAGS) \
                top_distdir="$$new_top_distdir" \
                distdir="$$new_distdir" \
                am__remove_distdir=: \
                am__skip_length_check=: \
+               am__skip_mode_fix=: \
                distdir) \
              || exit 1; \
          fi; \
index ba470fee3acc9b4179c0b13f61d36b0a6feddf61..3773bd180b1d2e5b75c295785442fe9ce035e9e2 100644 (file)
@@ -473,13 +473,14 @@ distdir: $(DISTFILES)
            $(am__relativize); \
            new_top_distdir=$$reldir; \
            echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-           echo "     am__remove_distdir=: am__skip_length_check=: distdir)"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
            ($(am__cd) $$subdir && \
              $(MAKE) $(AM_MAKEFLAGS) \
                top_distdir="$$new_top_distdir" \
                distdir="$$new_distdir" \
                am__remove_distdir=: \
                am__skip_length_check=: \
+               am__skip_mode_fix=: \
                distdir) \
              || exit 1; \
          fi; \
index 5ee7b5c72c71b8c641ee09b68207b3e9805aa015..9fc03cb79238ea02092568816f5d601a63a86e30 100644 (file)
@@ -249,7 +249,7 @@ if %?SUBDIRS%
            $(am__relativize); \
            new_top_distdir=$$reldir; \
            echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-           echo "     am__remove_distdir=: am__skip_length_check=: distdir)"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
            ($(am__cd) $$subdir && \
              $(MAKE) $(AM_MAKEFLAGS) \
                top_distdir="$$new_top_distdir" \
@@ -260,6 +260,8 @@ if %?SUBDIRS%
                am__remove_distdir=: \
 ## Disable filename length check:
                am__skip_length_check=: \
+## No need to fix modes more than once:
+               am__skip_mode_fix=: \
                distdir) \
              || exit 1; \
          fi; \
@@ -293,8 +295,13 @@ endif %?DIST-TARGETS%
 ## We use $(install_sh) because that is a known-portable way to modify
 ## the file in place in the source tree.
 ##
+## If we are being invoked recursively, then there is no need to walk
+## the whole subtree again.  This is a complexity reduction for a deep
+## hierarchy of subpackages.
+##
 if %?TOPDIR_P%
-       -find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+       -test -n "$(am__skip_mode_fix)" \
+       || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
          ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
index 09b979ca8239eac4d3c093faecc3611154268360..afcfda8ae988d835a3ea45af8f5d8cc1e94cc679 100644 (file)
@@ -629,6 +629,7 @@ subobjname.test \
 subpkg.test \
 subpkg2.test \
 subpkg3.test \
+subpkg4.test \
 subst.test \
 subst2.test \
 subst3.test \
index d735afad9ad3b393175771baf47f85f9cd1be6ec..ce8e779e844efc53024b66c43099403bd685ea57 100644 (file)
@@ -862,6 +862,7 @@ subobjname.test \
 subpkg.test \
 subpkg2.test \
 subpkg3.test \
+subpkg4.test \
 subst.test \
 subst2.test \
 subst3.test \
diff --git a/tests/subpkg4.test b/tests/subpkg4.test
new file mode 100755 (executable)
index 0000000..592b37e
--- /dev/null
@@ -0,0 +1,73 @@
+#! /bin/sh
+# Copyright (C) 2006, 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/>.
+
+# Test to ensure `distdir' fixes the mode of files and directories
+# copied into `$(distdir)', even with sub-packages.
+
+. ./defs || Exit 1
+
+set -e
+
+cat >Makefile.am <<'END'
+SUBDIRS = subpkg
+test-distdir-is-readable:
+       bad_dirs=`find $(distdir) -type d ! -perm -777 -print`; \
+       if test -n "$$bad_dirs"; then \
+         echo "directories not permissive: $$bad_dirs" >&2; \
+         exit 1; \
+       fi
+       bad_files=`find $(distdir) ! -type d ! -perm -444 -print`; \
+       if test -n "$$bad_files"; then \
+         echo "file not permissive: $$bad_files" >&2; \
+         exit 1; \
+       fi
+END
+
+cat >>configure.in <<'END'
+AC_CONFIG_SUBDIRS([subpkg])
+AC_OUTPUT
+END
+
+mkdir subpkg subpkg/dir
+echo foobar >subpkg/foobar
+echo baz > subpkg/dir/baz
+
+chmod go-rwx subpkg/foobar subpkg/dir/baz subpkg/dir
+
+cat >subpkg/Makefile.am <<'END'
+EXTRA_DIST = foobar dir
+END
+
+cat >subpkg/configure.in <<'END'
+AC_INIT([subpkg], [1.0])
+AM_INIT_AUTOMAKE
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
+END
+
+$ACLOCAL
+$AUTOMAKE
+$AUTOCONF
+
+cd subpkg
+$ACLOCAL
+$AUTOMAKE
+$AUTOCONF
+cd ..
+
+./configure
+$MAKE distdir
+$MAKE test-distdir-is-readable