summaryrefslogtreecommitdiff
path: root/lib/am/distdir.mk
diff options
context:
space:
mode:
Diffstat (limited to 'lib/am/distdir.mk')
-rw-r--r--lib/am/distdir.mk301
1 files changed, 301 insertions, 0 deletions
diff --git a/lib/am/distdir.mk b/lib/am/distdir.mk
new file mode 100644
index 000000000..165fcebc1
--- /dev/null
+++ b/lib/am/distdir.mk
@@ -0,0 +1,301 @@
+## automake - create Makefile.in from Makefile.am
+## 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
+## 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 <http://www.gnu.org/licenses/>.
+
+# Files added by the automake script.
+am.dist.common-files += $(am.dist.common-files.internal)
+
+# Makefile fragments used internally by automake-generated Makefiles.
+am.dist.mk-files = $(wildcard $(am.conf.aux-dir)/am-ng/*)
+
+# Use 'sort', not 'am.util.uniq', for performance reasons. Luckily, we
+# don't care in which order the distributed files are.
+am.dist.all-files = $(call am.memoize,am.dist.all-files,$(strip $(sort \
+ $(am.dist.common-files) $(am.dist.sources) $(am.dist.mk-files) \
+ $(TEXINFOS) $(EXTRA_DIST))))
+
+# Try to avoid repeated slashes in the entries, to make the filtering
+# in the 'am.dist.files-tmp2' definition below more reliable.
+# This idiom should compress up to four consecutive '/' characters
+# in each $(am.dist.all-files) entry.
+am.dist.files-tmp1 = $(call am.memoize,am.dist.files-tmp1, \
+ $(subst //,/,$(subst //,/,$(am.dist.all-files))))
+
+# Files filtered out here require an ad-hoc "munging".
+#
+# 1. In the first $(patsubst), we strip leading $(srcdir) (which might
+# appears in EXTRA_DIST, especially if one want to use the $(wildcard)
+# built-in in there), so that in our 'distdir' recipe below we can loop
+# on the list of distributed files and copy them in the distribution
+# directory with a simple "cp $file $(distdir)/$file" -- which would
+# break if $file contained a leading $(srcdir) component. However,
+# it should be noted that this filtering has the quite undesirable
+# side effect of triggering a VPATH search also for files specified
+# *explicitly* with a $(srcdir) prefix; but this limitation is also
+# present in mainline Automake, and concerns only such corner-case
+# situations that it's probably not worth worrying about.
+#
+# 2. In the second $(patsubst), we also rewrite $(top_srcdir) -- which
+# can sometimes appear in $(am.dist.common-files), and can be an
+# absolute path -- by $(top_builddir) (which is always relative).
+# If needed, $(srcdir) will be prepended later by our VPATH-aware
+# rules. The same caveats reported above apply.
+#
+am.dist.files-tmp2 = $(call am.memoize,am.dist.files-tmp2, \
+ $(filter-out $(srcdir)/% $(top_srcdir)/%, $(am.dist.files-tmp1)) \
+ $(patsubst $(srcdir)/%, %, \
+ $(filter $(srcdir)/%, $(am.dist.files-tmp1))) \
+ $(patsubst $(top_srcdir)/%, $(top_builddir)/%, \
+ $(filter $(top_srcdir)/%, $(am.dist.files-tmp1))))
+
+# Strip extra whitespaces, for more safety.
+am.dist.files-cooked = \
+ $(call am.memoize,am.dist.files-cooked,$(strip $(am.dist.files-tmp2)))
+
+# Given the pre-processing done above to the list of distributed files,
+# this definition ensures that we won't try to create the wrong
+# directories when $(top_srcdir) or $(srcdir) appears in some entry of
+# the list of all distributed files.
+# For example, with EXTRA_DIST containing "$(srcdir)/subdir/file", this
+# will allow our rules to correctly create "$(distdir)/subdir", and not
+# "$(distdir)/$(srcdir)/subdir" -- which, in a VPATH build where
+# "$(subdir) = ..", would be the build directory!
+am.dist.parent-dirs = \
+ $(call am.memoize,am.dist.parent-dirs,$(strip $(sort \
+ $(filter-out ., $(patsubst ./%,%,$(dir $(am.dist.files-cooked)))))))
+
+# These two variables are used in the 'distdir' rule below to avoid
+# potential problems with overly long command lines (the infamous
+# "Argument list too long" error).
+am.dist.xmkdir = \
+ @$(MKDIR_P) $(patsubst %,"$(distdir)"/%,$1)$(am.chars.newline)
+am.dist.write-filelist = \
+ @lst='$1'; for x in $$lst; do echo $$x; done \
+ >> $(am.dir)/$@-list$(am.chars.newline)
+
+ifdef am.conf.is-topdir
+
+# This is user-overridable.
+ifeq ($(call am.vars.is-undef,distdir),yes)
+distdir = $(PACKAGE)-$(VERSION)
+endif
+
+# This is not, but must be public to be avaialable in the "dist-hook"
+# rules (this is also documented in the Automake manual).
+top_distdir = $(distdir)
+
+# A failed "make distcheck" might leave some parts of the $(distdir)
+# readonly, so we need these hoops to ensure it is removed correctly.
+# On MSYS (1.0.17, at least) it is not possible to remove a directory
+# that is in use; so, if the first rm fails, we sleep some seconds and
+# retry, to give pending processes some time to exit and "release" the
+# directory before we remove it. The value of "some seconds" is 5 for
+# the moment, which is mostly an arbitrary value, but seems high enough
+# in practice. See automake bug#10470.
+am.dist.remove-distdir = \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }
+
+# Define this separately, so that if can be overridden by the recursive
+# make invocation in 'dist-all'. That is needed to support concurrent
+# creation of different tarball formats.
+am.dist.post-remove-distdir = \
+ test ! -d "$(distdir)" || { $(am.dist.remove-distdir); }
+
+endif # am.conf.is-topdir
+
+ifdef DIST_SUBDIRS
+# Computes a relative pathname RELDIR such that DIR1/RELDIR = DIR2.
+# Input:
+# - dir1 relative pathname, relative to the current directory.
+# - dir2 relative pathname, relative to the current directory.
+# Output:
+# - reldir relative pathname of dir2, relative to dir1.
+am.dist.relativize-path = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+endif # DIST_SUBDIRS
+
+.PHONY: distdir
+ifdef DIST_SUBDIRS
+AM_RECURSIVE_TARGETS += distdir
+endif
+
+distdir: $(am.dist.all-files) | $(am.dir)
+##
+## For Gnits users, this is pretty handy. Look at 15 lines
+## in case some explanatory text is desirable.
+##
+ifdef am.conf.is-topdir
+ifdef am.conf.check-news
+ @case `sed 15q $(srcdir)/NEWS` in \
+ *'$(VERSION)'*) : ;; \
+ *) echo "NEWS not updated; not releasing" 1>&2; exit 1;; \
+ esac
+endif # am.conf.is-topdir
+## Avoid this command if there is no directory to clean.
+ $(if $(wildcard $(distdir)/),$(am.dist.remove-distdir))
+ test -d "$(distdir)" || mkdir "$(distdir)"
+endif # am.conf.check-news
+## Make the subdirectories for the files, avoiding to exceed command
+## line length limitations.
+ $(call am.xargs-map,am.dist.xmkdir,$(am.dist.parent-dirs))
+## Install the files and directories, applying a "VPATH rewrite"
+## by hand where needed.
+## To get the files in the distribution directory, use 'cp', not 'ln'.
+## There are situations in which 'ln' can fail. For instance a file to
+## distribute could actually be a cross-filesystem symlink -- this can
+## easily happen if "gettextize" was run on the distribution.
+ @rm -f $(am.dir)/$@-list
+ $(call am.xargs-map,am.dist.write-filelist, \
+ $(am.dist.files-cooked))
+ @while read file; do \
+## Always look for the file or directory to distribute in the build
+## directory first, in VPATH spirit.
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+## Don't mention $$file in the destination argument, since this fails if
+## the destination directory already exists. Also, use '-R' and not '-r'.
+## '-r' is almost always incorrect.
+## If a directory exists both in '.' and $(srcdir), then we copy the
+## files from $(srcdir) first and then install those from '.'. This
+## can help people who distribute directories made of source files
+## *and* generated files.
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+## If the destination directory already exists, it may contain read-only
+## files, e.g., during "make distcheck".
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+## Test for file existence because sometimes a single auxiliary file
+## is distributed from several Makefiles at once (see automake bug#9546
+## and bug#9651, and the follow-up commits 'v1.11-1219-g326ecba',
+## 'v1.11-1220-g851b1ae' and 'v1.11-1221-gdccae6a'). See also test
+## 'dist-repeated.sh'.
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done < $(am.dir)/$@-list
+##
+## Test for directory existence here because previous automake
+## invocation might have created some directories. Note that we
+## explicitly set distdir for the subdir make; that lets us mix-n-match
+## many automake-using packages into one large package, and have "dist"
+## at the top level do the right thing. If we're in the topmost
+## directory, then we use 'distdir' instead of 'top_distdir'; this lets
+## us work correctly with an enclosing package.
+ifdef DIST_SUBDIRS
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am.make.dry-run) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am.dist.relativize-path); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am.dist.relativize-path); \
+ new_top_distdir=$$reldir; \
+ echo " $(MAKE) -C $$subdir distdir top_distdir=$$new_top_distdir distdir=$$new_distdir"; \
+ $(MAKE) -C $$subdir distdir \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+## Disable am.dist.remove-distdir so that sub-packages do not clear a
+## directory we have already cleared and might even have populated
+## (e.g. shared AUX dir in the sub-package).
+ am.dist.remove-distdir='' \
+## Disable filename length check:
+ am.dist.filename-filter='' \
+## No need to fix modes more than once:
+ am.dist.skip-mode-fix=yes \
+ || exit 1; \
+ fi; \
+ done
+endif # DIST_SUBDIRS
+##
+## We might have to perform some last second updates, such as updating
+## info files.
+## We must explicitly set distdir and top_distdir for these sub-makes.
+##
+ifdef am.dist.extra-targets
+ $(MAKE) $(am.dist.extra-targets) $(if $(am.conf.is-topdir),, \
+ top_distdir="$(top_distdir)" distdir="$(distdir)")
+endif
+##
+## This complex find command will try to avoid changing the modes of
+## links into the source tree, in case they're hard-linked.
+##
+## Ignore return result from chmod, because it might give an error
+## if we chmod a symlink.
+##
+## Another nastiness: if the file is unreadable by us, we make it
+## readable regardless of the number of links to it. This only
+## happens in perverse cases.
+##
+## 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.
+##
+ifdef am.conf.is-topdir
+ifndef am.dist.skip-mode-fix
+ find "$(distdir)" \
+ -type d ! -perm -755 -exec chmod u+rwx,go+rx {} \; -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 {} {} \; \
+ || chmod -R a+r "$(distdir)"
+endif # !am.dist.skip-mode-fix
+ifdef am.dist.filename-filter
+ @if find "$(distdir)" -type f -print \
+ | grep '^$(am.dist.filename-filter)' 1>&2; then \
+ echo '$@: error: the above filenames are too long' 1>&2; \
+ exit 1; \
+ else :; fi
+endif # am.dist.filename-filter
+endif # am.conf.is-topdir