Files
OpenRoyale/tools/scripts/fetch_ndk_portable.sh
T
2026-07-09 07:40:42 +02:00

106 lines
3.2 KiB
Bash

#!/usr/bin/env bash
# fetch_ndk_portable.sh - portable Android NDK/CMake using portable SDK + Java.
# Installs into the parent folder of this script by default:
# ../android-sdk
# ../java
# No global packages are installed and no shell profile is modified.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PORTABLE_ROOT="$(cd "${PORTABLE_ROOT:-$SCRIPT_DIR/..}" && pwd)"
SDK_ROOT="${ANDROID_SDK_ROOT:-${ANDROID_HOME:-$PORTABLE_ROOT/android-sdk}}"
JAVA_ROOT="${JAVA_HOME:-$PORTABLE_ROOT/java}"
NDK_PKG="${NDK_PKG:-ndk;26.3.11579264}" # r26d: clang + libc++
CMAKE_PKG="${CMAKE_PKG:-cmake;3.22.1}"
# Android sdkmanager currently works well with JDK 17. Override if needed:
# JDK_MAJOR=21 ./fetch_ndk_portable.sh
JDK_MAJOR="${JDK_MAJOR:-17}"
JDK_API_URL="${JDK_API_URL:-https://api.adoptium.net/v3/binary/latest/${JDK_MAJOR}/ga/linux/x64/jdk/hotspot/normal/eclipse?project=jdk}"
need_cmd() {
command -v "$1" >/dev/null 2>&1 || {
echo "[!] Missing required command: $1" >&2
echo " Install it once with your OS package manager, then rerun this script." >&2
exit 1
}
}
fetch_java() {
if [ -x "$JAVA_ROOT/bin/java" ]; then
echo "[*] Portable Java already exists: $JAVA_ROOT"
return
fi
need_cmd curl
need_cmd tar
echo "[*] Downloading portable Eclipse Temurin JDK $JDK_MAJOR ..."
tmp="$(mktemp -d)"
curl -fL "$JDK_API_URL" -o "$tmp/jdk.tar.gz"
rm -rf "$JAVA_ROOT"
mkdir -p "$JAVA_ROOT"
tar -xzf "$tmp/jdk.tar.gz" -C "$tmp"
jdk_dir="$(find "$tmp" -maxdepth 1 -type d -name 'jdk*' | head -n 1)"
if [ -z "$jdk_dir" ]; then
echo "[!] Could not find extracted JDK directory." >&2
exit 1
fi
shopt -s dotglob
mv "$jdk_dir"/* "$JAVA_ROOT"/
shopt -u dotglob
rm -rf "$tmp"
}
fetch_sdk_if_needed() {
if [ -x "$SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then
return
fi
if [ -x "$SCRIPT_DIR/fetch_sdk_portable.sh" ]; then
echo "[*] SDK manager not found; running fetch_sdk_portable.sh first ..."
PORTABLE_ROOT="$PORTABLE_ROOT" \
ANDROID_SDK_ROOT="$SDK_ROOT" \
JAVA_HOME="$JAVA_ROOT" \
"$SCRIPT_DIR/fetch_sdk_portable.sh"
elif [ -x "$SCRIPT_DIR/fetch_sdk.sh" ]; then
echo "[*] SDK manager not found; running fetch_sdk.sh first ..."
PORTABLE_ROOT="$PORTABLE_ROOT" \
ANDROID_SDK_ROOT="$SDK_ROOT" \
JAVA_HOME="$JAVA_ROOT" \
"$SCRIPT_DIR/fetch_sdk.sh"
else
echo "[!] sdkmanager not found at: $SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" >&2
echo " Put fetch_sdk_portable.sh next to this script and run again." >&2
exit 1
fi
}
fetch_java
export JAVA_HOME="$JAVA_ROOT"
export PATH="$JAVA_HOME/bin:$PATH"
fetch_sdk_if_needed
SDKM="$SDK_ROOT/cmdline-tools/latest/bin/sdkmanager"
"$SDKM" --sdk_root="$SDK_ROOT" "$NDK_PKG" "$CMAKE_PKG"
NDK_DIR="$SDK_ROOT/ndk/${NDK_PKG#ndk;}"
CMAKE_DIR="$SDK_ROOT/${CMAKE_PKG/;//}"
cat <<OUT
[+] Portable Android NDK ready at: $NDK_DIR
[+] Portable CMake ready at: $CMAKE_DIR
[+] Portable Java ready at: $JAVA_ROOT
Use this in your current shell:
export JAVA_HOME="$JAVA_ROOT"
export ANDROID_SDK_ROOT="$SDK_ROOT"
export ANDROID_HOME="$SDK_ROOT"
export ANDROID_NDK_HOME="$NDK_DIR"
export PATH="\$JAVA_HOME/bin:\$ANDROID_SDK_ROOT/platform-tools:$CMAKE_DIR/bin:\$PATH"
OUT