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
|
# These "find" commands match text.xml and *.svg files, respectively,
# but only after excluding the .git directory from the search for
# performance and overall sanity reasons.
XMLS := $(shell find . -name .git -prune -o -type f -name 'text.xml' -print)
SVGS := $(shell find . -name .git -prune -o -type f -name '*.svg' -print)
HTMLS := $(subst text.xml,index.html,$(XMLS))
IMAGES := $(patsubst %.svg,%.png,$(SVGS))
all: prereq validate $(HTMLS) $(IMAGES) documents.js
prereq:
@type convert >/dev/null 2>&1 || \
{ echo "media-gfx/imagemagick[corefonts,svg,truetype] required" >&2;\
exit 1; }
@type xsltproc >/dev/null 2>&1 || \
{ echo "dev-libs/libxslt is with python required" >&2;\
exit 1; }
@type xmllint >/dev/null 2>&1 || \
{ echo "dev-libs/libxml2 is required" >&2;\
exit 1; }
# We need to parse all the XMLs every time, not just the ones
# that are newer than the target. This is because each search
# document in devmanual gets a unique ID, which is used to
# quickly tie search matches to the corresponding documents.
documents.js: bin/build_search_documents.py $(XMLS)
./bin/build_search_documents.py $(XMLS) > _documents.js
mv _documents.js documents.js
%.png : %.svg
convert $< $@
# Secondary expansion allows us to use the automatic variable $@ in
# the prerequisites. When it is used (and we have no idea when that
# is, so we assume always) our <include href="foo"> tag induces a
# dependency on the output of all subdirectories of the current
# directories. This wacky rule finds all of those subdirectories by
# looking for text.xml in them, and then replaces "text.xml" in the
# path with "index.html".
#
# We use the pattern %.html rather than the more-sensible %index.html
# because the latter doesn't match our top-level index.html target.
#
.SECONDEXPANSION:
%.html: $$(dir $$@)text.xml devbook.xsl xsl/*.xsl $$(subst text.xml,index.html,$$(wildcard $$(dir $$@)*/text.xml))
xsltproc devbook.xsl $< > $@
validate: prereq
@xmllint --noout --dtdvalid devbook.dtd $(XMLS) \
&& echo "xmllint validation successful"
# Run app-text/tidy-html5 on the output to detect mistakes.
# We have to loop through them because otherwise tidy won't
# tell you which file contains a mistake.
tidy: $(HTMLS)
@status=0; \
for f in $(HTMLS); do \
output=$$(tidy -q -errors --drop-empty-elements no $${f} 2>&1) \
|| { status=$$?; echo "Failed on $${f}:"; echo "$${output}"; }; \
done; \
test $${status} -eq 0 && echo "tidy validation successful"; \
exit $${status}
clean:
rm -f $(HTMLS) $(IMAGES) _documents.js documents.js
.PHONY: all prereq validate tidy clean
|