114 lines
3.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$SCRIPT_DIR"
ROOT_DIR="$(cd -- "$SCRIPT_DIR/../.." && pwd)"
java_major_version() {
local java_bin="$1"
local version_line
version_line="$($java_bin -version 2>&1 | head -n 1)"
printf '%s\n' "$version_line" | sed -E 's/.*version "([0-9]+)(\.[0-9]+)?.*/\1/'
}
is_supported_java() {
local java_bin="$1"
local major
major="$(java_major_version "$java_bin")"
[[ "$major" =~ ^[0-9]+$ ]] && [ "$major" -ge 17 ] && [ "$major" -le 21 ]
}
try_set_java_home() {
local candidate
if [ -n "${JAVA_HOME:-}" ] && [ -x "$JAVA_HOME/bin/java" ] && is_supported_java "$JAVA_HOME/bin/java"; then
return 0
fi
if command -v /usr/libexec/java_home >/dev/null 2>&1; then
for candidate in 21 17; do
if JAVA_HOME_CANDIDATE="$(/usr/libexec/java_home -v "$candidate" 2>/dev/null)" \
&& [ -x "$JAVA_HOME_CANDIDATE/bin/java" ] \
&& is_supported_java "$JAVA_HOME_CANDIDATE/bin/java"; then
export JAVA_HOME="$JAVA_HOME_CANDIDATE"
export PATH="$JAVA_HOME/bin:$PATH"
echo "Using JAVA_HOME=$JAVA_HOME"
return 0
fi
done
fi
for candidate in \
/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home \
/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home \
/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home \
/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home \
/usr/lib/jvm/java-21-openjdk \
/usr/lib/jvm/java-17-openjdk \
/usr/lib/jvm/java-21-openjdk-amd64 \
/usr/lib/jvm/java-17-openjdk-amd64; do
if [ -x "$candidate/bin/java" ] && is_supported_java "$candidate/bin/java"; then
export JAVA_HOME="$candidate"
export PATH="$JAVA_HOME/bin:$PATH"
echo "Using JAVA_HOME=$JAVA_HOME"
return 0
fi
done
return 1
}
if ! try_set_java_home; then
if ! command -v java >/dev/null 2>&1; then
cat >&2 <<'EOF'
ERROR: java was not found in PATH.
Please install JDK 17 or JDK 21, then rerun this script.
EOF
exit 1
fi
fi
if ! command -v java >/dev/null 2>&1; then
cat >&2 <<'EOF'
ERROR: java was not found in PATH.
Please install JDK 17 or JDK 21, then rerun this script.
EOF
exit 1
fi
JAVA_VERSION_OUTPUT="$(java -version 2>&1 | head -n 1)"
JAVA_VERSION="$(java_major_version java)"
if ! [[ "$JAVA_VERSION" =~ ^[0-9]+$ ]]; then
echo "ERROR: Unable to parse Java version from: $JAVA_VERSION_OUTPUT" >&2
exit 1
elif [ "$JAVA_VERSION" -lt 17 ] || [ "$JAVA_VERSION" -gt 21 ]; then
cat >&2 <<EOF
ERROR: This project currently requires JDK 17 or JDK 21.
Found: $JAVA_VERSION_OUTPUT
Kotlin 2.1.0 / this Gradle setup fails with newer Java versions such as 26.0.1.
Install a supported JDK and rerun, for example on macOS:
brew install --cask temurin@21
export JAVA_HOME=\$(/usr/libexec/java_home -v 21)
If JDK 17/21 is already installed, set JAVA_HOME before running build.sh.
EOF
exit 1
fi
if [ -x "$ROOT_DIR/gradlew" ]; then
GRADLE_CMD=("$ROOT_DIR/gradlew")
elif command -v gradle >/dev/null 2>&1; then
GRADLE_CMD=(gradle)
else
cat >&2 <<'EOF'
ERROR: Neither root gradlew nor system gradle was found.
Run from a checkout that contains the Gradle wrapper, or install Gradle.
EOF
exit 1
fi
cd "$PROJECT_DIR"
"${GRADLE_CMD[@]}" --no-configuration-cache build "$@"