+# ---- set these as environment variables if different ----
+SDK ?= /usr/lib/android-sdk
NDK ?= /usr/lib/android-ndk
-CCSYSROOT = $(NDK)/sysroot
-ISYS = $(CCSYSROOT)/usr/include/aarch64-linux-android
-LDSYSROOT = $(NDK)/platforms/anrdoid-21/arch-arm64
-TCPATH = $(NDK)/toolchains/llvm/prebuilt/linux-$(shell uname -m)/bin
-TC = $(TCPATH)/aarch64-linux-android21-
-
-src = $(wildcard src/*.c) $(wildcard src/android/*.c)
-obj = $(src:.c=.arm64.o)
+AVER ?= 23
+# ---------------------------------------------------------
+
+sys = $(shell uname -s | sed 's/MINGW.*/mingw/')
+ifeq ($(sys), Linux)
+ host = linux-x86_64
+endif
+ifeq ($(sys), mingw)
+ host = windows-x86_64
+endif
+
+CCSYSROOT = --sysroot=$(NDK)/sysroot
+LDSYSROOT64 = --sysroot=$(NDK)/platforms/android-$(AVER)/arch-arm64
+LDSYSROOT32 = --sysroot=$(NDK)/platforms/android-$(AVER)/arch-arm
+PLATFORM_JAR = $(SDK)/platforms/android-$(AVER)/android.jar
+TCPATH = $(NDK)/toolchains/llvm/prebuilt/$(host)/bin
+TC64 = $(TCPATH)/aarch64-linux-android$(AVER)-
+TC32 = $(TCPATH)/armv7a-linux-androideabi$(AVER)-
+
+src = $(wildcard src/*.c) $(wildcard src/scr/*.c) $(wildcard src/android/*.c)
+obj64 = $(src:.c=.arm64.o)
+obj32 = $(src:.c=.arm32.o)
dep = $(src:.c=.d)
-lib_so = libandemo.so
+name = andemo
+lib_so = lib$(name).so
+so64 = lib$(name)64.so
+so32 = lib$(name)32.so
+
+pkgprefix = com.mutantstargoat
+pkg = $(pkgprefix).$(name)
+act = android.app.NativeActivity
+
+warn = -pedantic -Wall
+dbg = -g
+opt = -O3 -ffast-math -fno-strict-aliasing
+def = -DGLDEF
+incdir = -Isrc -Ilibs -Ilibs/imago/src -Ilibs/treestore
+libdir64 = -Llibs/android64
+libdir32 = -Llibs/android32
+
+CFLAGS = $(CCSYSROOT) $(ISYS) $(warn) $(dbg) $(opt) $(def) $(incdir) -fPIC -fcommon -MMD
+LDFLAGS = $(LDSYSROOT) -lm -landroid -llog -lEGL -lGLESv2 -limago -lpsys -lanim -ltreestore
-CC = $(TC)clang
-CFLAGS = --sysroot=$(CCSYSROOT) -isystem=$(ISYS) $(warn) $(dbg) $(opt) $(def) $(incdir) -fPIC -fcommon -MMD
-LDFLAGS = --sysroot=$(LDSYSROOT) -lEGL -lGLESv2
+$(name).apk: $(name).aligned.apk keystore.jks
+ apksigner sign --ks keystore.jks --ks-key-alias androidkey --ks-pass pass:android --key-pass pass:android --out $@ $<
-$(lib_so): $(obj)
- $(CC) -o $@ -shared $(obj) $(LDFLAGS)
+keystore.jks:
+ keytool -genkeypair -keystore $@ -alias androidkey -validity 10000 -keyalg RSA -keysize 2048 -storepass android -keypass android
+
+$(name).aligned.apk: $(name).unsigned.apk
+ zipalign -f -p 4 $< $@
+
+$(name).unsigned.apk: $(so64) $(so32) AndroidManifest.xml $(icons)
+ rm -f apkbuild/lib/arm64-v8a/* apkbuild/lib/armeabi-v7a/* apkbuild/lib/armeabi/*
+ rm -f apkbuild/assets/data/* apkbuild/assets/sdr/*
+ mkdir -p apkbuild/lib/arm64-v8a apkbuild/lib/armeabi-v7a apkbuild/lib/armeabi
+ cp $(so64) apkbuild/lib/arm64-v8a/$(lib_so)
+ cp $(so32) apkbuild/lib/armeabi-v7a/$(lib_so)
+ cp $(so32) apkbuild/lib/armeabi/$(lib_so)
+ mkdir -p apkbuild/assets/data apkbuild/assets/sdr
+ cp -r data/* apkbuild/assets/data
+ cp -r sdr/* apkbuild/assets/sdr
+ mkdir -p apkbuild/res/drawable-xhdpi apkbuild/res/drawable-hdpi apkbuild/res/drawable-mdpi apkbuild/res/drawable-ldpi
+ cp data/icon96.png apkbuild/res/drawable-xhdpi/ic_launcher.png
+ cp data/icon72.png apkbuild/res/drawable-hdpi/ic_launcher.png
+ cp data/icon48.png apkbuild/res/drawable-mdpi/ic_launcher.png
+ cp data/icon36.png apkbuild/res/drawable-ldpi/ic_launcher.png
+ aapt package -f -F $@ -I $(PLATFORM_JAR) -M AndroidManifest.xml -S apkbuild/res apkbuild
+
+$(so64): $(obj64) Makefile.android libs
+ $(TC64)clang -o $@ -shared -Wl,-soname,$(lib_so) $(obj64) $(libdir64) $(LDFLAGS)
+
+$(so32): $(obj32) Makefile.android libs
+ $(TC32)clang -o $@ -shared -Wl,-soname,$(lib_so) $(obj32) $(libdir32) $(LDFLAGS)
-include $(dep)
%.arm64.o: %.c
- $(CC) -o $@ $(CFLAGS) -c $<
+ $(TC64)clang -o $@ $(CFLAGS) -c $<
+
+%.arm32.o: %.c
+ $(TC32)clang -o $@ $(CFLAGS) -c $<
.PHONY: clean
clean:
- rm -f $(obj) $(lib_so)
+ rm -f $(obj64) $(obj32) $(lib_so)
.PHONY: cleandep
cleandep:
rm -f $(dep)
+
+.PHONY: libs
+libs: libs64 libs32
+
+.PHONY: libs64
+libs64:
+ $(MAKE) CC=$(TC64)clang sys=android-arm64 -C libs
+
+.PHONY: libs32
+libs32:
+ $(MAKE) CC=$(TC32)clang sys=android-arm32 -C libs
+
+.PHONY: clean-libs
+clean-libs: clean-libs64 clean-libs32
+
+.PHONY: clean-libs64
+clean-libs64:
+ $(MAKE) sys=android-arm64 -C libs clean
+
+.PHONY: clean-libs32
+clean-libs32:
+ $(MAKE) sys=android-arm32 -C libs clean
+
+.PHONY: install
+install: $(name).apk
+ adb install -r $(name).apk
+
+.PHONY: uninstall
+uninstall:
+ adb uninstall $(pkg)
+
+.PHONY: run
+run:
+ adb shell am start -n $(pkg)/$(act)
+
+.PHONY: stop
+stop:
+ adb shell am force-stop $(pkg)
+
+.PHONY: logcat
+logcat:
+ adb logcat $(name):V AndroidRuntime:V DEBUG:V '*:S'