diff options
Diffstat (limited to 'lib/am/distcheck.mk')
-rw-r--r-- | lib/am/distcheck.mk | 252 |
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 |