+$(EXTSTAMPS): \
+ $(STAMPDIR)/%-stamp: \
+ $$(call ext-stamps, \
+ $$($$(call stamp-name,$$@)_DEPS), \
+ $$(call stamp-type,$$@))
+ $(V_AT)mkdir -p $(STAMPDIR)
+ $(V_AT)rm -rf $(call ext-stamp-builddir,$@)
+ $(V_AT)mkdir -p $(call ext-stamp-builddir,$@)
+ cd $(call ext-stamp-builddir,$@) && \
+ $(call ext-stamp-tool,$@,ENV) \
+ $(call join-paths,../../..,$(call ext-stamp-srcdir,$@))/configure \
+ --prefix=$(call ext-stamp-absprefix,$@) \
+ $(call ext-stamp-tool,$@,CONFIG) \
+ $($(call stamp-name,$@)_CONFIG) \
+ CC="$(CCACHE) $(call ext-stamp-tool,$@,CC)" \
+ CFLAGS="$(call ext-stamp-tool,$@,CFLAGS) -I$(call ext-stamp-absprefix,$@)/include" \
+ LD="$(call ext-stamp-tool,$@,LD)" \
+ LDFLAGS="$(call ext-stamp-tool,$@,LDFLAGS) -L$(call ext-stamp-absprefix,$@)/lib" \
+ PKG_CONFIG="pkg-config --static" \
+ PKG_CONFIG_LIBDIR=$(call ext-stamp-absprefix,$@)/lib/pkgconfig
+ $(call ext-stamp-tool,$@,ENV) \
+ $(MAKE) -C$(call ext-stamp-builddir,$@)
+ $(call ext-stamp-tool,$@,ENV) \
+ $(MAKE) -C$(call ext-stamp-builddir,$@) install
+ $(V_AT)touch $@
+
+$(foreach f,$(FLAVOURS),$(foreach e,$(EXTERNALS),clean-$e.$f)): clean-%:
+ rm -f $(STAMPDIR)/$*-stamp
+ rm -rf $(call ext-stamp-builddir,$*)
+.PHONY: $(foreach f,$(FLAVOURS),$(foreach e,$(EXTERNALS),clean-$e.$f))
+$(foreach e,$(EXTERNALS),clean-$e): clean-%: $(foreach f,$(FLAVOURS),clean-%.$f)
+$(foreach f,$(FLAVOURS),clean-inst.$f): clean-inst.%:
+ rm -rf $(call ext-prefix,$*)
+.PHONY: $(foreach f,$(FLAVOURS),clean-inst.$f)
+
+$(foreach f,$(FLAVOURS),realclean-$f): realclean-%: \
+ $$(foreach e,$$(EXTERNALS),clean-$$e.$$*) \
+ clean-inst.$$*
+realclean:: $(foreach f,$(FLAVOURS),realclean-$f)
+
+###--------------------------------------------------------------------------
+### Our own native programs.
+
+## Fetching package configuration.
+PKG_CONFIG = pkg-config --static
+PKGS = catacomb mLib
+
+PCOPT.CFLAGS = --cflags
+PCOPT.LIBS = --libs
+
+pkg-config = $(shell \
+ env PKG_CONFIG_LIBDIR=$(call ext-prefix,$1)/lib/pkgconfig \
+ $(PKG_CONFIG) $(PCOPT.$3) $2)
+
+## Definitions.
+APKLIBS += libtripe.so
+libtripe.so_SRCS = jni.c
+libtripe.so_EXTS = mLib catacomb tripe
+libtripe.so_CFLAGS = -I$(call ext-prefix,$1)/include \
+ -I$(call ext-srcdir,tripe)/common \
+ -I$(call ext-srcdir,tripe)/priv \
+ -I$(call ext-srcdir,tripe)/server \
+ -I$(call ext-builddir,$1,tripe)/config \
+ $(call pkg-config,$1,mLib,CFLAGS) \
+ $(call pkg-config,$1,catacomb,CFLAGS)
+libtripe.so_LIBS = $(call ext-builddir,$1,tripe)/server/libtripe.a \
+ $(call ext-builddir,$1,tripe)/priv/libpriv.a \
+ $(call ext-builddir,$1,tripe)/common/libcommon.a \
+ -L$(call ext-prefix,$1)/lib \
+ $(call pkg-config,$1,catacomb,LIBS) \
+ $(call pkg-config,$1,mLib,LIBS) \
+ -ladns
+
+## Machinery for compiling.
+objdir = $(OUTDIR)/obj.$1
+objects = $(patsubst %.c,$(call objdir,$1)/%$3,$2)
+
+apklib-objects = $(call objects,$1,$($2_SRCS),$3)
+obj-base = $(patsubst $(OUTDIR)/obj.%.o,%,$1)
+obj-type = $(patsubst %/,%,$(dir $(call obj-base,$1)))
+obj-name = $(notdir $(call obj-base,$1))
+obj-tool = $(call tool,$(call obj-type,$1),$2)
+
+define obj-rule
+$1_OBJS := $$(foreach f,$$(FLAVOURS),\
+ $$(call objects,$$f,$$($1_SRCS),.o))
+DEPFILES += $$(foreach f,$$(FLAVOURS),\
+ $$(call objects,$$f,$$($1_SRCS),.d))
+$$($1_OBJS): $$(OUTDIR)/obj.%.o: \
+ $$$$(call obj-name,$$$$@).c \
+ $$$$(call stamps,$$$$(call obj-type,$$$$@),$$$$($1_EXTS))
+ $$(V_AT)mkdir -p $$(dir $$@)
+ $$(call v_tag,CC)$$(call obj-tool,$$@,ENV) \
+ $$(call obj-tool,$$@,CC) -c -o$$@ -MD \
+ $$(call obj-tool,$$@,CFLAGS) \
+ $$(call $1_CFLAGS,$$(call obj-type,$$@)) \
+ $$<
+endef
+$(foreach a,$(APKLIBS), $(eval $(call obj-rule,$a)))
+
+CLEANFILES += $(OUTDIR)/obj.*/*.o $(OUTDIR)/obj.*/*.d
+
+## Machinery for linking.
+JNIDIR.host-$(hostcpu) = $(OUTDIR)/lib.host-$(hostcpu)
+JNIDIR.ndk = $(OUTDIR)/pkg/lib/$1
+
+define apklib-rule
+INSTFILES += $$(call tool,$1,JNIDIR)/$2
+$$(call tool,$1,JNIDIR)/$2: $$(call objects,$$f,$$($2_SRCS),.o)
+ $$(V_AT)mkdir -p $$(dir $$@)
+ $$(call v_tag,LD)$$(call tool,$1,ENV) \
+ $$(call tool,$1,LD) -o$$@ \
+ $$(call tool,$1,LDFLAGS) -shared \
+ $$^ \
+ $$(call $2_LIBS,$1)
+endef
+
+$(foreach f,$(FLAVOURS), \
+$(foreach a,$(APKLIBS), \
+ $(eval $(call apklib-rule,$f,$a))))
+
+CLEANFILES += $(OUTDIR)/pkg/lib/*/lib*.so
+CLEANFILES += $(OUTDIR)/lib.host-$(hostcpu)/lib*.so
+
+###--------------------------------------------------------------------------
+### Android string resource generation.
+
+GENSTRINGS += package=PACKAGE
+GENSTRINGS += version=VERSION
+GENSTRINGS += vsn=VSN
+
+$(foreach e,$(EXTERNALS),\
+ $(eval GENSTRINGS += $e_version=$e_VERSION))
+
+BUILD := $(shell uuid -v4)
+GENSTRINGS += build_uuid=BUILD
+
+genstring-name = $(firstword $(subst =, ,$1))
+genstring-value = $($(word 2,$(subst =, ,$1)))
+
+define gen-strings
+ $(V_AT)mkdir -p $(dir $1)
+ $(call v_tag,GEN)set -e; rm -f $1.new; exec >$1.new; \
+ echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; \
+ echo "<resources>"; \
+ $(foreach g,$(GENSTRINGS), \
+ echo " <string name=\"auto_$(call genstring-name,$g)\">$(call genstring-value,$g)</string>";) \
+ echo "</resources>"
+ $(V_AT)mv $1.new $1
+endef
+$(OUTDIR)/res.dummy/values/auto.xml: Makefile
+ $(call gen-strings,$@)
+
+###--------------------------------------------------------------------------
+### Java and Scala building.
+
+JARDIR = $(OUTDIR)/jar
+CLASSDIR = $(OUTDIR)/cls
+
+## External libraries we need to adopt. Grab them and feed them to `dx'
+## separately, because they take aaaaages and we don't want to have to do
+## this on every incremental build.
+JARS = $(SCALA_LIB)
+
+DEXJARS =
+define jar-rule
+DEXJARS += $$(JARDIR)/$$(notdir $1)
+$$(JARDIR)/$$(notdir $1): $1
+ $$(V_AT)mkdir -p $$(JARDIR)/
+ $$(V_AT)rm -f $$@ $$(basename $$@)-new.jar
+ $$(call v_tag,DX)dx --dex --output=$$(basename $$@)-new.jar $1
+ $$(V_AT)mv $$(basename $$@)-new.jar $$@
+endef
+$(foreach j,$(JARS), $(eval $(call jar-rule,$j)))
+
+REALCLEANFILES += $(JARDIR)/*.jar
+
+## Writing things out longhand is tedious. `CLASSES' is a list of entries of
+## the form `SRC[:DEP,...]', saying that `SRC.ext', being a source file
+## capable of being built into `.class' files and setting `SRC.class-stamp',
+## should be so built, and that it depends on other similar sources named DEP
+## having been so built.