keys.scala, etc.: Make merging public keys have a progress bar.
[tripe-android] / Makefile
index 0675cd4..d077faf 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -53,7 +53,7 @@ CCACHE                        := $(shell \
 
 ## 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
@@ -97,13 +97,13 @@ CFLAGS                       = -O2 -g -Wall
 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:
@@ -119,7 +119,7 @@ JDKPLAT                     := $(shell \
          (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
@@ -127,18 +127,14 @@ MINAPI                     = 15
 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
@@ -148,7 +144,7 @@ TOOLCHAINDIR.x86     = x86
 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
@@ -159,7 +155,7 @@ FLAVOURS            += $(ANDROID_ABIS)
 ## 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
 
@@ -179,8 +175,8 @@ ndk-toolchain-bin    = \
 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)
@@ -283,6 +279,9 @@ ext-stamp-builddir   = \
 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): \
@@ -315,6 +314,7 @@ $(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)
@@ -354,7 +354,8 @@ libtripe.so_LIBS     = $(call ext-builddir,$1,tripe)/server/libtripe.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)
+                               $(call pkg-config,$1,mLib,LIBS) \
+                               -ladns
 
 ## Machinery for compiling.
 objdir                  = $(OUTDIR)/obj.$1
@@ -386,7 +387,7 @@ $(foreach a,$(APKLIBS), $(eval $(call obj-rule,$a)))
 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
@@ -404,7 +405,37 @@ $(foreach f,$(FLAVOURS), \
 $(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.
@@ -439,11 +470,13 @@ CLASSES                   += util
 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
@@ -485,12 +518,13 @@ CLEANFILES                += $(OUTDIR)/*.apk
 
 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
@@ -503,7 +537,7 @@ $$(OUTDIR)/pkg/assets/bin/$1/$2: $$$$(call ext-stamps,$$$$(EXTERNALS),$1)
        $$(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))))
 
@@ -520,11 +554,14 @@ $(OUTDIR)/pkg/classes.dex: $(CLASSSTAMPS) $(DEXJARS)
        $(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.$$*)
@@ -547,6 +584,10 @@ all:: debug
 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