ANDROID_SDK_ROOT ?= /opt/android-sdk ANDROID_NDK_ROOT ?= /opt/android-ndk JAVA_HOME ?= /usr/lib/jvm/java-25-openjdk PATH := $(JAVA_HOME)/bin:$(ANDROID_SDK_ROOT)/cmdline-tools/latest/bin:$(ANDROID_SDK_ROOT)/platform-tools:$(PATH) APK_BUILD_IMAGE ?= keepassgo/android-apk-build:java25 APP_ID ?= org.julianfamily.keepassgo APK_OUT ?= build/keepassgo.apk APK_VERSION ?= 0.1.0.1 APP_VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev) GO_LDFLAGS ?= -X git.julianfamily.org/keepassgo/internal/appui.appVersion=$(APP_VERSION) ANDROID_MIN_SDK ?= 28 ANDROID_TARGET_SDK ?= 35 SIGNKEY ?= SIGNPASS ?= ARCH_PKG_DIR ?= packaging/archlinux/keepassgo-git ARCH_PKG_TMPL ?= $(ARCH_PKG_DIR)/PKGBUILD.tmpl ARCH_PKGBUILD ?= $(ARCH_PKG_DIR)/PKGBUILD ARCH_PKGVER ?= $(shell printf 'r%s.%s' "$$(git rev-list --count HEAD 2>/dev/null || echo 0)" "$$(git rev-parse --short HEAD 2>/dev/null || echo dev)") ARCH_REPO_DIR ?= $(CURDIR) GOGIO_SIGN_FLAGS := ifneq ($(strip $(SIGNKEY)),) GOGIO_SIGN_FLAGS += -signkey $(SIGNKEY) endif ifneq ($(strip $(SIGNPASS)),) GOGIO_SIGN_FLAGS += -signpass $(SIGNPASS) endif .PHONY: apk apk-local apk-container apk-container-image archlinux-pkgbuild browser-bridge browser-extension-validate apk: @if [ -x "$(JAVA_HOME)/bin/java" ] && "$(JAVA_HOME)/bin/java" -version 2>&1 | grep -q 'version "25'; then \ $(MAKE) apk-local JAVA_HOME="$(JAVA_HOME)"; \ else \ echo "Using Dockerized Java 25 Android build because JAVA_HOME is not a working Java 25 install."; \ $(MAKE) apk-container; \ fi apk-local: android/keepassgo-android.jar @test -x "$(JAVA_HOME)/bin/java" || { echo "JAVA_HOME must point to a working JDK install"; exit 1; } @test -d "$(ANDROID_SDK_ROOT)" || { echo "ANDROID_SDK_ROOT must point to an Android SDK install"; exit 1; } @test -d "$(ANDROID_NDK_ROOT)" || { echo "ANDROID_NDK_ROOT must point to an Android NDK install"; exit 1; } @test -x "$(ANDROID_SDK_ROOT)/cmdline-tools/latest/bin/sdkmanager" || { echo "Android SDK cmdline-tools are missing"; exit 1; } @test -d "$(ANDROID_SDK_ROOT)/platforms/android-$(ANDROID_TARGET_SDK)" || { echo "Android platform android-$(ANDROID_TARGET_SDK) is missing"; exit 1; } @test -d "$(ANDROID_SDK_ROOT)/build-tools" || { echo "Android build-tools are missing"; exit 1; } @mkdir -p "$(dir $(APK_OUT))" ANDROID_HOME="$(ANDROID_SDK_ROOT)" \ ANDROID_SDK_ROOT="$(ANDROID_SDK_ROOT)" \ ANDROID_NDK_ROOT="$(ANDROID_NDK_ROOT)" \ JAVA_HOME="$(JAVA_HOME)" \ go tool gogio -target android \ -buildmode exe \ -appid $(APP_ID) \ -ldflags "$(GO_LDFLAGS)" \ $(GOGIO_SIGN_FLAGS) \ -o $(APK_OUT) \ -version $(APK_VERSION) \ -minsdk $(ANDROID_MIN_SDK) \ -targetsdk $(ANDROID_TARGET_SDK) \ -icon internal/assets/keepassgo-icon.png \ ./cmd/keepassgo apk-container: apk-container-image @command -v docker >/dev/null 2>&1 || { echo "docker is required for apk-container"; exit 1; } @test -d "$(ANDROID_SDK_ROOT)" || { echo "ANDROID_SDK_ROOT must point to an Android SDK install"; exit 1; } @test -d "$(ANDROID_NDK_ROOT)" || { echo "ANDROID_NDK_ROOT must point to an Android NDK install"; exit 1; } docker run --rm \ -u "$$(id -u):$$(id -g)" \ -v "$(CURDIR):$(CURDIR)" \ -w "$(CURDIR)" \ -v "$(ANDROID_SDK_ROOT):$(ANDROID_SDK_ROOT)" \ -v "$(ANDROID_NDK_ROOT):$(ANDROID_NDK_ROOT)" \ -e ANDROID_SDK_ROOT="$(ANDROID_SDK_ROOT)" \ -e ANDROID_NDK_ROOT="$(ANDROID_NDK_ROOT)" \ -e JAVA_HOME=/opt/java/openjdk \ $(APK_BUILD_IMAGE) \ make apk-local JAVA_HOME=/opt/java/openjdk apk-container-image: @command -v docker >/dev/null 2>&1 || { echo "docker is required for apk-container-image"; exit 1; } docker build --load -t $(APK_BUILD_IMAGE) packaging/docker/android-apk android/keepassgo-android.jar: $(shell find androidsrc -type f | sort) @test -x "$(JAVA_HOME)/bin/javac" || { echo "JAVA_HOME must point to a working JDK install"; exit 1; } @test -f "$(ANDROID_SDK_ROOT)/platforms/android-$(ANDROID_TARGET_SDK)/android.jar" || { echo "Android platform android-$(ANDROID_TARGET_SDK) is missing"; exit 1; } @mkdir -p android @sh -ec 'tmpdir=$$(mktemp -d); \ trap "rm -rf $$tmpdir" EXIT; \ "$(JAVA_HOME)/bin/javac" \ -classpath "$(ANDROID_SDK_ROOT)/platforms/android-$(ANDROID_TARGET_SDK)/android.jar" \ -d "$$tmpdir" \ $$(find androidsrc -name '\''*.java'\'' | sort); \ "$(JAVA_HOME)/bin/jar" --create --file "$$(pwd)/android/keepassgo-android.jar" -C "$$tmpdir" .' archlinux-pkgbuild: $(ARCH_PKG_TMPL) Makefile @mkdir -p "$(ARCH_PKG_DIR)" @sed \ -e 's|@PKGVER@|$(ARCH_PKGVER)|g' \ -e 's|@REPO_DIR@|$(ARCH_REPO_DIR)|g' \ "$(ARCH_PKG_TMPL)" > "$(ARCH_PKGBUILD)" browser-bridge: go build ./cmd/keepassgo-browser-bridge browser-extension-validate: @command -v xvfb-run >/dev/null 2>&1 || { echo "xvfb-run is required"; exit 1; } @command -v firefox >/dev/null 2>&1 || { echo "firefox is required"; exit 1; } @command -v openssl >/dev/null 2>&1 || { echo "openssl is required"; exit 1; } xvfb-run -a python scripts/validate_browser_extension.py $(if $(BROWSER),--browser $(BROWSER),)