test(smokes): make LLVM EXE runner skip when object emit unavailable
This commit is contained in:
@ -46,9 +46,13 @@ if ! command -v llvm-config-18 >/dev/null 2>&1; then
|
|||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Use the cargo target dir when set (helps LLVM EXE smokes that build under /tmp).
|
||||||
|
CARGO_TARGET_DIR_EFFECTIVE="${CARGO_TARGET_DIR:-$PWD/target}"
|
||||||
|
|
||||||
echo "[1/4] Building hakorune (feature selectable) ..."
|
echo "[1/4] Building hakorune (feature selectable) ..."
|
||||||
# Select LLVM feature: default harness (llvm), or legacy inkwell when NYASH_LLVM_FEATURE=llvm-inkwell-legacy
|
# Select LLVM feature: default harness (llvm), or legacy inkwell when NYASH_LLVM_FEATURE=llvm-inkwell-legacy
|
||||||
LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm}
|
LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm}
|
||||||
|
|
||||||
# Use 24 threads for parallel build
|
# Use 24 threads for parallel build
|
||||||
if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then
|
if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then
|
||||||
# Legacy inkwell需要LLVM_SYS_180_PREFIX
|
# Legacy inkwell需要LLVM_SYS_180_PREFIX
|
||||||
@ -135,7 +139,7 @@ echo "[3/4] Building Nyash Kernel static runtime ..."
|
|||||||
if [[ "${NYASH_LLVM_SKIP_NYRT_BUILD:-0}" == "1" ]]; then
|
if [[ "${NYASH_LLVM_SKIP_NYRT_BUILD:-0}" == "1" ]]; then
|
||||||
echo " Skipping Nyash Kernel build (NYASH_LLVM_SKIP_NYRT_BUILD=1)"
|
echo " Skipping Nyash Kernel build (NYASH_LLVM_SKIP_NYRT_BUILD=1)"
|
||||||
else
|
else
|
||||||
NYRT_LIB_PRIMARY="target/release/libnyash_kernel.a"
|
NYRT_LIB_PRIMARY="$CARGO_TARGET_DIR_EFFECTIVE/release/libnyash_kernel.a"
|
||||||
NYRT_LIB_ALT="crates/nyash_kernel/target/release/libnyash_kernel.a"
|
NYRT_LIB_ALT="crates/nyash_kernel/target/release/libnyash_kernel.a"
|
||||||
if [[ ( -f "$NYRT_LIB_PRIMARY" || -f "$NYRT_LIB_ALT" ) && "${NYASH_LLVM_FORCE_NYRT_BUILD:-0}" != "1" ]]; then
|
if [[ ( -f "$NYRT_LIB_PRIMARY" || -f "$NYRT_LIB_ALT" ) && "${NYASH_LLVM_FORCE_NYRT_BUILD:-0}" != "1" ]]; then
|
||||||
echo " Using cached Nyash Kernel runtime (set NYASH_LLVM_FORCE_NYRT_BUILD=1 to rebuild)"
|
echo " Using cached Nyash Kernel runtime (set NYASH_LLVM_FORCE_NYRT_BUILD=1 to rebuild)"
|
||||||
@ -149,7 +153,7 @@ fi
|
|||||||
mkdir -p "$(dirname "$OUT")"
|
mkdir -p "$(dirname "$OUT")"
|
||||||
echo "[4/4] Linking $OUT ..."
|
echo "[4/4] Linking $OUT ..."
|
||||||
cc "$OBJ" \
|
cc "$OBJ" \
|
||||||
-L target/release \
|
-L "$CARGO_TARGET_DIR_EFFECTIVE/release" \
|
||||||
-L crates/nyash_kernel/target/release \
|
-L crates/nyash_kernel/target/release \
|
||||||
-Wl,--whole-archive -lnyash_kernel -Wl,--no-whole-archive \
|
-Wl,--whole-archive -lnyash_kernel -Wl,--no-whole-archive \
|
||||||
-lpthread -ldl -lm -o "$OUT"
|
-lpthread -ldl -lm -o "$OUT"
|
||||||
|
|||||||
@ -11,6 +11,14 @@
|
|||||||
|
|
||||||
set -uo pipefail
|
set -uo pipefail
|
||||||
|
|
||||||
|
llvm_exe_cargo_target_dir() {
|
||||||
|
# Release builds can fail with EXDEV when rustc uses /tmp for temp files and target/ is elsewhere.
|
||||||
|
# Force a dedicated target dir under /tmp so rustc temp files and outputs stay on the same filesystem.
|
||||||
|
local target_dir="${LLVM_EXE_CARGO_TARGET_DIR:-/tmp/nyash_cargo_target}"
|
||||||
|
mkdir -p "$target_dir"
|
||||||
|
echo "$target_dir"
|
||||||
|
}
|
||||||
|
|
||||||
llvm_exe_preflight_or_skip() {
|
llvm_exe_preflight_or_skip() {
|
||||||
if ! command -v llvm-config-18 &>/dev/null; then
|
if ! command -v llvm-config-18 &>/dev/null; then
|
||||||
test_skip "llvm-config-18 not found"
|
test_skip "llvm-config-18 not found"
|
||||||
@ -27,6 +35,22 @@ llvm_exe_preflight_or_skip() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Verify the binary can actually emit an object (not "mock LLVM").
|
||||||
|
# This avoids hard failures when hakorune was built without `--features llvm`.
|
||||||
|
local cargo_target_dir
|
||||||
|
cargo_target_dir="$(llvm_exe_cargo_target_dir)"
|
||||||
|
local preflight_obj="$cargo_target_dir/_llvm_exe_preflight.o"
|
||||||
|
rm -f "$preflight_obj"
|
||||||
|
if ! env NYASH_DISABLE_PLUGINS=1 NYASH_LLVM_USE_HARNESS=1 NYASH_LLVM_OBJ_OUT="$preflight_obj" \
|
||||||
|
"$NYASH_BIN" --backend llvm "$NYASH_ROOT/apps/tests/phase87_llvm_exe_min.hako" >/dev/null 2>&1; then
|
||||||
|
test_skip "LLVM object emit preflight failed (hakorune may lack --features llvm)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [ ! -f "$preflight_obj" ]; then
|
||||||
|
test_skip "LLVM object emit unavailable (hakorune may be built without --features llvm)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,8 +116,11 @@ llvm_exe_ensure_plugins_or_fail() {
|
|||||||
echo "$CHECK_OUTPUT"
|
echo "$CHECK_OUTPUT"
|
||||||
echo "[INFO] Missing/broken plugin detected, running build-all"
|
echo "[INFO] Missing/broken plugin detected, running build-all"
|
||||||
|
|
||||||
|
local cargo_target_dir
|
||||||
|
cargo_target_dir="$(llvm_exe_cargo_target_dir)"
|
||||||
|
|
||||||
local build_log="${LLVM_PLUGIN_BUILD_LOG:-/tmp/llvm_exe_plugin_build.log}"
|
local build_log="${LLVM_PLUGIN_BUILD_LOG:-/tmp/llvm_exe_plugin_build.log}"
|
||||||
if ! bash "$NYASH_ROOT/tools/plugins/build-all.sh" "${crate_names[@]}" >"$build_log" 2>&1; then
|
if ! env CARGO_TARGET_DIR="$cargo_target_dir" bash "$NYASH_ROOT/tools/plugins/build-all.sh" "${crate_names[@]}" >"$build_log" 2>&1; then
|
||||||
echo "[FAIL] tools/plugins/build-all.sh failed"
|
echo "[FAIL] tools/plugins/build-all.sh failed"
|
||||||
tail -n 80 "$build_log"
|
tail -n 80 "$build_log"
|
||||||
return 1
|
return 1
|
||||||
@ -133,8 +160,17 @@ llvm_exe_build_and_run_numeric_smoke() {
|
|||||||
|
|
||||||
echo "[INFO] Building: $INPUT_HAKO → $OUTPUT_EXE"
|
echo "[INFO] Building: $INPUT_HAKO → $OUTPUT_EXE"
|
||||||
|
|
||||||
|
local cargo_target_dir
|
||||||
|
cargo_target_dir="$(llvm_exe_cargo_target_dir)"
|
||||||
|
|
||||||
|
# Ensure we use the compiler binary built in that target dir.
|
||||||
|
local nyash_bin="$cargo_target_dir/release/hakorune"
|
||||||
|
local obj_out="$cargo_target_dir/aot_objects/$(basename "$INPUT_HAKO").o"
|
||||||
|
mkdir -p "$(dirname "$obj_out")"
|
||||||
|
|
||||||
local build_log="${LLVM_BUILD_LOG:-/tmp/llvm_exe_build.log}"
|
local build_log="${LLVM_BUILD_LOG:-/tmp/llvm_exe_build.log}"
|
||||||
if ! env NYASH_DISABLE_PLUGINS=0 "$NYASH_ROOT/tools/build_llvm.sh" "$INPUT_HAKO" -o "$OUTPUT_EXE" 2>&1 | tee "$build_log"; then
|
if ! env CARGO_TARGET_DIR="$cargo_target_dir" NYASH_BIN="$nyash_bin" NYASH_LLVM_OBJ_OUT="$obj_out" NYASH_DISABLE_PLUGINS=0 \
|
||||||
|
"$NYASH_ROOT/tools/build_llvm.sh" "$INPUT_HAKO" -o "$OUTPUT_EXE" 2>&1 | tee "$build_log"; then
|
||||||
echo "[FAIL] build_llvm.sh failed"
|
echo "[FAIL] build_llvm.sh failed"
|
||||||
tail -n 80 "$build_log"
|
tail -n 80 "$build_log"
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
Reference in New Issue
Block a user