feat(android): add mode-aware source-build self-check

This commit is contained in:
Chummy 2026-02-28 09:49:15 +00:00 committed by Chum Yin
parent bebb881b5b
commit e5aacec1a5
2 changed files with 58 additions and 4 deletions

View File

@ -127,6 +127,12 @@ Use the built-in checker to validate linker/toolchain setup before long builds:
# From repo root
scripts/android/termux_source_build_check.sh --target aarch64-linux-android
# Force Termux-native diagnostics
scripts/android/termux_source_build_check.sh --target aarch64-linux-android --mode termux-native
# Force desktop NDK-cross diagnostics
scripts/android/termux_source_build_check.sh --target aarch64-linux-android --mode ndk-cross
# Run an actual cargo check after environment validation
scripts/android/termux_source_build_check.sh --target aarch64-linux-android --run-cargo-check
```

View File

@ -3,15 +3,20 @@ set -euo pipefail
TARGET="aarch64-linux-android"
RUN_CARGO_CHECK=0
MODE="auto"
usage() {
cat <<'EOF'
Usage:
scripts/android/termux_source_build_check.sh [--target <triple>] [--run-cargo-check]
scripts/android/termux_source_build_check.sh [--target <triple>] [--mode <auto|termux-native|ndk-cross>] [--run-cargo-check]
Options:
--target <triple> Android Rust target (default: aarch64-linux-android)
Supported: aarch64-linux-android, armv7-linux-androideabi
--mode <mode> Validation mode:
auto (default): infer from environment
termux-native: expect plain clang + no cross overrides
ndk-cross: expect NDK wrapper linker + matching CC_*
--run-cargo-check Run cargo check --locked --target <triple> --no-default-features
-h, --help Show this help
@ -47,6 +52,11 @@ while [[ $# -gt 0 ]]; do
RUN_CARGO_CHECK=1
shift
;;
--mode)
[[ $# -ge 2 ]] || die "--mode requires a value"
MODE="$2"
shift 2
;;
-h|--help)
usage
exit 0
@ -64,6 +74,13 @@ case "$TARGET" in
;;
esac
case "$MODE" in
auto|termux-native|ndk-cross) ;;
*)
die "unsupported mode '$MODE' (expected auto, termux-native, or ndk-cross)"
;;
esac
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" >/dev/null 2>&1 && pwd || pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." >/dev/null 2>&1 && pwd || pwd)"
CONFIG_FILE="$REPO_ROOT/.cargo/config.toml"
@ -79,6 +96,15 @@ if [[ -n "${TERMUX_VERSION:-}" ]] || [[ "${PREFIX:-}" == *"/com.termux/files/usr
is_termux=1
fi
effective_mode="$MODE"
if [[ "$effective_mode" == "auto" ]]; then
if [[ "$is_termux" -eq 1 ]]; then
effective_mode="termux-native"
else
effective_mode="ndk-cross"
fi
fi
extract_linker_from_config() {
[[ -f "$CONFIG_FILE" ]] || return 0
awk -v target="$TARGET" '
@ -108,10 +134,11 @@ is_executable_tool() {
log "repo: $REPO_ROOT"
log "target: $TARGET"
if [[ "$is_termux" -eq 1 ]]; then
log "environment: Termux/native"
log "environment: Termux detected"
else
log "environment: non-Termux (likely desktop/CI)"
fi
log "mode: $effective_mode"
command_exists rustup || die "rustup is not installed"
command_exists cargo || die "cargo is not installed"
@ -140,7 +167,7 @@ fi
effective_linker="${cargo_linker_override:-${config_linker:-clang}}"
log "effective linker: $effective_linker"
if [[ "$is_termux" -eq 1 ]]; then
if [[ "$effective_mode" == "termux-native" ]]; then
command_exists clang || die "clang is required in Termux. Run: pkg install -y clang pkg-config"
if [[ "${config_linker:-}" != "clang" ]]; then
@ -153,14 +180,35 @@ if [[ "$is_termux" -eq 1 ]]; then
if [[ -n "$cc_linker_override" && "$cc_linker_override" != "clang" ]]; then
warn "Termux native build usually should unset $CC_LINKER_VAR (currently '$cc_linker_override')"
fi
log "suggested fixups (termux-native):"
log " unset $CARGO_LINKER_VAR"
log " unset $CC_LINKER_VAR"
log " command -v clang"
else
if [[ -n "$cargo_linker_override" && -z "$cc_linker_override" ]]; then
warn "cross-build may still fail in cc-rs crates; consider setting $CC_LINKER_VAR=$cargo_linker_override"
fi
if [[ -n "$cargo_linker_override" ]]; then
log "suggested fixup (ndk-cross):"
log " export $CC_LINKER_VAR=\"$cargo_linker_override\""
else
warn "NDK cross mode expects $CARGO_LINKER_VAR to point to an NDK clang wrapper"
log "suggested fixup template (ndk-cross):"
log " export NDK_TOOLCHAIN=\"\$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin\""
if [[ "$TARGET" == "aarch64-linux-android" ]]; then
log " export $CARGO_LINKER_VAR=\"\$NDK_TOOLCHAIN/aarch64-linux-android21-clang\""
log " export $CC_LINKER_VAR=\"\$NDK_TOOLCHAIN/aarch64-linux-android21-clang\""
else
log " export $CARGO_LINKER_VAR=\"\$NDK_TOOLCHAIN/armv7a-linux-androideabi21-clang\""
log " export $CC_LINKER_VAR=\"\$NDK_TOOLCHAIN/armv7a-linux-androideabi21-clang\""
fi
fi
fi
if ! is_executable_tool "$effective_linker"; then
if [[ "$is_termux" -eq 1 ]]; then
if [[ "$effective_mode" == "termux-native" ]]; then
die "effective linker '$effective_linker' is not executable in PATH"
fi
warn "effective linker '$effective_linker' not found (expected for some desktop hosts without NDK toolchain)"