blob: 3d4be7f16c0132e3466ee8e328b30cd5503e5467 [file] [log] [blame]
#
# doc: Pacemaker code
#
# Copyright (C) 2008 Andrew Beekhof
#
# 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
# of the License, 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
include $(top_srcdir)/Makefile.common
# Deprecated plaintext documents (also dynamically converted to HTML)
ascii = acls.txt \
crm_fencing.txt
generated_docs =
if BUILD_ASCIIDOC
generated_docs += $(ascii:%.txt=%.html)
endif
# Current Publican/docbook-based documentation
docbook = Clusters_from_Scratch \
Pacemaker_Development \
Pacemaker_Explained \
Pacemaker_Remote
docbook_build = $(docbook:%=%.build)
doc_DATA = $(ascii) $(generated_docs)
EXTRA_DIST = $(ascii) $(SHARED_TXT) $(PNGS_ORIGINAL) $(DOTS) $(SVGS)
EXTRA_DIST += $(CFS_TXT) $(CFS_XML_ONLY)
EXTRA_DIST += $(PD_TXT) $(PD_XML_ONLY)
EXTRA_DIST += $(PE_TXT) $(PE_XML_ONLY)
EXTRA_DIST += $(PR_TXT) $(PR_XML_ONLY)
EXTRA_DIST += pcs-crmsh-quick-ref.md
# toplevel rsync destination for www targets (without trailing slash)
RSYNC_DEST ?= root@www.clusterlabs.org:/var/www/html
# recursive, preserve symlinks/permissions/times, verbose, compress,
# don't cross filesystems, sparse, show progress
RSYNC_OPTS = -rlptvzxS --progress
# What formats to build by default: pdf,html,html-single,html-desktop,epub
DOCBOOK_FORMATS := html-desktop
# What languages to build and upload to website by default
# (currently only en-US because translations are out of date)
DOCBOOK_LANGS := en-US
# @TODO We could simplify this (and .gitignore) by establishing a convention
# that original image source begins with an uppercase letter and generated
# files with lowercase.
# Scheduler transition graphs
# @TODO Add original XML, and generate DOTs via crm_simulate
DOTS = $(wildcard Clusters_from_Scratch/en-US/images/*.dot) \
$(wildcard Pacemaker_Explained/en-US/images/*.dot)
# Vector sources for images
# @TODO Generate transition SVGs from DOTs via dot
SVGS = $(wildcard Clusters_from_Scratch/en-US/images/pcmk-*.svg) \
$(wildcard Pacemaker_Explained/en-US/images/pcmk-*.svg) \
$(DOTS:%.dot=%.svg)
# Final images (some originally in PNG, others generated from SVG)
PNGS_ORIGINAL = Pacemaker_Remote/en-US/images/pcmk-ha-cluster-stack.png \
Pacemaker_Remote/en-US/images/pcmk-ha-remote-stack.png \
Clusters_from_Scratch/en-US/images/Console.png \
Clusters_from_Scratch/en-US/images/Editing-eth0.png \
Clusters_from_Scratch/en-US/images/Installer.png \
Clusters_from_Scratch/en-US/images/Network.png \
Clusters_from_Scratch/en-US/images/Partitioning.png \
Clusters_from_Scratch/en-US/images/Welcome.png \
Pacemaker_Explained/en-US/images/resource-set.png \
Pacemaker_Explained/en-US/images/three-sets-complex.png \
Pacemaker_Explained/en-US/images/three-sets.png \
Pacemaker_Explained/en-US/images/two-sets.png
PNGS_GENERATED = $(SVGS:%.svg=%-small.png) \
$(SVGS:%.svg=%.png) \
$(SVGS:%.svg=%-large.png)
PNGS = $(PNGS_ORIGINAL) $(PNGS_GENERATED)
graphics: $(PNGS)
%.png: %.svg
$(AM_V_GEN)$(INKSCAPE) --file=$< --export-dpi=90 -C --export-png=$@ $(PCMK_quiet)
%-small.png: %.svg
$(AM_V_GEN)$(INKSCAPE) --file=$< --export-dpi=45 -C --export-png=$@ $(PCMK_quiet)
%-large.png: %.svg
$(AM_V_GEN)$(INKSCAPE) --file=$< --export-dpi=180 -C --export-png=$@ $(PCMK_quiet)
if IS_ASCIIDOC
ASCIIDOC_HTML_ARGS = --unsafe --backend=xhtml11
ASCIIDOC_DBOOK_ARGS = -b docbook -d book
else
ASCIIDOC_HTML_ARGS = --backend=html5
ASCIIDOC_DBOOK_ARGS = -b docbook45 -d book
endif
%.html: %.txt
$(AM_V_GEN)$(ASCIIDOC_CONV) $(ASCIIDOC_HTML_ARGS) --out-file=$@ $< $(PCMK_quiet)
#
# Generate DocBook XML from asciidoc text.
#
# Build each chapter as a book (since the numbering isn't right for
# articles and only books can have appendices) and then strip out the
# bits we don't want or need.
#
# XXX Sequence of tr/sed commands should be replaced with a single XSLT
#
%.xml: %.txt
$(AM_V_at)$(MKDIR_P) $(shell dirname $@) # might not exist in VPATH build
$(AM_V_at)$(ASCIIDOC_CONV) $(ASCIIDOC_DBOOK_ARGS) -o - $< | tr -d '\036\r' >$@-t # Convert, fix line endings
$(AM_V_at)sed -i 's/\ lang="en"//' $@-t # Never specify a language in the chapters
$(AM_V_at)sed -i 's/simpara/para/g' $@-t # publican doesn't correctly render footnotes with simpara
$(AM_V_at)sed -i 's/.*<date>.*//g' $@-t # Remove dangling tag
$(AM_V_at)sed -i 's/.*preface>//g' $@-t # Remove preface elements
$(AM_V_at)sed -i 's:<title></title>::g' $@-t # Remove empty title
$(AM_V_at)sed -i 's/chapter/section/g' $@-t # Chapters become sections, so that books can become chapters
$(AM_V_at)sed -i 's/<.*bookinfo.*>//g' $@-t # Strip out bookinfo, we don't need it
$(AM_V_at)! grep -q "<appendix" $@-t || sed -i \
's/.*book>//;tb;bf;:b;N;s/.*<title>.*<\/title>.*//;tb;/<appendix/{:i;n;/<\/appendix/{p;d};bi};bb;:f;p;d' \
$@-t # We just want the appendix tag (asciidoctor adds non-empty book-level title)
$(AM_V_at)sed -i 's/book>/chapter>/g' $@-t # Rename to chapter (won't trigger if previous sed did)
$(AM_V_GEN)mv $@-t $@
# publican-clusterlabs/xsl/{html,html-single,pdf}.xsl refer to URIs
# requiring Internet access, hence we shadow that with a XML catalog-based
# redirect to local files brought with Publican installation;
# this is what newer Publican normally does with the system-wide catalog
# upon its installation, but let's provide a compatibility for older
# or badly installed instances (via adding the created file into
# XML_CATALOG_FILES for libxml2 backing Publican as a fallback);
# note that nextCatalog arrangement needed so as to overcome
# https://rt.cpan.org/Public/Bug/Display.html?id=113781
publican-catalog-fallback:
@exec >$@-t \
&& echo '<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">' \
&& echo '<rewriteURI uriStartString="https://fedorahosted.org/released/publican/xsl/docbook4/" rewritePrefix="file:///usr/share/publican/xsl/"/>' \
&& echo '</catalog>'
$(AM_V_GEN)mv $@-t $@
publican-catalog: publican-catalog-fallback
@exec >$@-t \
&& echo '<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">' \
&& echo '<nextCatalog catalog="file:///etc/xml/catalog"/>' \
&& echo '<nextCatalog catalog="file://$(CURDIR)/$<"/>' \
&& echo '</catalog>'
$(AM_V_GEN)mv $@-t $@
COMMON_XML = Author_Group.xml Book_Info.xml Revision_History.xml
SHARED_TXT=$(wildcard shared/en-US/*.txt)
SHARED_XML=$(SHARED_TXT:%.txt=%.xml)
if PUBLICAN_INTREE_BRAND
PUBLICAN_INTREE_DEPS = publican-catalog
PUBLICAN_INTREE_ENV = XML_CATALOG_FILES="$(CURDIR)/publican-catalog"
PUBLICAN_INTREE_OPT = --brand_dir="$(top_srcdir)/publican-clusterlabs"
else
PUBLICAN_INTREE_DEPS =
PUBLICAN_INTREE_ENV =
PUBLICAN_INTREE_OPT =
endif
# Clusters From Scratch
CFS_SHARED_TXT = $(addprefix shared/en-US/,pacemaker-intro.txt)
CFS_SHARED_XML = $(CFS_SHARED_TXT:%.txt=%.xml)
CFS_TXT = $(wildcard Clusters_from_Scratch/en-US/*.txt)
CFS_XML_GEN = $(CFS_TXT:%.txt=%.xml)
CFS_XML_ONLY = $(addprefix $(srcdir)/Clusters_from_Scratch/en-US/,$(COMMON_XML) \
Clusters_from_Scratch.ent \
Clusters_from_Scratch.xml \
Preface.xml)
CFS_DEPS = $(PNGS) $(CFS_SHARED_XML) $(CFS_XML_ONLY) $(CFS_XML_GEN)
# We have to hardcode the book name
# With '%' the test for 'newness' fails
Clusters_from_Scratch.build: $(CFS_DEPS) $(PUBLICAN_INTREE_DEPS)
@echo Building $(@:%.build=%) because of $?
rm -rf $(@:%.build=%)/publish/* $(@:%.build=%)/tmp
$(AM_V_PUB)cd $(@:%.build=%) && RPM_BUILD_DIR="" $(PUBLICAN_INTREE_ENV) \
$(PUBLICAN) build --src_dir="$(srcdir)" --publish \
--langs="$(DOCBOOK_LANGS)" --formats="$(DOCBOOK_FORMATS)" \
$(PUBLICAN_INTREE_OPT) $(PCMK_quiet)
rm -rf $(@:%.build=%)/tmp
touch $@
# Pacemaker Development
PD_TXT = $(wildcard Pacemaker_Development/en-US/*.txt)
PD_XML_GEN = $(PD_TXT:%.txt=%.xml)
PD_XML_ONLY = $(addprefix $(srcdir)/Pacemaker_Development/en-US/,$(COMMON_XML) \
Pacemaker_Development.ent \
Pacemaker_Development.xml)
PD_DEPS = $(PD_XML_ONLY) $(PD_XML_GEN)
# We have to hardcode the book name
# With '%' the test for 'newness' fails
Pacemaker_Development.build: $(PD_DEPS) $(PUBLICAN_INTREE_DEPS)
@echo Building $(@:%.build=%) because of $?
rm -rf $(@:%.build=%)/publish/* $(@:%.build=%)/tmp
$(AM_V_PUB)cd $(@:%.build=%) && RPM_BUILD_DIR="" $(PUBLICAN_INTREE_ENV) \
$(PUBLICAN) build --publish --langs="$(DOCBOOK_LANGS)" \
--formats="$(DOCBOOK_FORMATS)" $(PUBLICAN_INTREE_OPT) $(PCMK_quiet)
rm -rf $(@:%.build=%)/tmp
touch $@
# Pacemaker Explained
PE_SHARED_TXT = $(addprefix shared/en-US/,pacemaker-intro.txt)
PE_SHARED_XML = $(PE_SHARED_TXT:%.txt=%.xml)
PE_TXT = $(wildcard Pacemaker_Explained/en-US/*.txt)
PE_XML_GEN = $(PE_TXT:%.txt=%.xml)
PE_XML_ONLY = $(addprefix $(srcdir)/Pacemaker_Explained/en-US/,$(COMMON_XML) \
Pacemaker_Explained.ent \
Pacemaker_Explained.xml \
Preface.xml)
PE_DEPS = $(PNGS) $(PE_SHARED_XML) $(PE_XML_ONLY) $(PE_XML_GEN)
# We have to hardcode the book name
# With '%' the test for 'newness' fails
Pacemaker_Explained.build: $(PE_DEPS) $(PUBLICAN_INTREE_DEPS)
@echo Building $(@:%.build=%) because of $?
rm -rf $(@:%.build=%)/publish/* $(@:%.build=%)/tmp
$(AM_V_PUB)cd $(@:%.build=%) && RPM_BUILD_DIR="" $(PUBLICAN_INTREE_ENV) \
$(PUBLICAN) build --src_dir="$(srcdir)" --publish \
--langs="$(DOCBOOK_LANGS)" --formats="$(DOCBOOK_FORMATS)" \
$(PUBLICAN_INTREE_OPT) $(PCMK_quiet)
rm -rf $(@:%.build=%)/tmp
touch $@
# Pacemaker Remote
PR_TXT = $(wildcard Pacemaker_Remote/en-US/*.txt)
PR_XML_GEN = $(PR_TXT:%.txt=%.xml)
PR_XML_ONLY = $(addprefix $(srcdir)/Pacemaker_Remote/en-US/,$(COMMON_XML) \
Pacemaker_Remote.ent \
Pacemaker_Remote.xml)
PR_DEPS = $(PR_XML_ONLY) $(PR_XML_GEN)
# We have to hardcode the book name
# With '%' the test for 'newness' fails
Pacemaker_Remote.build: $(PNGS) $(PR_DEPS) $(PUBLICAN_INTREE_DEPS)
@echo Building $(@:%.build=%) because of $?
rm -rf $(@:%.build=%)/publish/* $(@:%.build=%)/tmp
$(AM_V_PUB)cd $(@:%.build=%) && RPM_BUILD_DIR="" $(PUBLICAN_INTREE_ENV) \
$(PUBLICAN) build --src_dir="$(srcdir)" --publish \
--langs="$(DOCBOOK_LANGS)" --formats="$(DOCBOOK_FORMATS)" \
$(PUBLICAN_INTREE_OPT) $(PCMK_quiet)
rm -rf $(@:%.build=%)/tmp
touch $@
# Update the translation template
pot:
@for book in $(docbook); do \
echo "Updating translation templates in: $$book"; \
( cd $$book && RPM_BUILD_DIR="" \
$(PUBLICAN) --src_dir="$(srcdir)" update_pot ); \
done
# Update the actual translations
po: pot
@for book in $(docbook); do \
echo "Updating translations in: $$book"; \
( cd $$book && RPM_BUILD_DIR="" \
$(PUBLICAN) --src_dir="$(srcdir)" update_po \
--langs=all ); \
done
if BUILD_DOCBOOK
all-local: $(docbook_build) */publican.cfg
install-data-local: all-local
for book in $(docbook); do \
filelist=`find $$book/publish/* -print`; \
for f in $$filelist; do \
p=`echo $$f | sed s:publish/:: | sed s:Pacemaker/::`; \
if [ -d $$f ]; then \
$(INSTALL) -d -m 775 $(DESTDIR)$(docdir)/$$p; \
else \
$(INSTALL) -m 644 $$f $(DESTDIR)$(docdir)/$$p; \
fi \
done; \
done
endif
BRAND_DEPS = $(wildcard publican-clusterlabs/en-US/*.png) \
$(wildcard publican-clusterlabs/en-US/*.xml)
brand-build: $(BRAND_DEPS)
cd publican-clusterlabs && publican build --formats=xml --langs=all --publish
brand: brand-build
@echo "Installing branded content..."
cd publican-clusterlabs && sudo publican install_brand --path=$(datadir)/publican/Common_Content
brand-rpm-clean:
-find publican-clusterlabs -name "*.noarch.rpm" -exec rm -f \{\} \;
brand-rpm-build: brand-rpm-clean brand-build
cd publican-clusterlabs && \
$(PUBLICAN) --src_dir="$(srcdir)" package --binary
brand-rpm-install: brand-rpm-build
find publican-clusterlabs -name "*.noarch.rpm" -exec sudo rpm -Uvh --force \{\} \;
pdf:
make DOCBOOK_FORMATS="pdf" all-local
www: clean-local $(doc_DATA)
if BUILD_DOCBOOK
for book in $(docbook); do \
sed -i.sed 's@^brand:.*@brand: clusterlabs@' $$book/publican.cfg; \
done
endif
$(MAKE) DOCBOOK_FORMATS="pdf,html,html-single,epub" DOCBOOK_LANGS="$(DOCBOOK_LANGS)" all-local
@echo Uploading current $(PACKAGE_SERIES) documentation set to clusterlabs.org
if BUILD_DOCBOOK
@for book in $(docbook); do \
echo Uploading $$book...; \
echo "Generated on `date` from version: $(shell git log --pretty="format:%h %d" -n 1)" >> $$book/publish/build-$(PACKAGE_SERIES).txt; \
rsync $(RSYNC_OPTS) $$book/publish/* "$(RSYNC_DEST)/$(PACKAGE)/doc/"; \
done
endif
rsync $(RSYNC_OPTS) $(doc_DATA) "$(RSYNC_DEST)/$(PACKAGE)/doc/"
ALL_GEN = $(generated_docs) \
$(docbook_build) \
$(PNGS_GENERATED) \
$(SHARED_XML) \
$(CFS_XML_GEN) \
$(PD_XML_GEN) \
$(PE_XML_GEN) \
$(PR_XML_GEN) \
publican-catalog-fallback \
publican-catalog
clean-local: brand-rpm-clean
-rm -f $(ALL_GEN)
-for book in $(docbook); do \
rm -rf $$book/tmp $$book/publish; \
done