1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
|
# Build rules for Developers Reference.
#
# This build script works on the bare un-tared upstream tarball, the
# checked-out git repository, and the patch-applied Debian source package
# source tree.
# Basic package information
ifneq ("$(wildcard debian/changelog)","")
# Patch-applied Debian source package source tree
PACKAGE := $(shell dpkg-parsechangelog -SSource)
TIMESTAMP := $(shell dpkg-parsechangelog -STimestamp)
DATE := $(shell date -u -d '@$(TIMESTAMP)' +'%Y-%m-%d')
VERSION := $(shell dpkg-parsechangelog -SVersion)
else ifneq ("$(wildcard .git)","")
# Checked-out git repository
PACKAGE := $(basename $(notdir $(shell git config --get remote.origin.url)))
TIMESTAMP := $(shell git show -s --format=%ct HEAD)
DATE := $(shell date -u -d '@$(TIMESTAMP)' +'%Y-%m-%d')
# Adjust version as needed: debian/% --> %
VERSION := $(patsubst debian/%, %, $(shell git describe --tags))
else
# Un-tared upstream tarball
PACKAGE := $(notdir $(CURDIR))
TIMESTAMP := $(shell date +%s)
DATE := $(shell date -u -d '@$(TIMESTAMP)' +'%Y-%m-%d')
VERSION := 0.0~$(subst -,.,$(DATE))
endif
export PACKAGE TIMESTAMP DATE VERSION
# Source file directory
SOURCE_DIR = source
# Building files under language specific subdirectories of $(BUILD_DIR)
BUILD_DIR = build
# Match this with conf.py: locale_dir = ["locales"]
LOCALE_DIR = locales
# All languages
LANGS ?= en $(notdir $(wildcard $(SOURCE_DIR)/$(LOCALE_DIR)/*))
# All languages without PDF building
LANGS_NOPDF =
# All output formats
FORMATS ?= text pdf nopdf epub info html singlehtml
# Conversion programs to use. Export these so that they're visible to
# submakes.
export SPHINX = sphinx-build
export SPHINXINTL = sphinx-intl
# Installation directories. Normally this is only used by debian/rules
# build, which will set DESTDIR to put the installation under the temporary
# Debian packaging directory.
prefix = /usr
datarootdir = $(prefix)/share
datadir = $(datarootdir)/$(PACKAGE)
infodir = $(datarootdir)/info
# Order of source file basenames in $(SOURCE_DIR)/index.rst
BASE_ORDER := $(shell grep -e '^ [^:]' $(SOURCE_DIR)/index.rst)
# Source file basenames found as *.rst
BASE_FILTER := $(basename $(notdir $(wildcard $(SOURCE_DIR)/*.rst)))
# Ordered source *.rst file basenames to build $(PACKAGE)
BASE_FILES := $(filter $(BASE_FILTER), $(BASE_ORDER))
SOURCE_FILES := $(foreach f,$(BASE_FILES), \
$(SOURCE_DIR)/$(f).rst) \
$(SOURCE_DIR)/conf.py
PO_FILES := $(foreach l,$(filter-out en,$(LANGS)), \
$(foreach f,$(BASE_FILES), \
$(SOURCE_DIR)/$(LOCALE_DIR)/$(l)/LC_MESSAGES/$(f).po))
# General build targets. These are the ones a human may build from the
# command line, or that are used by the Debian build system.
#
# Checks for PO files are skipped since $(SPHINX) takes care of them.
#
all: $(FORMATS)
# A list of plain text files for all $(LANGS)
TEXT_FILES := $(foreach l,$(LANGS), \
$(BUILD_DIR)/$(l)/text/$(PACKAGE).txt)
text: $(TEXT_FILES)
# Somehow -M doesn't work well, so use -b
$(BUILD_DIR)/%/text/$(PACKAGE).txt: $(SOURCE_FILES)
rm -f $@
$(SPHINX) -b text -D language=$* -d $(BUILD_DIR)/$* $(SOURCE_DIR) $(@D)
# Make $(PACKAGE).txt
cp $(@D)/index.txt $@
set -e; \
for f in $(BASE_FILES); do \
printf "\n\n\n" >>$@; \
cat $(@D)/"$$f".txt >>$@; \
done
# A list of PDF files for all valid languages
PDF_FILES := $(foreach l,$(filter-out $(LANGS_NOPDF),$(LANGS)), \
$(BUILD_DIR)/$(l)/pdf/$(PACKAGE).pdf)
pdf: $(PDF_FILES)
# Somehow -M doesn't work well, so use -b
$(BUILD_DIR)/%/pdf/$(PACKAGE).pdf: $(SOURCE_FILES)
$(SPHINX) -b latex -D language=$* -d $(BUILD_DIR)/$* $(SOURCE_DIR) $(@D)
$(MAKE) -C $(@D)
# A list of place-holder PDF files for all non-valid languages
NOPDF_FILES := $(foreach l,$(LANGS_NOPDF), \
$(BUILD_DIR)/$(l)/nopdf/$(PACKAGE).pdf)
nopdf: $(NOPDF_FILES)
# Build nopdf place holder PDF files with latexmk
$(BUILD_DIR)/%/nopdf/$(PACKAGE).pdf: nopdf.tex
mkdir -p $(@D)
sed -e "s/@lang@/$*/g" nopdf.tex >$(@D)/nopdf.tex
set -e; cd $(@D); latexmk -pdf -dvi- -ps- $<
mv $(@D)/nopdf.pdf $(@)
# A list of epub files for all $(LANGS)
EPUB_FILES := $(foreach l,$(LANGS), \
$(BUILD_DIR)/$(l)/epub/$(PACKAGE).epub)
epub: $(EPUB_FILES)
# Somehow -M doesn't work well, so use -b
$(BUILD_DIR)/%/epub/$(PACKAGE).epub: $(SOURCE_FILES)
$(SPHINX) -b epub -c epub.conf -D html_theme=nature -D language=$* -d $(BUILD_DIR)/$* $(SOURCE_DIR) $(@D)
# A list of info files for all $(LANGS)
# Please note, translated info files are installed as $(PACKAGE)-$(l).info:
INFO_FILES := $(foreach l,$(filter-out en,$(LANGS)), \
$(BUILD_DIR)/info/$(PACKAGE)-$(l).info) \
$(BUILD_DIR)/info/$(PACKAGE).info
info: $(INFO_FILES)
# Somehow -M doesn't work well, so use -b
$(BUILD_DIR)/%/info/$(PACKAGE).info: $(SOURCE_FILES)
$(SPHINX) -b texinfo -D language=$* -d $(BUILD_DIR)/$* $(SOURCE_DIR) $(@D)
$(MAKE) -C $(@D)
$(BUILD_DIR)/info/$(PACKAGE).info: $(BUILD_DIR)/en/info/$(PACKAGE).info
mkdir -p $(@D)
cp $< $@
$(BUILD_DIR)/info/$(PACKAGE)-%.info: $(BUILD_DIR)/%/info/$(PACKAGE).info
mkdir -p $(@D)
cp $< $@
# A list of index.html files of multi-file HTML for all $(LANGS)
HTMLI_FILES := $(foreach l,$(LANGS), \
$(BUILD_DIR)/$(l)/html/index.html)
html: $(HTMLI_FILES)
# Somehow -M doesn't work well, so use -b
$(BUILD_DIR)/%/html/index.html: $(SOURCE_FILES)
$(SPHINX) -b html -D language=$* -d $(BUILD_DIR)/$* $(SOURCE_DIR) $(@D)
# A list of all multi-file HTML files for all $(LANGS)
HTMLM_FILES := $(foreach l,$(LANGS), \
$(foreach f,$(BASE_FILES), \
$(BUILD_DIR)/$(l)/html/$(f).html))
# A list of multi-file HTML index.html files for all $(LANGS)
HTMLS_FILES := $(foreach l,$(LANGS), \
$(BUILD_DIR)/$(l)/singlehtml/$(PACKAGE).html)
singlehtml: $(HTMLS_FILES)
# Single HTML doesn't build its own genindex.html nor search.html
# I keep this code inspired by Debian Policy as a place holder
$(BUILD_DIR)/%/singlehtml/$(PACKAGE).html: $(SOURCE_FILES)
$(SPHINX) -b singlehtml -D language=$* -d $(BUILD_DIR)/$* $(SOURCE_DIR) $(@D)
mv $(@D)/index.html $(@D)/$(PACKAGE).html
rm -rf $(@D)/.doctrees
perl -pli -e 's,href="index\.html#,href="#,g' $@
# perl -pli -e 's,(genindex|search)\.html,$(PACKAGE).html/$$1.html,' $@
#
# Update all PO files for all languages
#
# In the following, export UTF-8 locale variables to avoid gettext errors.
# Don't simply export at the top of this Makefile to avoid affecting
# the generated localized .js files.
#
# Somehow -M doesn't work well, so use -b
update-po: $(SOURCE_FILES)
# Let's keep POT files next to PO files
$(SPHINX) -b gettext -d $(BUILD_DIR)/en $(SOURCE_DIR) $(SOURCE_DIR)/$(LOCALE_DIR)
@set -ex; for l in $(filter-out en,$(LANGS)); do \
LC_ALL=C.UTF-8 LANG=C.UTF-8 $(SPHINXINTL) update \
-d $(SOURCE_DIR)/$(LOCALE_DIR) \
-p $(SOURCE_DIR)/$(LOCALE_DIR) -l $$l ; \
done
@echo "Please use 'Update all .po files for changed strings in the English original.' as commit message when committing this to GIT."
# Show translation status
status:
for l in $(filter-out en,$(LANGS)); do \
if [ -d $(SOURCE_DIR)/locales/$$l/LC_MESSAGES ] ; then \
echo -n "Stats for $$l: " ; \
msgcat --use-first $(SOURCE_DIR)/locales/$$l/LC_MESSAGES/*.po | msgfmt --statistics - 2>&1 ; \
fi ; \
done
# Clean source tree
clean distclean:
rm -rf $(BUILD_DIR)
rm -f $(SOURCE_DIR)/$(LOCALE_DIR)/*.pot
rm -f $(SOURCE_DIR)/$(LOCALE_DIR)/*/LC_MESSAGES/*.mo
install: all
# Install onto DESTDIR='$(DESTDIR)' for en: text pdf nopdf epub html
mkdir -p $(DESTDIR)$(datadir)
[ -e $(BUILD_DIR)/en/text/$(PACKAGE).txt ] && \
cp $(BUILD_DIR)/en/text/$(PACKAGE).txt $(DESTDIR)$(datadir) && \
gzip -f -9 $(DESTDIR)$(datadir)/$(PACKAGE).txt || true
[ -e $(BUILD_DIR)/en/pdf/$(PACKAGE).pdf ] && \
cp $(BUILD_DIR)/en/pdf/$(PACKAGE).pdf $(DESTDIR)$(datadir) || true
[ -e $(BUILD_DIR)/en/nopdf/$(PACKAGE).pdf ] && \
cp $(BUILD_DIR)/en/nopdf/$(PACKAGE).pdf $(DESTDIR)$(datadir) || true
[ -e $(BUILD_DIR)/en/epub/$(PACKAGE).epub ] && \
cp $(BUILD_DIR)/en/epub/$(PACKAGE).epub $(DESTDIR)$(datadir) || true
[ -d $(BUILD_DIR)/en/html ] && \
cp -dfR $(BUILD_DIR)/en/html/* $(DESTDIR)$(datadir) || true
# Install onto DESTDIR='$(DESTDIR)' for non-en: text pdf nopdf epub html
@set -ex; for l in $(filter-out en,$(LANGS)); do \
mkdir -p $(DESTDIR)$(datadir)/$$l ; \
[ -e $(BUILD_DIR)/$$l/text/$(PACKAGE).txt ] && \
cp $(BUILD_DIR)/$$l/text/$(PACKAGE).txt $(DESTDIR)$(datadir)/$$l && \
gzip -f -9 $(DESTDIR)$(datadir)/$$l/$(PACKAGE).txt || true ; \
[ -e $(BUILD_DIR)/$$l/pdf/$(PACKAGE).pdf ] && \
cp $(BUILD_DIR)/$$l/pdf/$(PACKAGE).pdf $(DESTDIR)$(datadir)/$$l || true ; \
[ -e $(BUILD_DIR)/$$l/nopdf/$(PACKAGE).pdf ] && \
cp $(BUILD_DIR)/$$l/nopdf/$(PACKAGE).pdf $(DESTDIR)$(datadir)/$$l || true ; \
[ -e $(BUILD_DIR)/$$l/epub/$(PACKAGE).epub ] && \
cp $(BUILD_DIR)/$$l/epub/$(PACKAGE).epub $(DESTDIR)$(datadir)/$$l || true ; \
[ -d $(BUILD_DIR)/$$l/html ] && \
cp -dfR $(BUILD_DIR)/$$l/html/* $(DESTDIR)$(datadir)/$$l || true ; \
done
# For info
mkdir -p $(DESTDIR)$(infodir)
@set -ex; for f in $(INFO_FILES); do \
[ -e $$f ] && cp -f $$f $(DESTDIR)$(infodir) || true ; \
done
# singlehtml files
cp $(BUILD_DIR)/en/singlehtml/$(PACKAGE).html $(DESTDIR)$(datadir)
@set -ex; for l in $(filter-out en,$(LANGS)); do \
cp $(BUILD_DIR)/$$l/singlehtml/$(PACKAGE).html $(DESTDIR)$(datadir)/$$l ; \
done
# fixup genindex
find $(DESTDIR)$(datadir) -name genindex.html -delete
find $(DESTDIR)$(datadir) -name '*.html' -exec sed -i 's#genindex.html#index.html#' "{}" \;
.PHONY: all
.PHONY: FORCE_MAKE
.PHONY: text pdf nopdf epub info html htmls
.PHONY: clean distclean update-po
.PHONY: install
#
# GNU make configuration.
#
# If a rule bombs out, delete the target.
#.DELETE_ON_ERROR:
# No default suffixes work here, don't waste time on them.
.SUFFIXES:
|