abouttreesummaryrefslogcommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorJules Aguillon2021-04-11 21:02:03 +0200
committerJules Aguillon2021-04-13 00:29:26 +0200
commit5f5efe31579110c3d91e9c4dad84e2deec70ec36 (patch)
tree9fdd3dfab8c54a44a39bc178f7e81011933d98c3 /Makefile
parent553185c3ae2ed7d65ffd186ccbbdaed29d76283a (diff)
downloadunexpected-keyboard-5f5efe31579110c3d91e9c4dad84e2deec70ec36.tar.gz
unexpected-keyboard-5f5efe31579110c3d91e9c4dad84e2deec70ec36.zip
Change build system to make
The ant scripts included in the android SDK were removed recently. The alternative is Gradle. Gradle doesn't work well in this app because it's not possible to use Nix to pull dependencies. Gradle will try to patch the SDK. Also, it's very slow. It turns out the required build script is quite simple.
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile111
1 files changed, 111 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..66e251f
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,111 @@
+# Configuration
+
+PACKAGE_NAME = juloo.keyboard2
+
+ANDROID_PLATFORM_VERSION = android-29
+JAVA_VERSION = 1.7
+
+SRC_DIR = srcs
+ASSETS_DIR = assets
+RES_DIR = res
+
+EXTRA_JARS =
+
+# /
+
+debug: _build/$(PACKAGE_NAME).debug.apk
+release: _build/$(PACKAGE_NAME).apk
+
+installd: _build/$(PACKAGE_NAME).debug.apk
+ adb install "$<"
+
+.PHONY: release debug installd
+
+$(shell mkdir -p _build)
+
+ifndef ANDROID_HOME
+$(error ANDROID_HOME not set)
+endif
+
+ANDROID_BUILD_TOOLS = $(lastword $(sort $(wildcard $(ANDROID_HOME)/build-tools/*)))
+ANDROID_PLATFORM = $(ANDROID_HOME)/platforms/$(ANDROID_PLATFORM_VERSION)
+
+ifeq ($(shell [ -d "$(ANDROID_PLATFORM)" ] && echo ok),)
+$(error Android platform not found. Want $(ANDROID_PLATFORM_VERSION), \
+ found $(notdir $(wildcard $(ANDROID_HOME)/platforms/*)))
+endif
+
+JAVAC_FLAGS = -source $(JAVA_VERSION) -target $(JAVA_VERSION) -encoding utf8
+
+# Source files
+
+MANIFEST_FILE = AndroidManifest.xml
+JAVA_FILES = $(shell find $(SRC_DIR) -name '*.java')
+RES_FILES = $(shell find $(RES_DIR) -type f)
+ASSETS_FILES = $(shell find $(ASSETS_DIR) -type f 2>/dev/null)
+
+# Align
+
+_build/%.apk: _build/%.signed-apk
+ $(ANDROID_BUILD_TOOLS)/zipalign -fp 4 "$<" "$@"
+
+# Debug signing
+
+DEBUG_KEYSTORE = _build/debug.keystore
+DEBUG_PASSWD = debug0
+
+$(DEBUG_KEYSTORE):
+ echo y | keytool -genkeypair -dname "cn=d, ou=e, o=b, c=ug" \
+ -alias debug -keypass $(DEBUG_PASSWD) -keystore "$@" \
+ -keyalg rsa -storepass $(DEBUG_PASSWD) -validity 10000
+
+_build/%.debug.signed-apk: _build/%.debug.unsigned-apk $(DEBUG_KEYSTORE)
+ jarsigner -keystore $(DEBUG_KEYSTORE) \
+ -storepass $(DEBUG_PASSWD) -keypass $(DEBUG_PASSWD) \
+ -signedjar "$@" "$<" debug
+
+# Debug apk
+
+_build/$(PACKAGE_NAME).debug.unsigned-apk: AAPT_PACKAGE_FLAGS+=--rename-manifest-package $(PACKAGE_NAME).debug
+
+# Release signing
+
+# %-keystore.conf should declare KEYSTORE, KEYNAME and OPTS
+# it is interpreted as a shell script
+# OPTS can be used to pass -storepass or -keypass options to jarsigner
+_build/%.signed-apk: _build/%.unsigned-apk %-keystore.conf
+ eval `cat $(word 2,$^)` && \
+ jarsigner -keystore "$$KEYSTORE" $$OPTS -signedjar "$@" "$<" "$$KEYNAME"
+
+# Package
+
+_build/%.unsigned-apk: _build/classes.dex $(MANIFEST_FILE) $(ASSETS_FILES)
+ $(ANDROID_BUILD_TOOLS)/aapt package -f -M $(MANIFEST_FILE) -S $(RES_DIR) \
+ -I $(ANDROID_PLATFORM)/android.jar -F "$@" $(AAPT_PACKAGE_FLAGS)
+ [ -z "$(ASSETS_FILES)" ] || $(ANDROID_BUILD_TOOLS)/aapt add "$@" $(ASSETS_FILES)
+ cd $(@D) && $(ANDROID_BUILD_TOOLS)/aapt add $(@F) classes.dex
+
+# R.java
+
+GEN_DIR = _build/gen
+R_FILE = $(GEN_DIR)/$(subst .,/,$(PACKAGE_NAME))/R.java
+
+$(R_FILE): $(RES_FILES) $(MANIFEST_FILE)
+ mkdir -p "$(@D)"
+ $(ANDROID_BUILD_TOOLS)/aapt package -f -m -S $(RES_DIR) -J $(GEN_DIR) \
+ -M $(MANIFEST_FILE) -I $(ANDROID_PLATFORM)/android.jar
+
+# Compile java classes and build classes.dex
+
+OBJ_DIR = _build/class
+# A$B.class files are ignored
+# CLASS_FILES = $(JAVA_FILES:$(SRC_DIR)/%.java=$(OBJ_DIR)/%.class) \
+# $(R_FILE:$(GEN_DIR)/%.java=$(OBJ_DIR)/%.class)
+
+_build/classes.dex: $(JAVA_FILES) $(R_FILE)
+ mkdir -p $(OBJ_DIR)
+ javac -d $(OBJ_DIR) $(JAVAC_FLAGS) \
+ -classpath $(ANDROID_PLATFORM)/android.jar:$(EXTRA_JARS) \
+ -sourcepath $(SRC_DIR):$(GEN_DIR) \
+ $^
+ $(ANDROID_BUILD_TOOLS)/dx --dex --output="$@" $(OBJ_DIR) $(subst :, ,$(EXTRA_JARS))