299 lines
10 KiB
Makefile
299 lines
10 KiB
Makefile
# This file is part of GNU Stow.
|
|
#
|
|
# GNU Stow 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 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# GNU Stow 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 https://www.gnu.org/licenses/.
|
|
|
|
## Process this file with Automake to produce Makefile.in
|
|
|
|
bin_SCRIPTS = bin/stow bin/chkstow
|
|
info_TEXINFOS = doc/stow.texi
|
|
dist_man_MANS = doc/stow.8
|
|
PDF = doc/manual.pdf
|
|
HTML = doc/manual-single.html
|
|
dist_doc_DATA = \
|
|
README.md INSTALL.md \
|
|
$(PDF) $(HTML) doc/version.texi \
|
|
ChangeLog doc/ChangeLog.OLD
|
|
|
|
# automake magic to define where *_DATA files get installed:
|
|
pmdir = $(PMDIR)
|
|
pmstowdir = $(pmdir)/Stow
|
|
|
|
pm_DATA = lib/Stow.pm
|
|
pmstow_DATA = lib/Stow/Util.pm
|
|
|
|
export TEXI2DVI_BUILD_MODE = clean
|
|
AM_MAKEINFOFLAGS = -I $(srcdir)
|
|
|
|
# We require this -I parameter to ensure that the include of the
|
|
# default ignore list in the manual works. Unfortunately this is
|
|
# the only way to do it:
|
|
#
|
|
# http://article.gmane.org/gmane.comp.sysutils.automake.bugs/4334/match=passing+parameters
|
|
#
|
|
# even though it annoyingly produces a warning with the -Wall option
|
|
# to AM_INIT_AUTOMAKE which has to be silenced via -Wno-override.
|
|
TEXI2DVI = texi2dvi $(AM_MAKEINFOFLAGS)
|
|
|
|
doc_deps = $(info_TEXINFOS) doc/version.texi
|
|
|
|
DEFAULT_IGNORE_LIST = $(srcdir)/default-ignore-list
|
|
|
|
TESTS_DIR = $(srcdir)/t
|
|
TESTS_OUT = tmp-testing-trees
|
|
TESTS_ENVIRONMENT = $(PERL) -Ibin -Ilib -I$(TESTS_DIR)
|
|
|
|
# This is a kind of hack; TESTS needs to be set to ensure that the
|
|
# `check-am' target makes check-TESTS, but we override check-TESTS
|
|
# so it doesn't really matter what it's set to, as long as it already
|
|
# exists (otherwise automake will try to build it).
|
|
TESTS = t
|
|
|
|
# GNU autotools standardised on the 'check' target, but CPAN (and the
|
|
# rest of the world) standardised on the 'test' target.
|
|
test: check
|
|
|
|
# required in vpath mode to ensure $build/t/ exists
|
|
check_DATA = $(TESTS_OUT)
|
|
|
|
# Test::Harness produces cleaner output than automake's default test
|
|
# harness, albeit without the pretty colours provided by the
|
|
# `color-tests' AM_INIT_AUTOMAKE option. This also dodges having to
|
|
# set TESTS to the full list of tests, which is good because automake
|
|
# doesn't support wildcards, and so it would be too easy to forget to
|
|
# add a new one to the list.
|
|
#
|
|
# Note that automake's `check' rule cannot be overridden
|
|
# for some weird reason:
|
|
#
|
|
# http://thread.gmane.org/gmane.comp.sysutils.automake.general/13040/focus=13041
|
|
#
|
|
# so we override check-TESTS instead which is where the real work is
|
|
# done anyway. Unfortunately this produces a warning with the -Wall
|
|
# option to AM_INIT_AUTOMAKE which has to be silenced via
|
|
# -Wno-override.
|
|
check-TESTS:
|
|
dir=$(TESTS_DIR); \
|
|
$(TESTS_ENVIRONMENT) -MTest::Harness -e 'runtests(@ARGV)' "$${dir#./}"/*.t
|
|
|
|
$(TESTS_OUT):
|
|
mkdir -p $@
|
|
|
|
CPAN_FILES = MANIFEST MANIFEST.SKIP Build.PL META.yml META.json
|
|
EXTRA_DIST = \
|
|
bin/stow.in bin/chkstow.in lib/Stow.pm.in lib/Stow/Util.pm.in \
|
|
doc/manual-split \
|
|
$(TESTS) t/testutil.pm \
|
|
$(DEFAULT_IGNORE_LIST) \
|
|
$(CPAN_FILES)
|
|
CLEANFILES = $(bin_SCRIPTS) $(pm_DATA) $(pmstow_DATA)
|
|
DISTCLEANFILES = Makefile.in configure Build MYMETA.*
|
|
MAINTAINERCLEANFILES = $(dist_man_MANS) $(HTML) $(PDF) ChangeLog
|
|
|
|
# clean up auto-generated files
|
|
clean-local:
|
|
-rm -rf $(TESTS_OUT)
|
|
maintainer-clean-local:
|
|
-rm -rf doc/manual-split cover_db
|
|
|
|
# this is more explicit and reliable than the config file trick
|
|
edit = sed -e 's|[@]PERL[@]|$(PERL)|g' \
|
|
-e 's|[@]VERSION[@]|$(VERSION)|g' \
|
|
-e "s|[@]USE_LIB_PMDIR[@]|$$use_lib_pmdir|g"
|
|
|
|
pmdir_in_INC = \
|
|
PERL5LIB= $(PERL) -V | \
|
|
awk '/@INC/ {p=1; next} p==1 {print $$1}' | \
|
|
grep -q "$(pmdir)"
|
|
|
|
calc_use_lib_pmdir = \
|
|
if $(pmdir_in_INC); then \
|
|
use_lib_pmdir=""; \
|
|
else \
|
|
use_lib_pmdir="use lib \"$(pmdir)\";"; \
|
|
fi
|
|
|
|
check_pmdir = \
|
|
echo; \
|
|
echo "\# Perl modules will be installed to $(pmdir)"; \
|
|
echo "\# "; \
|
|
if $(pmdir_in_INC); then \
|
|
echo "\# This is in $(PERL)'s built-in @INC, so everything"; \
|
|
echo "\# should work fine with no extra effort."; \
|
|
else \
|
|
echo "\# This is not in $(PERL)'s built-in @INC, so the"; \
|
|
echo "\# front-end scripts will have an appropriate \"use lib\""; \
|
|
echo "\# line inserted to compensate."; \
|
|
fi; \
|
|
echo
|
|
|
|
bin/stow: bin/stow.in Makefile.am
|
|
[ -d bin ] || mkdir bin # required in vpath mode
|
|
@$(check_pmdir)
|
|
@$(calc_use_lib_pmdir); \
|
|
$(edit) < $< > $@
|
|
@echo "Generated $@ from $<"
|
|
chmod +x $@
|
|
|
|
bin/chkstow: bin/chkstow.in Makefile.am
|
|
@[ -d bin ] || mkdir bin # required in vpath mode
|
|
@$(edit) < $< > $@
|
|
@echo "Generated $@ from $<"
|
|
chmod +x $@
|
|
|
|
lib/Stow.pm: lib/Stow.pm.in $(DEFAULT_IGNORE_LIST) Makefile.am
|
|
@[ -d lib ] || mkdir lib # required in vpath mode
|
|
@( $(edit) < $<; cat $(DEFAULT_IGNORE_LIST) ) > $@
|
|
@echo "Generated $@ from $< and $(DEFAULT_IGNORE_LIST)"
|
|
|
|
lib/Stow/Util.pm: lib/Stow/Util.pm.in Makefile.am
|
|
@[ -d lib/Stow ] || mkdir -p lib/Stow # required in vpath mode
|
|
@$(edit) < $< > $@
|
|
@echo "Generated $@ from $<"
|
|
|
|
##############################################################################
|
|
# The below rules should only be needed by developers.
|
|
##############################################################################
|
|
|
|
cpanm:
|
|
cpanm --quiet --installdeps --notest .; \
|
|
CPANM_RESULT=$$?; \
|
|
if [ $$CPANM_RESULT != 0 ]; then \
|
|
echo ---------------------------------------------------; \
|
|
cat ~/.cpanm/build.log; \
|
|
echo ---------------------------------------------------; \
|
|
exit $$CPANM_RESULT; \
|
|
fi
|
|
|
|
doc/stow.8: bin/stow.in Makefile.am
|
|
[ -d doc ] || mkdir doc # required in vpath mode
|
|
$(edit) < $< | pod2man --name stow --section 8 > $@
|
|
|
|
# We use automake's built-in rule to generate stow.info. The built-in
|
|
# rules would also generate doc/stow.html and doc/stow.pdf, but after
|
|
# installation we want $(docdir) (typically /usr/share/doc/stow/) to
|
|
# contain manual-single.html, manual.pdf, and manual-split/*.html, to
|
|
# make it explicitly obvious that these files contain the user manual
|
|
# rather than some other Stow-related documentation.
|
|
#
|
|
# If it were not for a troublesome dependency on doc/$(am__dirstamp):
|
|
#
|
|
# http://article.gmane.org/gmane.comp.sysutils.automake.general/13192
|
|
#
|
|
# we could have achieved this using the built-in rules combined with
|
|
# install-data-hook to rename from stow.pdf to manual.pdf etc. on
|
|
# install. Instead, by overriding the built-in rules with modified
|
|
# versions, we can kill both birds with one stone.
|
|
|
|
# Generating the single-page HTML version used to be done with the old
|
|
# texi2html, which is no longer maintained. This rule is not used,
|
|
# but is kept to allow comparing of results during the transition, and
|
|
# potentially longer for posterity.
|
|
doc/manual-single-old-texi2html.html: $(doc_deps)
|
|
texi2html --P=$(srcdir) --output=$@ -expandinfo -menu -monolithic -verbose $<
|
|
|
|
# One alternative to the old texi2html approach is to use the texi2html
|
|
# wrapper around texi2any which is provided as a partial drop-in replacement:
|
|
#
|
|
# https://www.gnu.org/software/texinfo/manual/texinfo/html_node/texi2html.html#texi2html
|
|
#
|
|
# Differences to the old texi2html:
|
|
#
|
|
# - Doesn't wrap @file{foo} paths with quotes, which looks better.
|
|
# - Missing certain sections
|
|
doc/manual-single-texi2html-wrapper.html: $(doc_deps)
|
|
texi2any -P $(srcdir) --output=$@ --verbose \
|
|
-c TEXI2HTML=1 -c SHOW_MENU=1 -c MONOLITHIC=1 $<
|
|
|
|
.PHONY: manual-single-html-all
|
|
manual-single-html-all: \
|
|
$(HTML) \
|
|
doc/manual-single-texi2html-wrapper.html \
|
|
doc/manual-single-old-texi2html.html
|
|
|
|
# Modern approach using $(MAKEINFOHTML) --no-split
|
|
# Differences to the older two approaches:
|
|
#
|
|
# - Nicer navigation links between sections
|
|
$(HTML): $(doc_deps)
|
|
[ -d doc ] || mkdir doc # required in vpath mode
|
|
-rm -f $@
|
|
$(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \
|
|
-c USE_TITLEPAGE_FOR_TITLE=1 --no-split -o $@ \
|
|
`test -f 'doc/stow.texi' || echo '$(srcdir)/'`doc/stow.texi
|
|
|
|
$(PDF): $(doc_deps)
|
|
TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
|
|
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \
|
|
$(TEXI2PDF) -o $@ `test -f 'doc/stow.texi' || echo '$(srcdir)/'`doc/stow.texi
|
|
|
|
doc/manual-split: $(doc_deps)
|
|
rm -rf $@.new
|
|
if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \
|
|
-o $@.new `test -f 'doc/stow.texi' || echo '$(srcdir)/'`doc/stow.texi; \
|
|
then \
|
|
rm -rf $@; \
|
|
mv $@.new $@; \
|
|
else \
|
|
rm -Rf $@.new $@; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# The split version of the manual is copied to $(docdir)/manual-split
|
|
# by install-data-hook. The whole subdirectory is included via
|
|
# EXTRA_DIST in order to avoid having to list each file explicitly in
|
|
# dist_doc_DATA, since automake doesn't support wildcards, and
|
|
# dist_doc_DATA cannot refer to directories while EXTRA_DIST can (go
|
|
# figure ...)
|
|
|
|
install-data-hook: doc/manual-split
|
|
cp -r $(srcdir)/doc/manual-split $(DESTDIR)$(docdir)
|
|
|
|
uninstall-hook:
|
|
chmod u+w -R $(DESTDIR)$(docdir)/manual-split
|
|
rm -rf $(DESTDIR)$(docdir)/manual-split
|
|
|
|
# Using install-data-hook has the slightly annoying disadvantage that
|
|
# by default the split version of the manual isn't automatically
|
|
# rebuilt during development by a simple `make'. A workaround hack
|
|
# for this is to piggy-back the dependency onto manual-single.html,
|
|
# which *is* automatically rebuilt by `make':
|
|
$(HTML): doc/manual-split
|
|
|
|
# With the above hack, this probably isn't necessary but is safer to
|
|
# keep in anyway:
|
|
dist-hook: doc/manual-split
|
|
|
|
dist-hook: $(dist_man_MANS)
|
|
## If we are creating a distribution from a git checkout, ensure
|
|
## the ChangeLog file is in sync the git repository.
|
|
if test -d $(top_srcdir)/.git; then \
|
|
rm -f ChangeLog \
|
|
&& $(MAKE) $(AM_MAKEFLAGS) ChangeLog \
|
|
&& cp -f ChangeLog $(distdir)/ChangeLog; \
|
|
fi
|
|
|
|
ChangeLog: doc/ChangeLog.OLD
|
|
@if [ -d .git ]; then \
|
|
( \
|
|
git log \
|
|
--format="format:%ad %aN <%aE>%n%n * %w(70,0,4)%s%+b%n" \
|
|
--name-status \
|
|
v2.0.2..HEAD \
|
|
| sed 's/^\([A-Z]\)\t/ \1 /'; \
|
|
cat $< \
|
|
) > $@; \
|
|
echo "Rebuilt $@ from git commit history."; \
|
|
else \
|
|
echo "Not in a git repository; can't update ChangeLog."; \
|
|
fi
|