2025-08-31 06:22:48 +09:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
if [[ "${NYASH_CLI_VERBOSE:-0}" == "1" ]]; then
|
|
|
|
|
set -x
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
usage() {
|
|
|
|
|
cat << USAGE
|
|
|
|
|
Usage: tools/build_llvm.sh <input.nyash> [-o <output>]
|
|
|
|
|
|
|
|
|
|
Compiles a Nyash program with the LLVM backend to an object (.o),
|
|
|
|
|
links it with the NyRT static runtime, and produces a native executable.
|
|
|
|
|
|
|
|
|
|
Options:
|
|
|
|
|
-o <output> Output executable name (default: app)
|
|
|
|
|
|
|
|
|
|
Requirements:
|
|
|
|
|
- LLVM 18 development (llvm-config-18)
|
|
|
|
|
- NyRT static runtime (crates/nyrt)
|
|
|
|
|
USAGE
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if [[ $# -lt 1 ]]; then usage; exit 1; fi
|
|
|
|
|
|
|
|
|
|
INPUT=""
|
|
|
|
|
OUT="app"
|
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
|
|
|
case "$1" in
|
|
|
|
|
-h|--help) usage; exit 0 ;;
|
|
|
|
|
-o) OUT="$2"; shift 2 ;;
|
|
|
|
|
*) INPUT="$1"; shift ;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
if [[ ! -f "$INPUT" ]]; then
|
|
|
|
|
echo "error: input file not found: $INPUT" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if ! command -v llvm-config-18 >/dev/null 2>&1; then
|
|
|
|
|
echo "error: llvm-config-18 not found (install LLVM 18 dev)." >&2
|
|
|
|
|
exit 2
|
|
|
|
|
fi
|
|
|
|
|
|
2025-09-14 04:51:33 +09:00
|
|
|
echo "[1/4] Building nyash (feature selectable) ..."
|
2025-09-01 23:44:34 +09:00
|
|
|
_LLVMPREFIX=$(llvm-config-18 --prefix)
|
2025-09-14 04:51:33 +09:00
|
|
|
# Select LLVM feature: default harness (llvm), or legacy inkwell when NYASH_LLVM_FEATURE=llvm-inkwell-legacy
|
|
|
|
|
LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm}
|
2025-09-14 17:09:16 +09:00
|
|
|
# Use 24 threads for parallel build
|
2025-09-14 00:44:28 +09:00
|
|
|
LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \
|
2025-09-14 17:09:16 +09:00
|
|
|
CARGO_INCREMENTAL=1 cargo build --release -j 24 -p nyash-rust --features "$LLVM_FEATURE" >/dev/null
|
2025-08-31 06:22:48 +09:00
|
|
|
|
|
|
|
|
echo "[2/4] Emitting object (.o) via LLVM backend ..."
|
2025-09-01 23:44:34 +09:00
|
|
|
# Default object output path under target/aot_objects
|
|
|
|
|
mkdir -p "$PWD/target/aot_objects"
|
|
|
|
|
stem=$(basename "$INPUT")
|
|
|
|
|
stem=${stem%.nyash}
|
|
|
|
|
OBJ="${NYASH_LLVM_OBJ_OUT:-$PWD/target/aot_objects/${stem}.o}"
|
|
|
|
|
if [[ "${NYASH_LLVM_SKIP_EMIT:-0}" != "1" ]]; then
|
|
|
|
|
rm -f "$OBJ"
|
2025-09-14 04:51:33 +09:00
|
|
|
if [[ "${NYASH_LLVM_FEATURE:-llvm}" == "llvm-inkwell-legacy" ]]; then
|
|
|
|
|
# Legacy path: do not use harness
|
|
|
|
|
NYASH_LLVM_OBJ_OUT="$OBJ" LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \
|
|
|
|
|
./target/release/nyash --backend llvm "$INPUT" >/dev/null || true
|
|
|
|
|
else
|
|
|
|
|
# Harness path
|
|
|
|
|
NYASH_LLVM_OBJ_OUT="$OBJ" NYASH_LLVM_USE_HARNESS=1 LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \
|
|
|
|
|
./target/release/nyash --backend llvm "$INPUT" >/dev/null || true
|
|
|
|
|
fi
|
2025-09-01 23:44:34 +09:00
|
|
|
fi
|
2025-08-31 06:22:48 +09:00
|
|
|
if [[ ! -f "$OBJ" ]]; then
|
|
|
|
|
echo "error: object not generated: $OBJ" >&2
|
2025-09-01 23:44:34 +09:00
|
|
|
echo "hint: you can pre-generate it (e.g. via --run-task smoke_obj_*) and set NYASH_LLVM_SKIP_EMIT=1" >&2
|
2025-08-31 06:22:48 +09:00
|
|
|
exit 3
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo "[3/4] Building NyRT static runtime ..."
|
2025-09-01 23:44:34 +09:00
|
|
|
if [[ "${NYASH_LLVM_SKIP_NYRT_BUILD:-0}" == "1" ]]; then
|
|
|
|
|
echo " Skipping NyRT build (NYASH_LLVM_SKIP_NYRT_BUILD=1)"
|
|
|
|
|
else
|
2025-09-14 17:09:16 +09:00
|
|
|
# Use 24 threads for parallel build
|
|
|
|
|
( cd crates/nyrt && cargo build --release -j 24 >/dev/null )
|
2025-09-01 23:44:34 +09:00
|
|
|
fi
|
2025-08-31 06:22:48 +09:00
|
|
|
|
|
|
|
|
echo "[4/4] Linking $OUT ..."
|
|
|
|
|
cc "$OBJ" \
|
2025-09-06 06:24:08 +09:00
|
|
|
-L target/release \
|
2025-08-31 06:22:48 +09:00
|
|
|
-L crates/nyrt/target/release \
|
|
|
|
|
-Wl,--whole-archive -lnyrt -Wl,--no-whole-archive \
|
|
|
|
|
-lpthread -ldl -lm -o "$OUT"
|
|
|
|
|
|
|
|
|
|
echo "✅ Done: $OUT"
|
|
|
|
|
echo " (runtime requires nyash.toml and plugin .so per config)"
|