From 4a109eb6b9650db12cd17d459d48c3bbf1566664 Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Thu, 18 Dec 2025 09:13:23 +0900 Subject: [PATCH] test(smokes): make LLVM EXE runner skip when object emit unavailable --- tools/build_llvm.sh | 8 ++++-- tools/smokes/v2/lib/llvm_exe_runner.sh | 40 ++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/tools/build_llvm.sh b/tools/build_llvm.sh index 6b7f07a2..405dec06 100644 --- a/tools/build_llvm.sh +++ b/tools/build_llvm.sh @@ -46,9 +46,13 @@ if ! command -v llvm-config-18 >/dev/null 2>&1; then exit 2 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) ..." # Select LLVM feature: default harness (llvm), or legacy inkwell when NYASH_LLVM_FEATURE=llvm-inkwell-legacy LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm} + # Use 24 threads for parallel build if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then # 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 echo " Skipping Nyash Kernel build (NYASH_LLVM_SKIP_NYRT_BUILD=1)" 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" 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)" @@ -149,7 +153,7 @@ fi mkdir -p "$(dirname "$OUT")" echo "[4/4] Linking $OUT ..." cc "$OBJ" \ - -L target/release \ + -L "$CARGO_TARGET_DIR_EFFECTIVE/release" \ -L crates/nyash_kernel/target/release \ -Wl,--whole-archive -lnyash_kernel -Wl,--no-whole-archive \ -lpthread -ldl -lm -o "$OUT" diff --git a/tools/smokes/v2/lib/llvm_exe_runner.sh b/tools/smokes/v2/lib/llvm_exe_runner.sh index 57da84ab..59cf7130 100644 --- a/tools/smokes/v2/lib/llvm_exe_runner.sh +++ b/tools/smokes/v2/lib/llvm_exe_runner.sh @@ -11,6 +11,14 @@ 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() { if ! command -v llvm-config-18 &>/dev/null; then test_skip "llvm-config-18 not found" @@ -27,6 +35,22 @@ llvm_exe_preflight_or_skip() { return 1 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 } @@ -92,8 +116,11 @@ llvm_exe_ensure_plugins_or_fail() { echo "$CHECK_OUTPUT" 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}" - 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" tail -n 80 "$build_log" return 1 @@ -133,8 +160,17 @@ llvm_exe_build_and_run_numeric_smoke() { 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}" - 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" tail -n 80 "$build_log" return 1