177 lines
8.7 KiB
Makefile
177 lines
8.7 KiB
Makefile
# RKNnoVPN — Local Build Commands
|
|
# Requires: Go 1.22+, Android SDK, JDK 17
|
|
|
|
SINGBOX_VERSION ?= stable
|
|
SINGBOX_RESOLVED_VERSION := $(shell if [ "$(SINGBOX_VERSION)" = "stable" ]; then gh release view --repo SagerNet/sing-box --json tagName --jq .tagName 2>/dev/null | sed 's/^v//'; elif [ "$(SINGBOX_VERSION)" = "latest" ] || [ "$(SINGBOX_VERSION)" = "alpha" ] || [ "$(SINGBOX_VERSION)" = "prerelease" ]; then gh release list --repo SagerNet/sing-box --limit 1 --json tagName --jq '.[0].tagName' 2>/dev/null | sed 's/^v//'; else echo "$(SINGBOX_VERSION)" | sed 's/^v//'; fi)
|
|
VERSION := $(shell git describe --tags --always 2>/dev/null || echo "dev")
|
|
VERSION_SEMVER := $(shell printf '%s\n' "$(VERSION)" | sed -nE 's/^v([0-9]+)\.([0-9]+)\.([0-9]+)(-([0-9]+)-g[0-9a-fA-F]+)?$$/\1 \2 \3 \5/p')
|
|
VERSION_CODE := $(shell set -- $(VERSION_SEMVER); if [ "$$#" -ge 3 ]; then commits=$${4:-0}; echo $$(( $$1 * 1000 + $$2 * 100 + $$3 + $$commits )); else echo 0; fi)
|
|
OUT_DIR := out
|
|
MODULE_DIR := module
|
|
LAB_APK ?= $(OUT_DIR)/rknnovpn-$(VERSION)-panel.apk
|
|
LAB_MODULE ?= $(OUT_DIR)/rknnovpn-$(VERSION)-module.zip
|
|
SINGBOX_SRC_DIR := /tmp/sing-box-$(SINGBOX_RESOLVED_VERSION)
|
|
SINGBOX_TAGS := with_quic,with_wireguard,with_utls,with_clash_api,badlinkname,tfogo_checklinkname0
|
|
SINGBOX_LDFLAGS := -X 'github.com/sagernet/sing-box/constant.Version=$(SINGBOX_RESOLVED_VERSION)' -X 'internal/godebug.defaultGODEBUG=multipathtcp=0' -checklinkname=0 -s -w -buildid=
|
|
ANDROID_API ?= 23
|
|
ANDROID_NDK_HOME ?= $(ANDROID_NDK_ROOT)
|
|
ANDROID_NDK_HOST ?= linux-x86_64
|
|
ANDROID_NDK_TOOLCHAIN := $(ANDROID_NDK_HOME)/toolchains/llvm/prebuilt/$(ANDROID_NDK_HOST)/bin
|
|
ANDROID_CC_ARM64 := $(ANDROID_NDK_TOOLCHAIN)/aarch64-linux-android$(ANDROID_API)-clang
|
|
ANDROID_CC_ARMV7 := $(ANDROID_NDK_TOOLCHAIN)/armv7a-linux-androideabi$(ANDROID_API)-clang
|
|
|
|
.PHONY: all check-version daemon daemon-arm64 daemon-armv7 singbox singbox-src singbox-arm64 singbox-armv7 apk module clean lab-collect lab-smoke lab-smoke-reset lab-emulator-prepare-insecure-adb lab-emulator-connect lab-emulator-diagnostics-report lab-emulator-collect lab-emulator-smoke lab-emulator-smoke-start lab-emulator-install
|
|
|
|
all: daemon singbox module apk
|
|
@echo "Build complete. Artifacts in $(OUT_DIR)/"
|
|
|
|
check-version:
|
|
@if [ -z "$(VERSION_SEMVER)" ]; then \
|
|
echo "VERSION=$(VERSION) is not a strict vMAJOR.MINOR.PATCH or vMAJOR.MINOR.PATCH-N-gHASH value"; \
|
|
exit 1; \
|
|
fi
|
|
@set -- $(VERSION_SEMVER); commits=$${4:-0}; \
|
|
if [ "$$commits" -gt 99 ]; then \
|
|
echo "VERSION=$(VERSION) has $$commits commits after the tag; versionCode reserves two digits for post-tag builds"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# === Go Daemon (Android ABIs) ===
|
|
daemon: daemon-arm64 daemon-armv7
|
|
@echo " -> $(OUT_DIR)/arm64/daemon, $(OUT_DIR)/arm64/daemonctl"
|
|
@echo " -> $(OUT_DIR)/armv7/daemon, $(OUT_DIR)/armv7/daemonctl"
|
|
|
|
daemon-arm64:
|
|
@echo "=== Building daemon (arm64) ==="
|
|
@mkdir -p $(OUT_DIR)/arm64
|
|
cd daemon && CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build \
|
|
-ldflags="-s -w -X main.Version=$(VERSION)" \
|
|
-o ../$(OUT_DIR)/arm64/daemon ./cmd/daemon
|
|
cd daemon && CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build \
|
|
-ldflags="-s -w -X main.Version=$(VERSION)" \
|
|
-o ../$(OUT_DIR)/arm64/daemonctl ./cmd/daemonctl
|
|
|
|
daemon-armv7:
|
|
@echo "=== Building daemon (armv7 / armeabi-v7a) ==="
|
|
@mkdir -p $(OUT_DIR)/armv7
|
|
cd daemon && CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build \
|
|
-ldflags="-s -w -X main.Version=$(VERSION)" \
|
|
-o ../$(OUT_DIR)/armv7/daemon ./cmd/daemon
|
|
cd daemon && CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build \
|
|
-ldflags="-s -w -X main.Version=$(VERSION)" \
|
|
-o ../$(OUT_DIR)/armv7/daemonctl ./cmd/daemonctl
|
|
|
|
# === Build Android sing-box ===
|
|
singbox: singbox-arm64 singbox-armv7
|
|
@echo " -> $(OUT_DIR)/arm64/sing-box"
|
|
@echo " -> $(OUT_DIR)/armv7/sing-box"
|
|
|
|
singbox-src:
|
|
@if [ -z "$(SINGBOX_RESOLVED_VERSION)" ]; then \
|
|
echo "Failed to resolve sing-box release. Set SINGBOX_VERSION explicitly, e.g. make singbox SINGBOX_VERSION=1.14.0-alpha.16"; \
|
|
exit 1; \
|
|
fi
|
|
@if [ ! -d "$(SINGBOX_SRC_DIR)/.git" ]; then \
|
|
echo "=== Fetching sing-box v$(SINGBOX_RESOLVED_VERSION) source ==="; \
|
|
rm -rf "$(SINGBOX_SRC_DIR)"; \
|
|
git clone --depth 1 --branch "v$(SINGBOX_RESOLVED_VERSION)" https://github.com/SagerNet/sing-box.git "$(SINGBOX_SRC_DIR)"; \
|
|
fi
|
|
|
|
singbox-arm64: singbox-src
|
|
@echo "=== Building Android sing-box v$(SINGBOX_RESOLVED_VERSION) (arm64) ==="
|
|
@if [ -z "$(ANDROID_NDK_HOME)" ] || [ ! -x "$(ANDROID_CC_ARM64)" ]; then \
|
|
echo "Android NDK clang not found. Set ANDROID_NDK_HOME or ANDROID_NDK_ROOT"; exit 1; \
|
|
fi
|
|
@mkdir -p $(OUT_DIR)/arm64
|
|
cd $(SINGBOX_SRC_DIR) && CC="$(ANDROID_CC_ARM64)" CGO_ENABLED=1 GOOS=android GOARCH=arm64 go build \
|
|
-trimpath -tags "$(SINGBOX_TAGS)" \
|
|
-ldflags "$(SINGBOX_LDFLAGS)" \
|
|
-o $(abspath $(OUT_DIR))/arm64/sing-box ./cmd/sing-box
|
|
chmod 755 $(OUT_DIR)/arm64/sing-box
|
|
@if ! readelf -l $(OUT_DIR)/arm64/sing-box | grep -q "Requesting program interpreter: /system/bin/linker64"; then \
|
|
echo "sing-box arm64 is not an Android PIE binary"; readelf -l $(OUT_DIR)/arm64/sing-box; exit 1; \
|
|
fi
|
|
|
|
singbox-armv7: singbox-src
|
|
@echo "=== Building Android sing-box v$(SINGBOX_RESOLVED_VERSION) (armv7 / armeabi-v7a) ==="
|
|
@if [ -z "$(ANDROID_NDK_HOME)" ] || [ ! -x "$(ANDROID_CC_ARMV7)" ]; then \
|
|
echo "Android NDK clang not found. Set ANDROID_NDK_HOME or ANDROID_NDK_ROOT"; exit 1; \
|
|
fi
|
|
@mkdir -p $(OUT_DIR)/armv7
|
|
cd $(SINGBOX_SRC_DIR) && CC="$(ANDROID_CC_ARMV7)" CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 go build \
|
|
-trimpath -tags "$(SINGBOX_TAGS)" \
|
|
-ldflags "$(SINGBOX_LDFLAGS)" \
|
|
-o $(abspath $(OUT_DIR))/armv7/sing-box ./cmd/sing-box
|
|
chmod 755 $(OUT_DIR)/armv7/sing-box
|
|
@if ! readelf -l $(OUT_DIR)/armv7/sing-box | grep -q "Requesting program interpreter: /system/bin/linker"; then \
|
|
echo "sing-box armv7 is not an Android PIE binary"; readelf -l $(OUT_DIR)/armv7/sing-box; exit 1; \
|
|
fi
|
|
|
|
# === Magisk Module ZIP ===
|
|
module: check-version daemon singbox
|
|
@echo "=== Building Magisk module ZIP ==="
|
|
@mkdir -p $(MODULE_DIR)/binaries/arm64 $(MODULE_DIR)/binaries/armv7
|
|
cp $(OUT_DIR)/arm64/daemon $(OUT_DIR)/arm64/daemonctl $(OUT_DIR)/arm64/sing-box $(MODULE_DIR)/binaries/arm64/
|
|
cp $(OUT_DIR)/armv7/daemon $(OUT_DIR)/armv7/daemonctl $(OUT_DIR)/armv7/sing-box $(MODULE_DIR)/binaries/armv7/
|
|
rm -rf $(MODULE_DIR)/binaries/arm64-v8a $(MODULE_DIR)/binaries/armeabi-v7a
|
|
chmod 755 $(MODULE_DIR)/binaries/arm64/* $(MODULE_DIR)/binaries/armv7/*
|
|
sed -i "s/^version=.*/version=$(VERSION)/" $(MODULE_DIR)/module.prop
|
|
sed -i "s/^versionCode=.*/versionCode=$(VERSION_CODE)/" $(MODULE_DIR)/module.prop
|
|
cd $(MODULE_DIR) && zip -r ../$(OUT_DIR)/rknnovpn-$(VERSION)-module.zip . \
|
|
-x "*.git*" "*.DS_Store"
|
|
@echo " -> $(OUT_DIR)/rknnovpn-$(VERSION)-module.zip"
|
|
|
|
# === Android APK ===
|
|
apk:
|
|
@echo "=== Building APK ==="
|
|
cd app && ./gradlew assembleDebug --no-daemon
|
|
@mkdir -p $(OUT_DIR)
|
|
cp app/app/build/outputs/apk/debug/*.apk $(OUT_DIR)/rknnovpn-$(VERSION)-panel.apk
|
|
@echo " -> $(OUT_DIR)/rknnovpn-$(VERSION)-panel.apk"
|
|
|
|
# === Test daemon (host arch, for development) ===
|
|
daemon-host:
|
|
@echo "=== Building daemon (host arch, for testing) ==="
|
|
cd daemon && go build -o ../$(OUT_DIR)/daemon-host ./cmd/daemon
|
|
cd daemon && go build -o ../$(OUT_DIR)/daemonctl-host ./cmd/daemonctl
|
|
|
|
# === Go tests ===
|
|
test:
|
|
cd daemon && go test ./...
|
|
|
|
# === Rooted device lab ===
|
|
lab-collect:
|
|
ADB="$(ADB)" ADB_SERIAL="$(ADB_SERIAL)" OUT_ROOT="$(OUT_ROOT)" tools/device_lab/collect.sh
|
|
|
|
lab-smoke:
|
|
ADB="$(ADB)" ADB_SERIAL="$(ADB_SERIAL)" OUT_ROOT="$(OUT_ROOT)" tools/device_lab/smoke.sh
|
|
|
|
lab-smoke-reset:
|
|
ADB="$(ADB)" ADB_SERIAL="$(ADB_SERIAL)" OUT_ROOT="$(OUT_ROOT)" tools/device_lab/smoke.sh --allow-reset
|
|
|
|
lab-emulator-prepare-insecure-adb:
|
|
tools/device_lab/lineage_emulator.sh prepare-insecure-adb --vm-dir "$(VM_DIR)"
|
|
|
|
lab-emulator-connect:
|
|
ADB="$(ADB)" ADB_SERIAL="$(ADB_SERIAL)" OUT_ROOT="$(OUT_ROOT)" tools/device_lab/lineage_emulator.sh connect
|
|
|
|
lab-emulator-diagnostics-report:
|
|
ADB="$(ADB)" ADB_SERIAL="$(ADB_SERIAL)" OUT_ROOT="$(OUT_ROOT)" tools/device_lab/lineage_emulator.sh diagnostics-report
|
|
|
|
lab-emulator-collect:
|
|
ADB="$(ADB)" ADB_SERIAL="$(ADB_SERIAL)" OUT_ROOT="$(OUT_ROOT)" tools/device_lab/lineage_emulator.sh collect
|
|
|
|
lab-emulator-smoke:
|
|
ADB="$(ADB)" ADB_SERIAL="$(ADB_SERIAL)" OUT_ROOT="$(OUT_ROOT)" tools/device_lab/lineage_emulator.sh smoke
|
|
|
|
lab-emulator-smoke-start:
|
|
ADB="$(ADB)" ADB_SERIAL="$(ADB_SERIAL)" OUT_ROOT="$(OUT_ROOT)" tools/device_lab/lineage_emulator.sh smoke --allow-start --stop-after-start
|
|
|
|
lab-emulator-install:
|
|
ADB="$(ADB)" ADB_SERIAL="$(ADB_SERIAL)" OUT_ROOT="$(OUT_ROOT)" tools/device_lab/lineage_emulator.sh install --apk "$(LAB_APK)" --module "$(LAB_MODULE)" --allow-module-install --reboot-after-install
|
|
|
|
# === Clean ===
|
|
clean:
|
|
rm -rf $(OUT_DIR)
|
|
rm -rf $(MODULE_DIR)/binaries
|
|
cd app && ./gradlew clean 2>/dev/null || true
|