diff options
author | 2019-04-28 21:10:28 -0400 | |
---|---|---|
committer | 2019-11-25 21:17:03 -0500 | |
commit | 3c2491a9e3018d1fc98feaf5d3b91c4ad2e7013a (patch) | |
tree | 432b8232f6a96e423b154b4adae0cfee19802673 /Makefile | |
parent | ebuild-writing/variables: explicitly discourage HOMEPAGE in SRC_URI (diff) | |
download | devmanual-3c2491a9e3018d1fc98feaf5d3b91c4ad2e7013a.tar.gz devmanual-3c2491a9e3018d1fc98feaf5d3b91c4ad2e7013a.tar.bz2 devmanual-3c2491a9e3018d1fc98feaf5d3b91c4ad2e7013a.zip |
Makefile: simplify generated rules.
Our Makefile is GNU-specific, thanks to heavy use of call/eval to
automatically generate rules. In this commit, those generated rules
have been replaced by slightly less (in terms of code volume)
GNU-specific magic. The new magic uses a secondary expansion rule that
allows us to access the target name inside its own prerequisites. The
single resulting SECONDEXPANSION rule seems to be able to replace all
of the generated rules.
The variables and "clean" targets were also simplified using the full
power of the GNU extensions, which we are assuming anyway. Finally,
two other minor improvements were made:
1. The "clean" target was moved to the end of the file.
2. The "prereq" rule was split into two separate commands, and
wrapped to a reasonable line length.
Closes: https://bugs.gentoo.org/684688
Signed-off-by: Michael Orlitzky <mjo@gentoo.org>
Signed-off-by: Göktürk Yüksek <gokturk@gentoo.org>
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 60 |
1 files changed, 30 insertions, 30 deletions
@@ -1,40 +1,40 @@ -ALL_DIRS := $(shell find -name "text.xml" -exec dirname {} +) -text_files := $(addsuffix /index.html,$(ALL_DIRS)) -image_files := $(shell find -name "*.svg" | sed -e "s/svg$$/png/") +# 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. +HTMLS := $(subst text.xml,index.html,\ + $(shell find ./ -name .git -prune -o \( -type f -name 'text.xml' -print \))) +IMAGES := $(patsubst %.svg,%.png,\ + $(shell find ./ -name .git -prune -o \( -type f -name '*.svg' -print \))) -all: prereq $(text_files) $(image_files) +all: prereq $(HTMLS) $(IMAGES) prereq: - @type convert >/dev/null 2>&1 || { echo "media-gfx/imagemagick with corefonts, svg and truetype required" >&2; exit 1; }; \ - type xsltproc >/dev/null 2>&1 || { echo "dev-libs/libxslt is required" >&2; exit 1; } + @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 required" >&2;\ + exit 1; } %.png : %.svg convert $< $@ -clean: - @find . -name "*.png" -exec rm -v {} + - @find . -name "index.html" -exec rm -v {} + - -# Given a directory with text.xml in it, return its immediate children as prerequisites -# Hypothetical example: -# INPUT: "./archs" "./archs/amd64 ./archs/x86 ./ebuild-writing ./appendices" -# OUTPUT: ./archs/amd64/index.html ./archs/amd64/index.html -define get_prerequisites = -$(addsuffix /index.html,$(foreach subdir,$(2),$(if $(subst $(1)/,,$(dir $(subdir))),,$(subdir)))) -endef +# 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 $< > $@ -# Given a directory with text.xml in it, genereate a complete build rule with prerequisites -# Hypothetical example: -# INPUT: "./archs" "./archs/amd64 ./archs/x86 ./ebuild-writing ./appendices" -# OUTPUT ./archs/index.html: ./archs/text.xml devbook.xsl ./archs/amd64/index.html ./archs/x86/index.html -# xsltproc devbook.xsl ./archs/text.xml > ./archs/index.html -define generate_rule = -$(1)/index.html: $(1)/text.xml devbook.xsl $(call get_prerequisites,$(1),$(2)) - xsltproc devbook.xsl $$< > $$@ -endef - -# This generates individual build rules for all the text files by -# iterating over all the directories in the file system tree -$(foreach dir,$(ALL_DIRS),$(eval $(call generate_rule,$(dir),$(filter-out $(dir),$(ALL_DIRS))))) +clean: + rm -f $(HTMLS) $(IMAGES) .PHONY: all prereq clean |