forked from rhasspy/openWakeWord-cpp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile-toAndroidTermuxFromPC
More file actions
127 lines (112 loc) · 4.27 KB
/
Makefile-toAndroidTermuxFromPC
File metadata and controls
127 lines (112 loc) · 4.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
.PHONY: android-exe clean help
# Build Android shared library for all ABIs from macOS (or any PC).
# Usage:
# make -f Makefile-toAndroidTermuxFromPC android ANDROID_SDK_ROOT=/path/to/Android/Sdk
# If not provided, it uses ANDROID_SDK_ROOT or ANDROID_HOME from env.
# --- Android SDK path handling ---
ANDROID_SDK_ROOT ?=
ANDROID_HOME ?=
SDK := $(strip $(firstword $(ANDROID_SDK_ROOT) $(ANDROID_HOME)))
# --- NDK selection: newest available in $(SDK)/ndk/* ---
NDK_DIR := $(shell if [ -n "$(SDK)" ] && [ -d "$(SDK)/ndk" ]; then ls -1d "$(SDK)/ndk/"* 2>/dev/null | sort -V | tail -n 1; fi)
# --- Project paths ---
ROOT_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
SRC_DIR := $(ROOT_DIR)/src
ANDROID_DIR := $(SRC_DIR)/android
PARENT_DIR := $(abspath $(ROOT_DIR)/..)
ORT_VERSION ?= 1.23.2
ONNXRUNTIME_ANDROID_DIR := $(PARENT_DIR)/onnxruntime-android/$(ORT_VERSION)
# --- Build output ---
BUILD_DIR := $(PARENT_DIR)/build-android
# --- Defaults ---
ABIS ?= arm64-v8a armeabi-v7a x86_64
MIN_SDK ?= 26
# NDK toolchain (macOS/Linux/Windows)
HOST_OS := $(shell uname -s 2>/dev/null)
ifeq ($(findstring Darwin,$(HOST_OS)),Darwin)
NDK_HOST_TAGS := darwin-arm64 darwin-x86_64
else ifeq ($(findstring Linux,$(HOST_OS)),Linux)
NDK_HOST_TAGS := linux-x86_64 linux-arm64
else
NDK_HOST_TAGS := windows-x86_64 windows
endif
NDK_TOOLCHAIN := $(firstword $(foreach tag,$(NDK_HOST_TAGS),$(wildcard $(NDK_DIR)/toolchains/llvm/prebuilt/$(tag))))
# Common flags
CXXFLAGS_COMMON := -std=c++20 -Wall -Wextra -fPIC -O2 -DTERMUX=1
help:
@echo "Targets:"
@echo " android-exe - build openwakeword executable for ABIs: $(ABIS)"
@echo " clean - remove $(BUILD_DIR)"
@echo
@echo "Variables:"
@echo " ANDROID_SDK_ROOT=/path/to/Android/Sdk (or ANDROID_HOME env fallback)"
@echo " ABIS=\"arm64-v8a armeabi-v7a x86_64\""
@echo " MIN_SDK=26 (NDK API level used for clang target)"
@echo " ORT_VERSION=1.23.2 (onnxruntime-android/<ver>/... directory to link against)"
@echo ""
@echo "Output paths:"
@echo " $(BUILD_DIR)/<ABI>/openwakeword"
android-exe:
@if [ -z "$(SDK)" ]; then \
echo "[ERROR] Android SDK path not set."; \
echo " Pass ANDROID_SDK_ROOT=/path/to/Android/Sdk or set ANDROID_SDK_ROOT/ANDROID_HOME env."; \
exit 2; \
fi
@if [ ! -d "$(SDK)" ]; then \
echo "[ERROR] Android SDK not found at: $(SDK)"; \
exit 2; \
fi
@if [ -z "$(NDK_DIR)" ]; then \
echo "[ERROR] No NDK found in $(SDK)/ndk/."; \
echo " Install it via Android Studio SDK Manager (NDK (Side by side))."; \
exit 2; \
fi
@if [ ! -d "$(NDK_TOOLCHAIN)" ]; then \
echo "[ERROR] NDK toolchain not found (expected): $(NDK_TOOLCHAIN)"; \
echo " NDK prebuilt should be under: $(NDK_DIR)/toolchains/llvm/prebuilt/"; \
exit 2; \
fi
@if [ ! -d "$(ONNXRUNTIME_ANDROID_DIR)" ]; then \
echo "[ERROR] Missing $(ONNXRUNTIME_ANDROID_DIR)."; \
echo " Expected structure:"; \
echo " onnxruntime-android/$(ORT_VERSION)/jni/<ABI>/libonnxruntime.so"; \
echo " onnxruntime-android/$(ORT_VERSION)/headers"; \
exit 2; \
fi
@mkdir -p "$(BUILD_DIR)"
@echo "[LOG] Using SDK: $(SDK)"
@echo "[LOG] Using NDK: $(NDK_DIR)"
@echo "[LOG] ABIs: $(ABIS)"
@for abi in $(ABIS); do \
echo "[LOG] Building $$abi..."; \
$(MAKE) -f $(lastword $(MAKEFILE_LIST)) _android_exe_one ABI=$$abi || exit $$?; \
done
@echo "[LOG] Done. Outputs in: $(BUILD_DIR)/<ABI>/openwakeword"
_android_exe_one:
@if [ -z "$(ABI)" ]; then \
echo "[ERROR] ABI is required"; \
exit 2; \
fi
@mkdir -p "$(BUILD_DIR)/$(ABI)"
@case "$(ABI)" in \
arm64-v8a) TARGET=aarch64-linux-android; ANDROID_API=$(MIN_SDK); ;; \
armeabi-v7a) TARGET=armv7a-linux-androideabi; ANDROID_API=$(MIN_SDK); ;; \
x86_64) TARGET=x86_64-linux-android; ANDROID_API=$(MIN_SDK); ;; \
*) echo "[ERROR] Unsupported ABI: $(ABI)"; exit 2;; \
esac; \
CXX="$(NDK_TOOLCHAIN)/bin/$$TARGET$$ANDROID_API-clang++"; \
ONNX_JNI_DIR="$(ONNXRUNTIME_ANDROID_DIR)/jni/$(ABI)"; \
ONNX_LIB="$$ONNX_JNI_DIR/libonnxruntime.so"; \
if [ ! -f "$$ONNX_LIB" ]; then \
echo "[ERROR] Missing ONNX Runtime for $(ABI): $$ONNX_LIB"; \
exit 2; \
fi; \
"$$CXX" $(CXXFLAGS_COMMON) \
-I"$(ONNXRUNTIME_ANDROID_DIR)/headers" \
-I"$(SRC_DIR)" \
"$(SRC_DIR)/main.cpp" \
"$$ONNX_LIB" \
-llog -landroid -laaudio \
-o "$(BUILD_DIR)/$(ABI)/openwakeword"
clean:
rm -rf "$(BUILD_DIR)"