# Paths/tools (override as needed)
ANDROID_JAR ?= $(HOME)/.android/android-34.jar
NDK ?= $(HOME)/.android/android-ndk-r29
TOOLCHAIN ?= $(NDK)/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT ?= $(TOOLCHAIN)/sysroot
RESOURCE_DIR ?= $(TOOLCHAIN)/lib/clang/21

CLANG ?= clang
AAPT2 ?= aapt2
ZIP ?= zip
ZIPALIGN ?= zipalign
APKSIGNER ?= apksigner

# Keystore for signing
KEYSTORE ?= $(HOME)/.android/debug.keystore
KS_PASS ?= android
KEY_PASS ?= android

# ABIs to build (space-separated). Examples:
# ABIS="arm64-v8a" (default) or ABIS="arm64-v8a armeabi-v7a x86 x86_64"
ABIS ?= arm64-v8a armeabi-v7a x86 x86_64

# Target triples by ABI
TARGET_arm64-v8a := aarch64-linux-android21
TARGET_armeabi-v7a := armv7a-linux-androideabi21
TARGET_x86 := i686-linux-android21
TARGET_x86_64 := x86_64-linux-android21

# App inputs/outputs
APP_SRC := main.c
SO_NAME := libnative-activity.so
APK_MANIFEST := manifest.zip
APK_LIBS := libs.zip
APK_ALIGNED := aligned.zip
APK := app.apk
LIBDIR := lib

# Derived
LIBDIRS := $(foreach abi,$(ABIS),$(LIBDIR)/$(abi))
LIBS := $(foreach dir,$(LIBDIRS),$(dir)/$(SO_NAME))

all: $(APK)
.PHONY: all

libs: $(LIBS)
.PHONY: libs

# Generate shared libraries per ABI
$(LIBS): $(LIBDIR)/%/$(SO_NAME): $(APP_SRC)
	mkdir -p $(@D)
	$(CLANG) \
	  --sysroot="$(SYSROOT)" -resource-dir "$(RESOURCE_DIR)" -rtlib=compiler-rt \
	  --target=$(TARGET_$*) \
	  -fuse-ld=lld -fPIC -shared -O2 \
	  -Wl,-z,defs -Wl,-soname,$(SO_NAME) \
	  -Wl,-u,ANativeActivity_onCreate \
	  -landroid -llog \
	  -I$(NDK)/sources/android/native_app_glue \
	  $< $(NDK)/sources/android/native_app_glue/android_native_app_glue.c -o $@

# Package resources (no libs yet)
$(APK_MANIFEST): AndroidManifest.xml
	$(AAPT2) link -I "$(ANDROID_JAR)" -o $@ --manifest $<

# Add libs
$(APK_LIBS): $(APK_MANIFEST) $(LIBS)
	$(ZIP) -0 -O $@ $< $(LIBS)

$(APK_ALIGNED): $(APK_LIBS)
	$(ZIPALIGN) -f -v 4 $< $@

$(APK): $(APK_ALIGNED)
	$(APKSIGNER) sign --ks "$(KEYSTORE)" --ks-pass pass:$(KS_PASS) --key-pass pass:$(KEY_PASS) --v4-signing-enabled false --out $@ $<

clean:
	rm -f $(APK) $(APK_ALIGNED) $(APK_LIBS) $(APK_MANIFEST) $(LIBS)
	rmdir --ignore-fail-on-non-empty $(LIBDIRS) $(LIBDIR) 2>/dev/null || true
.PHONY: clean
