+ $(call cmdsave,$^)
+
+data/xorg-compose: $(download)
+ tools/wget-ifmodified http://cgit.freedesktop.org/xorg/lib/libX11/plain/nls/en_US.UTF-8/Compose.pre $@
+data/digraphs-xorg.inc.pl: tools/mkdigraphs-xorg data/xorg-compose
+ $(call cmdsave,$^)
+
+data/digraphs-vim.inc.pl: tools/mkdigraphs-vim
+ $(call cmdsave,$<)
+
+data/digraphs-plan9.txt:
+ tools/wget-ifmodified https://9fans.github.io/usr/local/plan9/lib/keyboard $@
+data/digraphs-plan9.inc.pl: tools/mkdigraphs-plan9 data/digraphs-plan9.txt
+ $(call cmdsave,$^)
+
+data/digraphs.inc.pl: tools/mkdigraphlist data/digraphs-rfc.inc.pl data/digraphs-vim.inc.pl data/digraphs-shiar.inc.pl data/unicode-char.inc.pl
+ $(call cmdsave,$<)
+
+data/unicode-char.inc.pl: tools/mkcharinfo data/digraphs-rfc.inc.pl data/digraphs-shiar.inc.pl data/unicode-age.inc.pl unicode-table.inc.pl
+ $(call cmdsave,$<)
+
+data/font/%.inc.pl: tools/mkttfinfo data/font/%.ttf
+ $(call cmdsave,$^) || true
+
+data/unicode-sampler: $(download)
+ $(call gitsave,git://git.shiar.nl/unicode-sampler)
+
+data/xcolors/themes: data/xcolors
+data/xcolors: $(download)
+ $(call gitsave,https://github.com/tlatsas/xcolors)
+
+data/termcol-xcolor.inc.pl: tools/mktermcol-xcolor data/xcolors/themes
+ $(call cmdsave,$^/*)
+
+data/wordlist.version.txt: force
+ @[ -e $@ ] || date -Is >$@
+ @perl -ni -I. -MShiar_Sheet::DB -E 'say (Shiar_Sheet::DB->connect->select(word => "max(updated)", \["updated>?", $$_])->list or exit 1)' $@ || true
+
+data/wordlist.inc.pl: tools/mkwordlist data/wordlist.version.txt
+ $(call cmdsave,$<)
+data/wordlist.%.inc.pl: tools/mkwordlist data/wordlist.version.txt
+ $(call cmdsave,$< $*)
+data/word%.json: data/word%.inc.pl
+ $(call cmdsave,perl -MJSON=encode_json -E "print encode_json(do \$$ARGV[0])" ./$<)
+data/%.json: %.inc.pl
+ $(call cmdsave,perl -MJSON -E "print JSON->new->utf8->canonical->encode(do \$$ARGV[0])" ./$<)
+
+data/wordpairs.inc.pl: data/wordlist.version.txt
+ @perl -I. -MShiar_Sheet::DB -MData::Dump=pp -E 'say pp(Shiar_Sheet::DB->connect->select("word w JOIN word a ON w.id=a.ref" => "w.id, a.id", {"a.lang"=>undef})->map or exit 1)' >$@
+
+.SECONDARY: data/font/%.ttf
+data/font/%.ttf:
+ find /usr/share/fonts/truetype/ ~/.fonts/ -iname "$(@F)" | head -1 | xargs -i ln -sf {} $@
+data/font/%.win2k.ttf:
+ find /usr/share/fonts/truetype/msttcorefonts/ -iname "$(*F).ttf" | head -1 | xargs -i ln -sf {} $@
+data/font/dv%.ttf:
+ find /usr/share/fonts/truetype/dejavu/ -iname "DejaVu*$(*F).ttf" | head -1 | xargs -i ln -sf {} $@
+data/font/droid%.ttf:
+ find /usr/share/fonts/truetype/droid/ -iname "Droid*$(*F).ttf" | head -1 | xargs -i ln -sf {} $@
+data/font/droidserif.ttf:
+ ln -sf /usr/share/fonts/truetype/droid/DroidSerif-Regular.ttf $@
+data/font/free%.ttf:
+ find /usr/share/fonts/truetype/freefont/ -iname "$(@F)" | head -1 | xargs -i ln -sf {} $@
+data/font/roboto.ttf:
+ ln -sf /usr/share/fonts/truetype/roboto/unhinted/RobotoTTF/Roboto-Regular.ttf $@
+data/font/noto%.ttf:
+ find /usr/share/fonts/truetype/noto/ -iname "Noto$(*F)-Regular.ttf" | head -1 | xargs -i ln -sf {} $@
+
+data/font: tools/mkttfinfo
+ mkdir -p $@
+ $(MAKE) data/font/all
+ touch $@