## Where to put the object files.
OUTDIR = out
-CONFIGDIR = $(OUTDIR)/config
+CONFIGDIR = $(OUTDIR)/config-$(hostcpu)
## The Java runtime, for some reason, hardcodes its default for
## `java.io.tmpdir', inviting security problems. If the user has defined a
LDFLAGS = -Wl,-z,defs
## Host toolchain.
-FLAVOURS += host
-ENV.host =
-CC.host = gcc
-CFLAGS.host = $(CFLAGS) -fPIC
-LD.host = $(CC.host)
-LDFLAGS.host = $(LDFLAGS)
-CONFIG.host =
+FLAVOURS += host-$(hostcpu)
+ENV.host-$(hostcpu) =
+CC.host-$(hostcpu) = gcc
+CFLAGS.host-$(hostcpu) = $(CFLAGS) -fPIC
+LD.host-$(hostcpu) = $(CC.host-$(hostcpu))
+LDFLAGS.host-$(hostcpu) = $(LDFLAGS)
+CONFIG.host-$(hostcpu) =
## Host JNI machinery.
$(CONFIGDIR)/jdkdir.mk:
(darwin) echo macosx ;; \
(*) echo $(hostos) ;; \
esac)
-CFLAGS.host += -I$(JDKDIR)/include -I$(JDKDIR)/include/$(JDKPLAT)
+CFLAGS.host-$(hostcpu) += -I$(JDKDIR)/include -I$(JDKDIR)/include/$(JDKPLAT)
## Android SDK location.
ANDROID_SDKDIR = /usr/local/android/sdk
TARGETAPI = 23
TOOLVERSION = 4.9
-## Android ABI definitions.
+## Android ABI definitions. We don't bother with `armeabi-v7a': we'll use
+## fancy CPU features if we detect that they're available at runtime anyway.
ANDROID_ABIS += armeabi
GNUARCH.armeabi = arm-linux-androideabi
PLATARCH.armeabi = arm
CFLAGS.ndk-armeabi =
-ANDROID_ABIS.inhibit += armeabi-v7a
-GNUARCH.armeabi-v7a = arm-linux-androideabi
-PLATARCH.armeabi-v7a = arm
-CFLAGS.ndk-armeabi-v7a =
-
-ANDROID_ABIS.inhibit += arm64-v8a
+ANDROID_ABIS += arm64-v8a
GNUARCH.arm64-v8a = aarch64-linux-android
PLATARCH.arm64-v8a = arm64
MINAPI.arm64-v8a = 21
GNUARCH.x86 = i686-linux-android
PLATARCH.x86 = x86
-ANDROID_ABIS.inhibit += x86_64
+ANDROID_ABIS += x86_64
TOOLCHAINDIR.x86_64 = x86_64
GNUARCH.x86_64 = x86_64-linux-android
PLATARCH.x86_64 = x86_64
## Build variants.
VARIANTS += debug
AAPTFLAGS.debug = --debug-mode \
- --rename-manifest-package uk.org.distorted.tripe-debug
+ --rename-manifest-package uk.org.distorted.tripe.debug
KEYSTORE.debug = debug.keystore
JARSIGNERFLAGS.debug = -storepass public -keypass public
ENV.ndk = env PATH=$(call ndk-toolchain-bin,$1):$$PATH
CC.ndk = $(GNUARCH.$1)-gcc
LD.ndk = $(CC.ndk)
-CFLAGS.ndk = $(CFLAGS) -fPIC -D__ANDROID_API__=$(MINAPI) \
- $(CFLAGS.ndk-$1) \
+CFLAGS.ndk = $(CFLAGS) -fPIC $(CFLAGS.ndk-$1) \
+ -D__ANDROID_API__=$(call defaulting,MINAPI.$1,$(MINAPI)) \
--sysroot=$(call ndk-sysroot,$1) \
-isystem $(ANDROID_NDKDIR)/sysroot/usr/include \
-isystem $(ANDROID_NDKDIR)/sysroot/usr/include/$(GNUARCH.$1)
ext-stamp-absprefix = $(call ext-absprefix,$(call stamp-type,$1))
ext-stamp-tool = $(call tool,$(call stamp-type,$1),$2)
+$(foreach e,$(EXTERNALS),\
+ $(eval $e_VERSION := $$(shell cd $$(call ext-srcdir,$e) && $$(abs_srcdir)/auto-version)))
+
EXTSTAMPS = $(call ext-stamps,$(EXTERNALS),$(FLAVOURS))
$(EXTSTAMPS): \
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)
$(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)
+ $(call pkg-config,$1,mLib,LIBS) \
+ -ladns
## Machinery for compiling.
objdir = $(OUTDIR)/obj.$1
CLEANFILES += $(OUTDIR)/obj.*/*.o $(OUTDIR)/obj.*/*.d
## Machinery for linking.
-JNIDIR.host = $(OUTDIR)
+JNIDIR.host-$(hostcpu) = $(OUTDIR)/lib.host-$(hostcpu)
JNIDIR.ndk = $(OUTDIR)/pkg/lib/$1
define apklib-rule
$(foreach a,$(APKLIBS), \
$(eval $(call apklib-rule,$f,$a))))
-CLEANFILES += $(OUTDIR)/pkg/lib/*/lib*.so $(OUTDIR)/lib*.so
+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.
CLASSES += sys:util
CLASSES += admin:sys,util
CLASSES += tar:util
+CLASSES += dep:util
CLASSES += progress:sys,util
CLASSES += keys:progress,tar,sys,util
CLASSES += terminal:progress,sys,util
CLASSES += R
-CLASSES += toy-activity:R
+CLASSES += app:R
+CLASSES += toy-activity:app,R
## Building class files.
$(STAMPDIR)/%.class-stamp: %.java
AAPTFLAGS = \
--min-sdk-version $(MINAPI) --target-sdk-version $(TARGETAPI) \
- --version-name "$(VERSION)" --version-code $(VSN)
+ --version-name "$(VERSION)" --version-code $(VSN) --auto-add-overlay
-$(OUTDIR)/src/R.java: AndroidManifest.xml
+$(OUTDIR)/src/R.java: AndroidManifest.xml $(OUTDIR)/res.dummy/values/auto.xml
$(V_AT)mkdir -p $(dir $@)
$(call v_tag,AAPT)aapt package $(AAPTFLAGS) \
- -M AndroidManifest.xml -S res/ -I $(ANDROID_JAR) \
+ -M AndroidManifest.xml -S res/ -S $(OUTDIR)/res.dummy/ \
+ -I $(ANDROID_JAR) \
-J $(dir $@) --generate-dependencies
CLEANFILES += $(OUTDIR)/src/R.java $(OUTDIR)/src/R.java.d
-include $(OUTDIR)/src/R.java.d
$$(V_AT)mkdir -p $$(dir $$@)
$$(call v_tag,CP)cp $$(call ext-prefix,$1)/bin/$2 $$@
endef
-$(foreach f,$(FLAVOURS), \
+$(foreach f,$(ANDROID_ABIS), \
$(foreach b,$(BINS), \
$(eval $(call bin-rule,$f,$b))))
$(V_AT)mkdir -p $(dir $@)
$(call v_tag,DX)dx --dex --output=$@ $(CLASSDIR) $(JARDIR)
+$(OUTDIR)/res.volatile/values/auto.xml: $(INSTFILES)
+ $(call gen-strings,$@)
+
$(foreach v,$(VARIANTS),$(OUTDIR)/tripe-$v.unsigned.apk): \
-$(OUTDIR)/tripe-%.unsigned.apk: $(INSTFILES)
+$(OUTDIR)/tripe-%.unsigned.apk: $(INSTFILES) $(OUTDIR)/res.volatile/values/auto.xml
$(call v_tag,AAPT)aapt package -f $(AAPTFLAGS) $(AAPTFLAGS.$*) \
- -M AndroidManifest.xml -S res/ -I $(ANDROID_JAR) \
- -F $@ $(OUTDIR)/pkg/
+ -M AndroidManifest.xml -S res/ -S $(OUTDIR)/res.volatile/ \
+ -I $(ANDROID_JAR) -F $@ $(OUTDIR)/pkg/
$(foreach v,$(VARIANTS),$(OUTDIR)/tripe-$v.signed.apk): \
$(OUTDIR)/tripe-%.signed.apk: $(OUTDIR)/tripe-%.unsigned.apk $$(KEYSTORE.$$*)
clean::; rm -f $(CLEANFILES)
realclean::; rm -f $(REALCLEANFILES)
+repl: $(CLASSSTAMPS) $(foreach a,$(APKLIBS),$(JNIDIR.host-$(hostcpu))/$a)
+ $(SCALA) -cp $(CLASSDIR) -Yno-load-impl-class \
+ -Djava.library.path=$(JNIDIR.host-$(hostcpu)) \
+
t:; : $(show)
.PHONY: t