summaryrefslogtreecommitdiff
path: root/lib/am/distcheck.mk
diff options
context:
space:
mode:
Diffstat (limited to 'lib/am/distcheck.mk')
-rw-r--r--lib/am/distcheck.mk252
1 files changed, 252 insertions, 0 deletions
diff --git a/lib/am/distcheck.mk b/lib/am/distcheck.mk
new file mode 100644
index 000000000..9d43471f5
--- /dev/null
+++ b/lib/am/distcheck.mk
@@ -0,0 +1,252 @@
+## 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.
+
+
+# ---------------------------------------- #
+# Building various distribution flavors. #
+# ---------------------------------------- #
+
+# ----------------------------------------------------------------------
+# FIXME: how and where are these old comments still relevant?
+# ----------------------------------------------------------------------
+# Note that we don't use GNU tar's '-z' option. One reason (but
+# not the only reason) is that some versions of tar (e.g., OSF1)
+# interpret '-z' differently.
+#
+# The -o option of GNU tar used to exclude empty directories. This
+# behavior was fixed in tar 1.12 (released on 1997-04-25). But older
+# versions of tar are still used (for instance NetBSD 1.6.1 ships
+# with tar 1.11.2). We do not do anything specific w.r.t. this
+# incompatibility since packages where empty directories need to be
+# present in the archive are really unusual.
+# ----------------------------------------------------------------------
+
+# TODO: this definition-oriented interface is almost good enough to offer
+# as a public API allowing the user to define and use new archive formats.
+# However, we must think carefully about possible problems before setting
+# the API in stone. So, for the moment, we keep this internal and
+# private; there will be time to make it public, once (and if) there's
+# any request from the user base.
+
+am.dist.all-formats =
+
+am.dist.all-formats += gzip
+am.dist.ext.gzip = tar.gz
+am.dist.compress-cmd.gzip = GZIP=$(GZIP_ENV) gzip -c
+am.dist.uncompress-cmd.gzip = GZIP=$(GZIP_ENV) gzip -dc
+
+am.dist.all-formats += bzip2
+am.dist.ext.bzip2 = tar.bz2
+am.dist.compress-cmd.bzip2 = BZIP2=$${BZIP2--9} bzip2 -c
+am.dist.uncompress-cmd.bzip2 = bzip2 -dc
+
+am.dist.all-formats += lzip
+am.dist.ext.lzip = tar.lz
+am.dist.compress-cmd.lzip = lzip -c $${LZIP_OPT--9}
+am.dist.uncompress-cmd.lzip = lzip -dc
+
+am.dist.all-formats += xz
+am.dist.ext.xz = tar.xz
+am.dist.compress-cmd.xz = XZ_OPT=$${XZ_OPT--e} xz -c
+am.dist.uncompress-cmd.xz = xz -dc
+
+am.dist.all-formats += zip
+am.dist.ext.zip = zip
+am.dist.create-cmd.zip = \
+ rm -f $(distdir).zip && zip -rq $(distdir).zip $(distdir)
+am.dist.extract-cmd.zip = \
+ unzip $(distdir).zip
+
+# This is namespace-safe, so it's OK to accept values from
+# the environment.
+AM_DIST_FORMATS ?= gzip
+
+am.dist.bad-targets := \
+ $(filter-out $(am.dist.all-formats),$(AM_DIST_FORMATS))
+ifdef am.dist.bad-targets
+ $(call am.fatal,Invalid distribution formats: $(am.dist.bad-targets))
+endif
+
+am.dist.all-targets = $(patsubst %,.am/dist-%,$(am.dist.all-formats))
+am.dist.default-targets = $(patsubst %,.am/dist-%,$(AM_DIST_FORMATS))
+
+am.dist.default-archives = \
+ $(foreach x,$(AM_DIST_FORMATS),$(distdir).$(am.dist.ext.$x))
+
+define am.dist.create-archive-for-format.aux
+$(or $(am.dist.create-cmd.$1), \
+ tardir=$(distdir) && $(am__tar) \
+ | $(am.dist.compress-cmd.$1) >$(distdir).$(am.dist.ext.$1))
+endef
+am.dist.create-archive-for-format = $(call $0.aux,$(strip $1))
+
+define am.dist.extract-archive-for-format.aux
+$(or $(am.dist.extract-cmd.$1), \
+ $(am.dist.uncompress-cmd.$1) $(distdir).$(am.dist.ext.$1) \
+ | $(am__untar))
+endef
+am.dist.extract-archive-for-format = $(call $0.aux,$(strip $1))
+
+# The use of this option to pass arguments to the 'gzip' invocation is
+# not only documented in the manual and useful for better compatibility
+# with mainline Automake, but also actively employed by some important
+# makefile fragments (e.g., Gnulib's 'top/maint.mk', at least up to
+# commit v0.0-7569-gec58403). So keep it.
+GZIP_ENV = --best
+
+.PHONY: $(am.dist.all-targets)
+$(am.dist.all-targets): .am/dist-%: distdir
+ $(call am.dist.create-archive-for-format,$*)
+
+ifdef SUBDIRS
+AM_RECURSIVE_TARGETS += dist dist-all
+endif
+
+.PHONY: dist dist-all
+dist dist-all: $(am.dist.default-targets)
+ $(am.dist.post-remove-distdir)
+
+
+# ---------------------------- #
+# Checking the distribution. #
+# ---------------------------- #
+
+ifdef SUBDIRS
+AM_RECURSIVE_TARGETS += distcheck
+endif
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+.PHONY: distcheck
+distcheck: dist
+ $(call am.dist.extract-archive-for-format, \
+ $(firstword $(AM_DIST_FORMATS)))
+## Make the new source tree read-only. Distributions ought to work in
+## this case. However, make the top-level directory writable so we
+## can make our new subdirs.
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ 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",
+## 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".
+ dc_install_base=`cd $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+## We will attempt a DESTDIR install in $dc_destdir. We don't
+## create this directory under $dc_install_base, because it would
+## create very long directory names.
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ $(if $(am.dist.handle-distcheck-hook),&& $(MAKE) distcheck-hook) \
+## 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.
+ && cd $(distdir)/_build/sub \
+ && ../../configure \
+ $(if $(am.dist.handle-gettext),--with-included-gettext) \
+## Additional flags for configure.
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) $(DISTCHECK_CONFIGURE_FLAGS) \
+## At the moment, the code doesn't actually support changes in these --srcdir
+## 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" \
+ && $(MAKE) \
+ && $(MAKE) dvi \
+ && $(MAKE) check \
+ && $(MAKE) install \
+ && $(MAKE) installcheck \
+ && $(MAKE) uninstall \
+ && $(MAKE) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+## Make sure the package has proper DESTDIR support (we could not test this
+## in the previous install/installcheck/uninstall test, because it's reasonable
+## for installcheck to fail in a DESTDIR install).
+## We make the '$dc_install_base' read-only because this is where files
+## with missing DESTDIR support are likely to be installed.
+ && chmod -R a-w "$$dc_install_base" \
+## The logic here is quite convoluted because we must clean $dc_destdir
+## whatever happens (it won't be erased by the next run of distcheck like
+## $(distdir) is).
+ && ({ \
+## Build the directory, so we can cd into it even if "make install"
+## didn't create it. Use mkdir, not $(MKDIR_P) because we want to
+## fail if the directory already exists (PR/413).
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) dist \
+## Make sure to remove the dists we created in the test build directory.
+ && rm -f $(am.dist.default-archives) \
+ && $(MAKE) distcleancheck
+ $(am.dist.post-remove-distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(am.dist.default-archives)'; \
+ for i in $$list; do echo $$i; done; \
+ ) | sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+
+# Define distuninstallcheck_listfiles and distuninstallcheck separately
+# from distcheck, so that they can be overridden by the user.
+.PHONY: distuninstallcheck
+distuninstallcheck_listfiles = find . -type f -print
+# The 'dir' file (created by install-info) might still exist after
+# uninstall, so we must be prepared to account for it. The following
+# check is not 100% strict, but is definitely good enough, and even
+# accounts for overridden $(infodir).
+am.dist.uninstallcheck-listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distuninstallcheck:
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ cd '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am.dist.uninstallcheck-listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+
+# Define '$(distcleancheck_listfiles)' and 'distcleancheck' separately
+# from distcheck, so that they can be overridden by the user.
+ifeq ($(call am.vars.is-undef,distcleancheck_listfiles),yes)
+ distcleancheck_listfiles := find . -type f -print
+endif
+.PHONY: distcleancheck
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2