automake-1.16: The dist Hook
14.3 The dist Hook
==================
Occasionally it is useful to be able to change the distribution before
it is packaged up. If the ‘dist-hook’ rule exists, it is run after the
distribution directory is filled, but before the actual distribution
archives are created. One way to use this is for removing unnecessary
files that get recursively included by specifying a directory in
‘EXTRA_DIST’:
EXTRA_DIST = doc
dist-hook:
chmod -R u+w $(distdir)/doc
rm -rf `find $(distdir)/doc -type d -name RCS`
The ‘dist-hook’ recipe should not assume that the regular files in the
distribution directory are writable; this might not be the case if one
is packaging from a read-only source tree, or when a ‘make distcheck’ is
being done. Similarly, the recipe should not assume that the
subdirectories put into the distribution directory as a result of being
listed in ‘EXTRA_DIST’ are writable. So, if the ‘dist-hook’ recipe
wants to modify the content of an existing file (or ‘EXTRA_DIST’
subdirectory) in the distribution directory, it should explicitly to
make it writable first:
EXTRA_DIST = README doc
dist-hook:
chmod u+w $(distdir)/README $(distdir)/doc
echo "Distribution date: `date`" >> $(distdir)/README
rm -f $(distdir)/doc/HACKING
Two variables that come handy when writing ‘dist-hook’ rules are
‘$(distdir)’ and ‘$(top_distdir)’.
‘$(distdir)’ points to the directory where the ‘dist’ rule will copy
files from the current directory before creating the tarball. If you
are at the top-level directory, then ‘distdir = $(PACKAGE)-$(VERSION)’.
When used from subdirectory named ‘foo/’, then ‘distdir =
../$(PACKAGE)-$(VERSION)/foo’. ‘$(distdir)’ can be either a relative or
absolute path; do not assume a particular form.
‘$(top_distdir)’ always points to the root directory of the
distributed tree. At the top level it’s equal to ‘$(distdir)’. In the
‘foo/’ subdirectory ‘top_distdir = ../$(PACKAGE)-$(VERSION)’.
‘$(top_distdir)’ can also be either a relative or absolute path.
When packages are nested using ‘AC_CONFIG_SUBDIRS’ (⇒
Subpackages), then ‘$(distdir)’ and ‘$(top_distdir)’ are relative to
the package where ‘make dist’ was run, not to any sub-packages involved.