SHA256
1
0
forked from pool/gimp-help
gimp-help/Makefile.GNU

927 lines
29 KiB
Makefile
Raw Normal View History

########################################################################
#### Configuration (system-dependent) variables ####
########################################################################
CYGWIN = $(shell make.d/test/is_cygwin.sh || echo 0)
########################################################################
#### The GIMP manual languages ####
########################################################################
ALL_LINGUAS = da de en es fr it ja ko nl nn pl ru sv zh_CN
LANGUAGES = $(if $(LINGUAS),$(filter $(ALL_LINGUAS),$(LINGUAS)),$(ALL_LINGUAS))
ifneq ($(DOC_LINGUAS),)
$(warning Do not set the internal variable DOC_LINGUAS)
endif
DOC_LINGUAS = $(LINGUAS)
ifneq ($(XML_LANG),)
$(error You must not set the internal variable XML_LANG)
endif
ifneq ($(PO_LANGS),)
$(error You must not set the internal variable PO_LANGS)
endif
XML_LANG = en
PO_LANGS = $(filter-out $(XML_LANG), $(LANGUAGES))
########################################################################
#### External programs ####
########################################################################
XSLTPROC = xsltproc
XSLTFLAGS = --nonet
XMLLINT = xmllint
XMLLINTFLAGS = --nonet
XML2PO = tools/xml2po.py
XML2POFLAGS = --mode=gimphelp
MSGWIDTH = 79
MSGUNIQ = msguniq
MSGUNIQFLAGS =
MSGCAT = msgcat
MSGCATFLAGS = --width=$(MSGWIDTH)
MSGINIT = msginit
MSGINITFLAGS = --no-translator --width=$(MSGWIDTH)
MSGFMT = msgfmt
MSGFMTFLAGS = --check --use-fuzzy --statistics
MSGMERGE = msgmerge
MSGMERGEFLAGS = --quiet --width=$(MSGWIDTH)
DBLATEX = dblatex
DBLATEXFLAGS = --verbose
DOCBOOK2ODF = docbook2odf
DOCBOOK2ODFFLAGS =
SED = sed
# Standard shell commands
echo_n = echo -n
mkdir_p = mkdir -p
ln_s = ln -s
find_l = find -L
# Calling make recursively
RMAKE = $(MAKE) -f Makefile.GNU --no-print-directory
# Local (gimp-help-specific) tools
MAKE_IMAGE_LINKS = make.d/make_image_links.pl
MAKE_IMAGE_LINKS_FLAGS = -v
ifeq ($(CYGWIN),1)
MAKE_IMAGE_LINKS_FLAGS += --mode=hardlink,copy
endif
# FIXME/TODO:
# make it work with srcdir != builddir
# Directories
srcdir = .
builddir = .
abs_srcdir := $(shell cd $(srcdir) && pwd)
abs_builddir := $(shell pwd)
########################################################################
#### Files and directories ####
########################################################################
src_file_predicates = \
-name '*.xml' \
-not -name '$(notdir $(AUTHORS_DOCBOOK_XML))'
src_dir_predicates = -name images -prune -o -type d -print
pot_file_predicates = -type f
po_file_predicates = -type f -not -name "$(COMPENDIUM)"
xml_file_predicates = -name '*.xml'
# List of authors and contributors (no DocBook)
AUTHORS_SOURCE_XML = stylesheets/authors.xml
# Automatically generated authors section (DocBook)
AUTHORS_DOCBOOK_XML = src/preface/authors.xml
AUTHORS_DOCBOOK_DIRNAME = $(dir $(AUTHORS_DOCBOOK_XML))
AUTHORS_DOCBOOK_FILENAME = $(notdir $(AUTHORS_DOCBOOK_XML))
# Stylesheets generating AUTHORS
AUTHORS_TEXT_STYLESHEETS = \
stylesheets/authors_text.xsl \
stylesheets/authors_common.xsl
# Stylesheets generating src/preface/authors.xml
AUTHORS_DOCBOOK_STYLESHEETS = \
stylesheets/authors_docbook.xsl \
stylesheets/authors_common.xsl
# Stylesheet generating MAINTAINERS
DOAP_STYLESHEET = stylesheets/doap2text.xsl
# Targets which don't require source file list
QUICK_TARGETS = help clean dot image-% AUTHORS MAINTAINERS
# Files & directories
ifeq ($(filter $(QUICK_TARGETS),$(MAKECMDGOALS)),)
SRC_DIRS := $(shell cd $(srcdir) && $(find_l) src/ $(src_dir_predicates))
SRC_FILES := $(shell cd $(srcdir) && $(find_l) src/ $(src_file_predicates)) \
$(AUTHORS_DOCBOOK_XML)
else
SRC_DIRS = $(shell cd $(srcdir) && $(find_l) src/ $(src_dir_predicates))
SRC_FILES = $(shell cd $(srcdir) && $(find_l) src/ $(src_file_predicates)) \
$(AUTHORS_DOCBOOK_XML)
endif
# TODO
#HTML_STYLESHEETS = stylesheets/html*.xsl
HTML_STYLESHEETS = stylesheets/plainhtml.xsl stylesheets/htmlalternate.xsl
# This variable is used by "msgmerge";
# use empty variable to disable the compendium option
COMPENDIUM = Compendium.po
########################################################################
#### Control the amount of output messages ####
########################################################################
# Usage of the "msg" and "cmd" variables:
# In the command lines of the make rules, use
# $(msg) bla bla bla instead of @echo bla bla bla
# $(cmd) command args instead of @command args (or command args)
# then
# messages will be suppressed if VERBOSE=0,
# commands will be printed if VERBOSE=2.
VERBOSE = 1
ifeq ($(VERBOSE),0)
msg = @:
cmd = @
else
ifeq ($(VERBOSE),1)
msg = @echo
cmd = @
else
msg = @echo
cmd =
endif
endif
########################################################################
#### Functions ####
########################################################################
#--------------------------------------------------------------#
# The main functions used to transform #
# (a) XML files to POT files #
# (b) POT files to PO files #
# (c) XML and PO files to XML files #
#--------------------------------------------------------------#
# Create a PO-template (POT)
#
# Usage:
# $(call xml2pot,xml-files,pot-file)
# Parameters:
# $1 - input: original (untranslated) XML files
# and other prerequisites, e.g. images or "FORCE"
# $2 - output: POT template file containing translatable tags
xml2pot = $(XML2PO) $(XML2POFLAGS) --output='-' $(filter %.xml,$(1)) \
| $(MSGUNIQ) $(MSGUNIQFLAGS) \
| $(MSGCAT) $(MSGCATFLAGS) - > "$(2)"; \
test -s "$(2)" || rm -f "$(2)"; \
touch -c -r $(call get_recent_file,$(1)) "$(2)" || true; \
test -s "$(2)"
# Merge template (pot) and message catalog (po) or create a new catalog
#
# Usage:
# $(call pot2po,pot-file,language,po-file)
# Parameters:
# $1 - input POT file
# $2 - translation language
# $3 - output PO file
pot2po = with_compendium="$(shell $(call get_compendium,$3)) \
$(shell $(call use_gimp_po_files,$2))"; \
tmpfile=$(3).tmp; \
if [ -s $(3) ]; then \
$(MSGMERGE) $(MSGMERGEFLAGS) $${with_compendium} \
--output-file $${tmpfile} $(3) $(1); \
else \
$(MSGINIT) $(MSGINITFLAGS) --input $(1) --locale=$(2) --output=$(3); \
pofile=$(3); \
if [ -s $${pofile%/*}.po ]; then \
$(MSGMERGE) $(MSGMERGEFLAGS) $${with_compendium} \
--output-file $${tmpfile} $${pofile%/*}.po $(3); \
elif [ -n "$${with_compendium}" ]; then \
$(MSGMERGE) $(MSGMERGEFLAGS) $${with_compendium} \
--output-file $${tmpfile} $(3) $(1); \
else \
$(SED) -e '/Plural-Forms:/d' $(3) > $${tmpfile}; \
fi; \
fi; \
test -s $${tmpfile} && mv -f $${tmpfile} $(3) || rm -f $${tmpfile}; \
test -s $(3) && $(MSGFMT) $(MSGFMTFLAGS) $(3) || exit 70; \
rm -f messages.mo messages.gmo
# Merge PO file into (translated) XML file
#
# Usage:
# $(call po2xml,en-xml-file,po-file,language,translated-xml-file)
# Parameters:
# $1 - original (untranslated) XML file
# $2 - PO file containing translations
# $3 - translation language
# $4 - resulting (translated) XML file
ifneq ($(FORMAT_XML_WITH_XMLLINT),1)
po2xml = $(XML2PO) $(XML2POFLAGS) --po-file=$(2) --language=$(3) --output=$(4) $(1); \
rm -f .xml2po.mo
else
po2xml = ($(XML2PO) $(XML2POFLAGS) --po-file=$(2) --language=$(3) --output='-' $(1) \
| $(XMLLINT) $(XMLLINTFLAGS) --format --output $(4) -); \
rm -f .xml2po.mo
endif
#--------------------------------------------------------------#
# Helper functions #
#--------------------------------------------------------------#
make_target_dir = f=$(1); d=$${f%/*}; test -d $$d || $(mkdir_p) $$d
get_recent_file = $(shell ls -t $(1) | head -n 1)
copy = $(ln_s) $(abs_srcdir)/$(1) $(2)
ifneq ($(COMPENDIUM),)
get_compendium = \
file="$(1)"; dir=$${file%/*}; \
while true; do \
if test -f $${dir}/$(COMPENDIUM); then \
opt="$${opt} --compendium=$${dir}/$(COMPENDIUM)"; \
fi; \
case "$${dir}" in \
po|*/po) break;; \
*/*) dir="$${dir%/*}";; \
*) break;; \
esac; \
done; \
if test -n "$${opt}"; then echo $${opt}; fi
else
get_compendium =
endif
ifneq ($(GIMP_PO_ROOT),)
use_gimp_po_files = \
for po in $(GIMP_PO_ROOT)/po*/$(1).po; do \
if test -f "$${po}"; then echo '--compendium'="$${po}"; fi; \
done
else
use_gimp_po_files =
endif
########################################################################
#### Main targets ####
########################################################################
.PHONY: all
all: html index AUTHORS MAINTAINERS
########################################################################
#### Help!!! ####
########################################################################
.PHONY: help
make.help:
@echo >&2 'ERROR: cannot find the help file "$@"!'
@exit 66
# TODO?: replace with a "real" script (e.g. tools/make-help.sed)
# (probably "yes" if more features are needed...)
help: make.help
@$(SED) \
-e '### skip comments ###' \
-e '/^#/d' \
-e '### print if no "make" variable found ###' \
-e '/@/!b' \
-e '### replace "make" variables ###' \
-e 's/@LANGUAGES@/@$(strip $(LANGUAGES))@/' \
-e 's/@LINGUAS@/@$(strip $(LINGUAS))@/' \
-e 's/@ALL_LINGUAS@/@$(strip $(ALL_LINGUAS))@/' \
-e '### add commas ###' \
-e 'tloop' \
-e ':loop' \
-e ' ### mark value of variable (@@...@@) ###' \
-e ' s/@\([^@]*\)@/@@\1@@/' \
-e ' twhile' \
-e ' :while' \
-e ' s/\(@@[^,@]*\) \([^@]*@@\)/\1, \2/' \
-e ' twhile' \
-e ' s/@@\([^@]*\)@@/\1/' \
-e 'tloop' \
$<
########################################################################
#### Make AUTHORS and MAINTAINERS file ####
########################################################################
AUTHORS: $(AUTHORS_SOURCE_XML) $(AUTHORS_TEXT_STYLESHEETS)
$(msg) "[DOC] $@"
$(cmd) $(XSLTPROC) \
$(XSLTFLAGS) $(XSLTEXTRAFLAGS) \
$(srcdir)/stylesheets/authors_text.xsl \
$< \
> $@
$(AUTHORS_DOCBOOK_XML): $(AUTHORS_SOURCE_XML) $(AUTHORS_DOCBOOK_STYLESHEETS)
$(msg) "[SRC] $@"
$(cmd) $(call make_target_dir,$@)
$(cmd) $(XSLTPROC) \
$(XSLTFLAGS) $(XSLTEXTRAFLAGS) \
$(srcdir)/stylesheets/authors_docbook.xsl \
$< \
> $@
MAINTAINERS: gimp-help-2.doap $(DOAP_STYLESHEET)
$(msg) "[DOC] $@"
$(cmd) $(XSLTPROC) --output $@ $(XSLTFLAGS) $(XSLTEXTRAFLAGS) \
$(DOAP_STYLESHEET) $<
########################################################################
#### Make pot files: XML(en) --> POT ####
########################################################################
# src/path/to/file/*.xml --> pot/path/to/file.pot
POT_FILES = $(patsubst src/%,pot/%.pot,$(filter-out src src/,$(SRC_DIRS)))
# Special case: src/*.xml --> pot/gimp.pot
POT_FILES += pot/gimp.pot
# XXX: Secondary Expansion of the following two rules is required because
# "pot/%.pot: $(srcdir)/src/%/*.xml" didn't work with make v3.82
# (cf. bug #637505).
.SECONDEXPANSION:
# General case
ifeq ($(filter pot/%.pot po/%.po,$(MAKECMDGOALS)),)
pot/%.pot: src/$$*/*.xml $$(wildcard images/C/$$*/*.*)
else
pot/%.pot: src/$$*/*.xml FORCE
endif
$(cmd) $(call make_target_dir,$@)
$(msg) "[POT] $@"
$(cmd) $(call xml2pot,$^,$@)
# Special case: rename pot file for toplevel xml files
ifeq ($(filter pot/%.pot po/%.po,$(MAKECMDGOALS)),)
pot/gimp.pot: src/*.xml $(wildcard images/C/*.*)
else
pot/gimp.pot: src/*.xml FORCE
endif
$(cmd) $(call make_target_dir,$@)
$(msg) "[POT] $@"
$(cmd) $(call xml2pot,$^,$@)
# Special case: pot file for the authors DocBook file
# requires an additional prerequisite
AUTHORS_POT = $(AUTHORS_DOCBOOK_XML:src/%/$(AUTHORS_DOCBOOK_FILENAME)=pot/%.pot)
ifeq ($(filter pot/%.pot po/%.po,$(MAKECMDGOALS)),)
# TODO: add images to prerequisites if necessary
$(AUTHORS_POT): $(AUTHORS_DOCBOOK_XML) $(wildcard $(AUTHORS_DOCBOOK_DIRNAME)*.xml)
else
$(AUTHORS_POT): $(AUTHORS_DOCBOOK_XML) $(wildcard $(AUTHORS_DOCBOOK_DIRNAME)*.xml) FORCE
endif
$(cmd) $(call make_target_dir,$@)
$(msg) "[POT] $@"
$(cmd) $(call xml2pot,$^,$@)
# Remove left over pot files
cleanup-pot:
$(msg) "Cleaning up pot files ..."
$(cmd) $(find_l) pot/ $(pot_file_predicates) | \
while read potfile; do \
potfile=$${potfile#pot/}; srcfile=src/$${potfile%.pot}.xml \
test -e $${srcfile} || rm -f $${potfile}; \
done
# Targets suitable for command line
pot: potfiles cleanup-pot ;
potfiles: $(POT_FILES) ;
.PHONY: pot potfiles cleanup-pot
########################################################################
#### Make po files: POT --> PO ####
########################################################################
define MAKE_PO_RULES
$(1)_PO_FILES = $$(patsubst pot/%.pot, po/$(1)/%.po, $$(POT_FILES))
ifeq ($$(filter po/$(1)/%.po,$$(MAKECMDGOALS)),)
$$($(1)_PO_FILES): po/$(1)/%.po : pot/%.pot
else
$$($(1)_PO_FILES): po/$(1)/%.po : pot/%.pot FORCE
endif
$$(cmd) $$(call make_target_dir,$$@)
$$(msg) "[PO] $$@"
$$(cmd) if test -s $$<; then $$(call pot2po,$$<,$(1),$$@); else touch $$@; fi
po-$(1): $$($(1)_PO_FILES) cleanup-po-$(1)
$$(cmd) if test -e messages.mo; then rm -f messages.mo; fi
cleanup-po-$(1):
$$(msg) "Cleaning up '$(1)' po files ..."
$$(cmd) $(find_l) po/$(1)/ $$(po_file_predicates) | \
while read pofile; do \
potfile=pot/$$$${pofile#po/$(1)/}t; \
test -e $$$${potfile} || rm -vf $$$${pofile}; \
done
endef
$(foreach LANG,$(PO_LANGS),$(eval $(call MAKE_PO_RULES,$(LANG))))
# Special case 'en': do nothing :-)
po-en: ;
# Print translation statistics
status-%: po-status-% ;
po-status-%: po-%
$(cmd) perl tools/get_po_status.pl po/$*
status-all: po-status-all ;
po-status-all:
$(cmd) for podir in po/*; do \
perl tools/get_po_status.pl --nofiles --nosummary $${podir} || break; \
done
todo-%: po-todo-% ;
po-todo-%: po-%
$(cmd) perl tools/get_po_status.pl --todo po/$*
# Force updating po file(s)
force-po/%:
$(cmd) $(RMAKE) po/$*/*.po
# Main commandline target
po: $(foreach LANG,$(PO_LANGS),po-$(LANG)) ;
.PHONY: po po-% cleanup-po-% todo-% po-todo-% po-status-%
########################################################################
#### Generate XML prerequisites ####
########################################################################
ifeq ($(filter $(QUICK_TARGETS),$(MAKECMDGOALS)),)
include $(foreach LANG,$(PO_LANGS),xml/$(LANG)/.deps.mk)
endif
# The dynamically generated and updated ".deps.mk" files contain
# rules to register the po prereqisite for every xml file, e.g.
# xml/LANG/*.xml: po/LANG/gimp.po
# xml/LANG/filters/*.xml: po/LANG/filters.po
# xml/LANG/filters/generic/*.xml: po/LANG/filters/generic.po
# etc.
#xml/$(1)/.deps.mk: $(AUTHORS_DOCBOOK_XML) $$($(1)_PO_FILES)
# TODO: simplify
define MAKE_DEP_RULES
xml/$(1)/.deps.mk: $(AUTHORS_DOCBOOK_XML) $$(SRC_FILES)
$$(cmd) $$(call make_target_dir,$$@)
$$(msg) "[DEP] $$@"
$$(cmd) touch $$@
$$(cmd) for srcdir in $(SRC_DIRS); do \
ls $$$${srcdir}/*.xml >/dev/null 2>&1 || continue; \
srcdir=$$$${srcdir%/}; \
xmldir=xml/$(1)$$$${srcdir#src}; \
test "$$$${srcdir}" != "src" || srcdir="src/gimp"; \
pofile=po/$(1)$$$${srcdir#src}.po; \
echo "$$$${xmldir}/*.xml: $$$${pofile}"; \
done > $$@
endef
$(foreach LANG,$(PO_LANGS),$(eval $(call MAKE_DEP_RULES,$(LANG))))
########################################################################
#### Make XML files: PO --> XML(non-en) ####
########################################################################
# TODO: check xml/$(1) vs. xml-$(1) prerequisites (XML_FILES)
define MAKE_XML_RULES
$(1)_XML_FILES = $$(SRC_FILES:src/%=xml/$(1)/%)
xml/$(1)/%.xml:
$$(msg) "[XML] $$@"
$$(cmd) $$(call make_target_dir,$$@)
$$(cmd) xmlfile=$$@; \
stem=$$*; \
srcfile=src/$$$${stem}.xml; \
test "$$$${stem}" != "$$$${stem%/*}" && stem=$$$${stem%/*} || stem=gimp; \
pofile=po/$(1)/$$$${stem}.po; \
test -e "$$$${pofile}" || $$(RMAKE) "$$$${pofile}"; \
$(call po2xml,$$$${srcfile},$$$${pofile},$(1),$$@)
# This is indirectly used as HTML and PDF prerequisite:
xml/$(1): $$($(1)_XML_FILES) | xml/$(1)/images
$$(cmd) test -d $$@ && touch $$@ || $(mkdir_p) $$@
# Targets suitable for command line
xml-$(1): po-$(1) xml/$(1) cleanup-xml-$(1) ;
endef
$(foreach LANG,$(PO_LANGS),$(eval $(call MAKE_XML_RULES,$(LANG))))
# Special case: en
en_XML_FILES = $(SRC_FILES:src/%=xml/en/%)
$(en_XML_FILES): xml/en/%.xml : src/%.xml
$(msg) "[XML] $@ (copy)"
$(cmd) $(call make_target_dir,$@)
$(cmd) cp -f $< $@
xml/en: $(en_XML_FILES) | xml/en/images
$(cmd) test -d $@ && touch $@ || $(mkdir_p) $@
xml-en: xml/en cleanup-xml-en ;
# Images
ifeq ($(MAKE_IMAGES), lazy)
# fast and lazy: detect added or removed images, but may miss changed images
IMAGE_PREREQ = $(shell cd $(srcdir) && $(find_l) images/common images/C -type d)
else ifeq ($(MAKE_IMAGES), force)
# just in case: always update images
IMAGE_PREREQ = FORCE
else
# strict (default): detects added, removed, or changed images
IMAGE_PREREQ = $(shell cd $(srcdir) && $(find_l) images/common images/C)
endif
xml/%/images: $(IMAGE_PREREQ)
$(cmd) test -d $@ && rm -rf $@/* || $(mkdir_p) $@
$(cmd) $(echo_n) "Copying images ($*) ..."
$(cmd) perl $(MAKE_IMAGE_LINKS) $(MAKE_IMAGE_LINKS_FLAGS) \
images/common images/C xml/$*
$(cmd) touch $@
# Remove left over xml files
cleanup-xml-%:
$(msg) "Cleaning up '$*' xml files ..."
$(cmd) $(find_l) xml/$*/ $(xml_file_predicates) | \
while read xmlfile; do \
test -e src/$${xmlfile#xml/$*/} || rm -vf $${xmlfile}; \
done
# Command-line targets
xml: $(foreach LANG,$(LANGUAGES),xml-$(LANG)) ;
images-%: xml/%/images html/%/images ;
.PRECIOUS: xml/%/images
.PHONY: xml xml-% images-%
########################################################################
#### XML validation ####
########################################################################
validate: validate-en ;
validate-%: xmllint-% ;
xmllint: xmllint-en ;
xmllint-%: log/%-xmllint.log
$(cmd) test -s $< && cat $<
define MAKE_XMLLINT_RULES
log/$(1)-xmllint.log: $$($(1)_XML_FILES)
$$(cmd) $$(call make_target_dir,$$(@))
$$(cmd) if type $$(XMLLINT) >/dev/null 2>&1; then \
echo "*** Validating XML ($(1)) ... "; \
$$(XMLLINT) $$(XMLLINTFLAGS) --xinclude xml/$(1)/gimp.xml \
| $$(SED) -e 's,xmlns:xi="http://www.w3.org/2001/XInclude",,' \
| $$(XMLLINT) $$(XMLLINTFLAGS) --valid \
--output log/$(1).xml - 2>$$(@); \
if test -s $$(@); then \
echo "(You will find log and xml files in log/.)"; \
else \
echo "$(1): no errors."; \
rm -f log/$(1).xml; \
fi >> $$(@); \
else \
echo >&2 "*** Validating '$(1)' skipped: 'xmllint' not found."; \
fi
endef
$(foreach LANG,$(LANGUAGES),$(eval $(call MAKE_XMLLINT_RULES,$(LANG))))
log:
$(cmd) mkdir $@ && test -w $@
########################################################################
#### Make XSL styesheets for HTML ####
########################################################################
# TODO
stylesheets/plainhtml.xsl: stylesheets/plainhtml.xsl.in
$(msg) "[XSL] $@"
$(cmd) $(SED) -e s,@STYLEBASE@,http://docbook.sourceforge.net/release/xsl/current, $< > $@
stylesheets/htmlalternate.xsl: stylesheets/htmlalternate.xsl.in
$(msg) "[XSL] $@"
$(cmd) cp $< $@
########################################################################
#### Make HTML files: XML --> HTML ####
########################################################################
# Main commandline targets
html-%: xml-% html/%/index.html html/%/gimp-help.xml ;
html: $(foreach lang,$(LANGUAGES),html-$(lang)) ;
# Making the main HTML file (side effect: make gimp-xrefs.xml)
html/%/index.html: xml/% $(HTML_STYLESHEETS) | html/%/images
$(msg) "*** Making html for $* ... "
$(cmd) rm -f html/$*/*.*
$(cmd) $(XSLTPROC) \
$(XSLTFLAGS) $(XSLTEXTRAFLAGS) \
--xinclude \
--stringparam l10n.gentext.default.language $* \
-o html/$*/ \
stylesheets/plainhtml.xsl \
xml/$*/gimp.xml
$(msg) "Copying stylesheets ... "
$(cmd) for file in $(srcdir)/stylesheets/*.css \
$(srcdir)/stylesheets/$*/*.css; do \
if [ -f $${file} ]; then cp -f $${file} html/$*; fi; \
done
### Cross references & context help ###
index: $(foreach lang,$(LANGUAGES),index-$(lang)) ;
index-%: html/%/gimp-help.xml ;
html/%/gimp-help.xml: html/%/gimp-xrefs.xml stylesheets/makeindex.xsl
$(cmd) $(XSLTPROC) \
$(XSLTFLAGS) $(XSLTEXTRAFLAGS) \
$(srcdir)/stylesheets/makeindex.xsl \
$< \
> $@
# The xrefs file is a side effect of the HTML build
html/%/gimp-xrefs.xml: html/%/index.html
$(cmd) touch $@
### HTML images ###
ifneq ($(CYGWIN),1)
html/%/images: xml/%/images
$(cmd) test -d html/$* || $(mkdir_p) html/$*
$(cmd) test -e $@ || $(ln_s) ../../$< $@
else
html/%/images: $(IMAGE_PREREQ)
$(cmd) if test -h $@; then rm -f $@; fi
$(cmd) test -d $@ && rm -rf $@/* || $(mkdir_p) $@
$(cmd) $(echo_n) "Copying HTML images ($*) ..."
$(cmd) perl $(MAKE_IMAGE_LINKS) $(MAKE_IMAGE_LINKS_FLAGS) \
images/common images/C $@
$(cmd) touch $@
endif
.PRECIOUS: \
html/%/index.html \
html/%/gimp-help.xml \
html/%/gimp-xrefs.xml \
html/%/images
.PHONY: html html-% index index-%
########################################################################
#### Make HTML draft (single page preview) ####
########################################################################
preview-xml/%.xml: xml/%.xml stylesheets/drafthtml.xsl
$(cmd) id=`$(SED) -e 's/.*id=.//' -e tmatch \
-e d -e :match \
-e 's/["'"'"'].*//' \
-e q $<`; \
test -n "$${id}" || id=noname; \
lang=$(shell echo $< | $(SED) -e 's,^xml/,,; s,/.*,,'); \
destdir=html/$${lang}; \
test -d $${destdir}/images || $(RMAKE) $${destdir}/images; \
cp -f $(srcdir)/stylesheets/*.css $(srcdir)/stylesheets/$${lang}/*.css\
$${destdir} 2>/dev/null; \
destfile="$${destdir}/$${id}-draft.html"; \
echo "Making $${destfile} (ignore any XSLT complaints) ..."; \
$(XSLTPROC) \
$(XSLTFLAGS) $(XSLTEXTRAFLAGS) \
--xinclude \
--stringparam l10n.gentext.default.language $${lang} \
--output $${destfile} \
$(srcdir)/stylesheets/drafthtml.xsl \
$<
preview-src/%.xml: $(foreach lang,$(LANGUAGES),preview-xml/$(lang)/%.xml)
$(msg) "(Remember that links won't work in a draft file.)"
preview-po/%.po:
@echo >&2 "After merging pofiles this feature does not work any more."
@echo >&2 "Use 'make ... preview-xml/$*.xml'."
# For backward compatibility:
xml/%.draft: preview-xml/%.xml
$(msg) "(Remember that links won't work in a draft file.)"
src/%.draft: preview-src/%.xml ;
# Synonyms
draft-xml/%.xml: preview-xml/%.xml ;
draft-src/%.xml: preview-src/%.xml ;
draft-po/%.po: preview-po/%.po ;
########################################################################
#### Make PDF files: XML --> PDF ####
########################################################################
ifneq ($(DBLATEX),)
pdf: $(foreach lang,$(LANGUAGES),pdf-$(lang)) ;
pdf-%: pdf/%/gimp.pdf ;
# TODO: check prerequisites, e.g. images (--fig-path option?)
pdf/%/gimp.pdf: xml/% stylesheets/plainprint.xsl xml/%/images
$(cmd) if test -f pdf/%.pdf; then rm -f pdf/%.pdf; fi
$(cmd) test -d pdf/$* || $(mkdir_p) pdf/$*
$(msg) "*** Making PDF ($*) ..."
$(cmd) $(DBLATEX) $(DBLATEXFLAGS) $(DBLATEXEXTRAFLAGS) \
--xsl-user=$(srcdir)/stylesheets/plainprint.xsl \
--output=$@ \
xml/$*/gimp.xml
.PRECIOUS: pdf/%/gimp.pdf
else
pdf pdf-%:
@echo "*** Cannot build PDFs because DBLATEX was not defined ***"
@exit 69
endif
########################################################################
#### Make ODF files: XML --> ODF ####
########################################################################
ifneq ($(DOCBOOK2ODF),)
odf: $(foreach lang,$(LANGUAGES),odf-$(lang)) ;
odf-%: odf/%/gimp.odt ;
# TODO?: images
odf/%/gimp.odt: xml/%/gimp-alldocs.xml xml/%/images
$(cmd) if test -f odf/%.odt; then rm -f odf/%.odt; fi
$(cmd) test -d odf/$* || $(mkdir_p) odf/$*
$(msg) "*** Making ODF ($*) ..."
$(cmd) $(DOCBOOK2ODF) $(DOCBOOK2ODFFLAGS) \
--debug -v \
--output-dir=`pwd` \
--output-file=$@ \
$<
# make temporary XML source file with all Xincludes resolved
# TODO: find out how to avoid this
xml/%/gimp-alldocs.xml: xml/%/gimp.xml
$(msg) "*** Merging XML ..."
$(cmd) $(XMLLINT) $(XMLLINTFLAGS) --xinclude --output $@ $<
.PRECIOUS: odf/%/gimp.odt
else
odf odf-%:
@echo "*** Cannot build ODFs because DOCBOOK2ODF was not defined ***"
@exit 69
endif
########################################################################
#### Make language-specific HTML tarballs ####
########################################################################
tarball_prefix = gimp-help-2-html
tarball_dir = gimp-help-2
HTMLMETAFILES = README AUTHORS COPYING MAINTAINERS
$(tarball_prefix)-%.tar: html/%/index.html html/%/gimp-help.xml \
$(HTMLMETAFILES) make.d/Makefile.html-package
$(msg) "Making $@ ..."
$(cmd) test ! -d $(tarball_dir)
$(cmd) $(mkdir_p) $(tarball_dir)/html
$(cmd) cd $(tarball_dir)/html && $(ln_s) ../../html/$* .
$(cmd) cp $(HTMLMETAFILES) $(tarball_dir)/
$(cmd) cp make.d/INSTALL.html-package $(tarball_dir)/INSTALL
$(cmd) $(SED) -e '/LANGUAGE *=/s/en/$*/' \
make.d/Makefile.html-package > $(tarball_dir)/Makefile
$(cmd) tar -chf $@ $(tarball_dir)/
$(cmd) rm -rf $(tarball_dir)
$(tarball_prefix)-%.tar.gz: $(tarball_prefix)-%.tar
$(msg) "Making $@ ..."
$(cmd) gzip -c9 $< > $@
$(tarball_prefix)-%.tar.bz2: $(tarball_prefix)-%.tar
$(msg) "Making $@ ..."
$(cmd) bzip2 -c9 $< > $@
$(tarball_prefix)-%.tar.xz: $(tarball_prefix)-%.tar
$(msg) "Making $@ ..."
$(cmd) xz -c9 $< > $@
$(tarball_prefix)-%.zip: $(tarball_prefix)-%.tar
$(msg) "Making $@ ..."
$(cmd) rm -rf $(tarball_dir)/html
$(cmd) $(mkdir_p) $(tarball_dir)/html
$(cmd) cd $(tarball_dir)/html && $(ln_s) ../../html/$* .
$(cmd) zip -9rq $@ $(tarball_dir)/html
$(cmd) rm -rf $(tarball_dir)
########################################################################
#### Clean up ####
########################################################################
clean:
$(cmd) for dir in pot xml log html pdf odf; do \
test -d $${dir} || continue; \
echo "Removing $${dir} ..."; \
rm -rf $${dir}; \
done
$(cmd) for f in AUTHORS $(AUTHORS_DOCBOOK_XML) build-system.*; do \
test -f $${f} || continue; \
echo "Removing $${f} ..."; \
rm -f $${f}; \
done
dist-clean: clean ;
.PHONY: clean dist-clean
########################################################################
#### Source file checks ####
########################################################################
check: checks ;
checks: check-image-references ;
check-images: check-image-references ;
check-image-references:
$(cmd) if cd $(srcdir) && test -e tools/validate_references.py && \
type python >/dev/null 2>&1; then \
echo "*** Checking image references ... "; \
python tools/validate_references.py \
--verbose --broken --orphaned \
$(VALIDATEREFERENCESFLAGS); \
else \
echo >&2 "*** Cannot check image references (no Python installed?) ***"; \
fi
check-images-%: FORCE
$(cmd) $(RMAKE) check-image-references \
VALIDATEREFERENCESFLAGS="--imgdir=images/C,images/$*"
check-image-resolutions-%:
$(cmd) /bin/sh tools/check_image_resolutions.sh images/$*
# special case 'en':
check-images-en check-images-C: check-image-references ;
check-image-resolutions-en: check-image-resolutions-C ;
.PHONY: checks check-image-references check-image-resolutions-%
########################################################################
#### Build system development & debugging ####
########################################################################
build-system.svg: make.d/build-system.dot
$(cmd) if type dot >/dev/null; then \
dot -Tsvg -o $@ $<; \
fi
dot: build-system.svg
$(cmd) if test -e $<; then \
if type display >/dev/null; then \
display $<; \
elif type xv >/dev/null; then \
xv $<; \
fi; \
fi
########################################################################
#### Special targets ####
########################################################################
FORCE: ;
.PHONY: FORCE
# Delete the default suffix rules
.SUFFIXES: