mirror of
https://github.com/ApfelTeeSaft/OpenRoyale.git
synced 2026-08-26 19:33:32 +00:00
106 lines
3.2 KiB
Bash
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
|