From e5aacec1a5c072ba51152bb7a4cadb5f06254060 Mon Sep 17 00:00:00 2001 From: Chummy Date: Sat, 28 Feb 2026 09:49:15 +0000 Subject: [PATCH] feat(android): add mode-aware source-build self-check --- docs/android-setup.md | 6 +++ scripts/android/termux_source_build_check.sh | 56 ++++++++++++++++++-- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/docs/android-setup.md b/docs/android-setup.md index 367446726..4f8f9f4a8 100644 --- a/docs/android-setup.md +++ b/docs/android-setup.md @@ -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 ``` diff --git a/scripts/android/termux_source_build_check.sh b/scripts/android/termux_source_build_check.sh index 609d69298..8c8856adc 100755 --- a/scripts/android/termux_source_build_check.sh +++ b/scripts/android/termux_source_build_check.sh @@ -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 ] [--run-cargo-check] + scripts/android/termux_source_build_check.sh [--target ] [--mode ] [--run-cargo-check] Options: --target Android Rust target (default: aarch64-linux-android) Supported: aarch64-linux-android, armv7-linux-androideabi + --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 --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)"