From b573c3e5b8d498b2ed7580573abdb3fa08e80315 Mon Sep 17 00:00:00 2001 From: Selfhosting Dev Date: Wed, 24 Sep 2025 03:28:24 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20LLVM=5FSYS=5F180=5FPREFIX=E7=92=B0?= =?UTF-8?q?=E5=A2=83=E5=A4=89=E6=95=B0=E5=89=8A=E9=99=A4=E5=AE=8C=E4=BA=86?= =?UTF-8?q?=EF=BC=81llvm-harness=E7=B5=8C=E8=B7=AF=E3=81=A7Rust=20LLVM?= =?UTF-8?q?=E3=83=90=E3=82=A4=E3=83=B3=E3=83=87=E3=82=A3=E3=83=B3=E3=82=B0?= =?UTF-8?q?=E4=B8=8D=E8=A6=81=E5=8C=96=E9=81=94=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🚀 Phase 15.5 MIR Call統一革命 - LLVM環境変数削除フェーズ完了 ## ✅ 完了内容 - **条件分岐実装**: llvm-harness(デフォルト)はLLVM_SYS_180_PREFIX不要 - **後方互換性維持**: llvm-inkwell-legacy使用時はLLVM_SYS_180_PREFIX必要 - **全ツール統一**: 12個のビルドスクリプト・テストスクリプトを一括更新 - **ドキュメント更新**: ENV_VARS.mdでLLVM feature選択方法を明記 ## 🛠️ 更新ファイル - **コアビルド**: src/runner/build.rs, tools/build_llvm.sh, build_llvm.sh - **スモークテスト**: tools/llvm_smoke.sh, tools/test/smoke/llvm/ir_phi_empty_check.sh - **CI設定**: .github/workflows/min-gate.yml - **Windows版**: build_llvm_wsl.sh, build_llvm_wsl_msvc.sh (cross-compilation) - **開発ツール**: tools/build_compiler_exe.sh, tools/ny_mir_builder.sh - **ドキュメント**: docs/development/runtime/ENV_VARS.md ## ⚡ 技術的成果 - **環境変数削減**: LLVM_SYS_180_PREFIX → 条件付き使用のみ - **Python LLVM統合**: llvmliteハーネス経路でRust LLVM依存完全除去 - **ビルド簡略化**: デフォルトでllvm-config-18のみ必要 - **動作確認**: tools/llvm_smoke.sh成功 (1648バイト.oファイル生成) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .github/workflows/min-gate.yml | 7 ++-- build_llvm.sh | 5 ++- build_llvm_wsl.sh | 17 ++++++--- build_llvm_wsl_msvc.sh | 19 ++++++---- docs/development/runtime/ENV_VARS.md | 9 +++-- src/runner/build.rs | 9 +---- tools/build_compiler_exe.sh | 17 ++++++--- tools/build_llvm.sh | 17 ++++++--- tools/llvm_smoke.sh | 21 +++++++---- tools/ny_mir_builder.sh | 40 ++++++++++++++++----- tools/test/smoke/llvm/ir_phi_empty_check.sh | 15 +++++--- tools/test/smoke/selfhost/m2_min/test.sh | 13 +++++-- 12 files changed, 127 insertions(+), 62 deletions(-) diff --git a/.github/workflows/min-gate.yml b/.github/workflows/min-gate.yml index f8b4da66..f95feb6a 100644 --- a/.github/workflows/min-gate.yml +++ b/.github/workflows/min-gate.yml @@ -169,11 +169,8 @@ jobs: - name: Build (llvm + phi) run: | set -euo pipefail - if command -v llvm-config-18 >/dev/null 2>&1; then - LLVM_SYS_180_PREFIX="$(llvm-config-18 --prefix)" cargo build --release --features "llvm,phi-legacy" -q - else - cargo build --release --features "llvm,phi-legacy" -q - fi + # llvm feature(llvm-harness)はLLVM_SYS_180_PREFIX不要 + cargo build --release --features "llvm,phi-legacy" -q - name: LLVM harness — empty PHI check (batch) env: diff --git a/build_llvm.sh b/build_llvm.sh index 8ee1588d..2d965e00 100644 --- a/build_llvm.sh +++ b/build_llvm.sh @@ -1,6 +1,5 @@ #!/bin/bash -# LLVM ビルド - 24スレッド並列 -echo "🚀 LLVM ビルドを開始します..." -export LLVM_SYS_180_PREFIX=/usr/lib/llvm-18 +# LLVM ビルド - 24スレッド並列(llvmliteハーネス) +echo "🚀 LLVM ビルド開始(LLVM_SYS_180_PREFIX不要)..." cargo build --release --features llvm -j 24 echo "✅ LLVM ビルド完了!" \ No newline at end of file diff --git a/build_llvm_wsl.sh b/build_llvm_wsl.sh index 4579291b..42b98dfd 100644 --- a/build_llvm_wsl.sh +++ b/build_llvm_wsl.sh @@ -3,8 +3,15 @@ set -e echo "Building Nyash with LLVM for Windows from WSL..." -# Windows側のLLVMを使う -export LLVM_SYS_180_PREFIX="/mnt/c/Program Files/LLVM" +# Windows cross-compilation: Use legacy inkwell approach for cross-platform builds +LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm-inkwell-legacy} +if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then + # Windows側のLLVMを使う (legacy inkwell for cross-compilation) + export LLVM_SYS_180_PREFIX="/mnt/c/Program Files/LLVM" +else + echo "Warning: Cross-compilation typically requires llvm-inkwell-legacy feature" + echo "Consider setting NYASH_LLVM_FEATURE=llvm-inkwell-legacy for Windows builds" +fi # 追加の環境変数(Qt6ビルドで使っていたかもしれない技) export LLVM_SYS_180_FFI_WORKAROUND=1 @@ -13,8 +20,8 @@ export CXX=x86_64-w64-mingw32-g++ export AR=x86_64-w64-mingw32-ar # MinGWターゲットで試す(Qt6と同じ方法) -echo "Trying MinGW target..." -cargo build --target x86_64-pc-windows-gnu --release --features llvm +echo "Trying MinGW target with feature: $LLVM_FEATURE..." +cargo build --target x86_64-pc-windows-gnu --release --features "$LLVM_FEATURE" # 成功したら実行ファイルの場所を表示 if [ $? -eq 0 ]; then @@ -22,5 +29,5 @@ if [ $? -eq 0 ]; then echo "Binary at: target/x86_64-pc-windows-gnu/release/nyash.exe" else echo "MinGW build failed, trying MSVC target with cargo-xwin..." - cargo xwin build --target x86_64-pc-windows-msvc --release --features llvm + cargo xwin build --target x86_64-pc-windows-msvc --release --features "$LLVM_FEATURE" fi \ No newline at end of file diff --git a/build_llvm_wsl_msvc.sh b/build_llvm_wsl_msvc.sh index b079deb6..b6f1b24d 100644 --- a/build_llvm_wsl_msvc.sh +++ b/build_llvm_wsl_msvc.sh @@ -3,14 +3,21 @@ echo "Setting up Windows cross-compilation with LLVM..." -# Set environment variables for WSL cross-compilation -export LLVM_SYS_180_PREFIX="C:\\LLVM-18" -export LLVM_SYS_180_FFI_WORKAROUND="1" -export LLVM_SYS_NO_LIBFFI="1" # This is the key! +# Windows cross-compilation: Use legacy inkwell approach for cross-platform builds +LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm-inkwell-legacy} +if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then + # Set environment variables for WSL cross-compilation (legacy inkwell) + export LLVM_SYS_180_PREFIX="C:\\LLVM-18" + export LLVM_SYS_180_FFI_WORKAROUND="1" + export LLVM_SYS_NO_LIBFFI="1" # This is the key! +else + echo "Warning: Cross-compilation typically requires llvm-inkwell-legacy feature" + echo "Consider setting NYASH_LLVM_FEATURE=llvm-inkwell-legacy for Windows builds" +fi # Use cargo-xwin for cross compilation -echo "Building nyash.exe for Windows with LLVM support..." -cargo xwin build --target x86_64-pc-windows-msvc --release --features llvm -j32 +echo "Building nyash.exe for Windows with LLVM support (feature: $LLVM_FEATURE)..." +cargo xwin build --target x86_64-pc-windows-msvc --release --features "$LLVM_FEATURE" -j32 # Check if successful if [ -f "target/x86_64-pc-windows-msvc/release/nyash.exe" ]; then diff --git a/docs/development/runtime/ENV_VARS.md b/docs/development/runtime/ENV_VARS.md index 12ae1ab1..1ac2fae6 100644 --- a/docs/development/runtime/ENV_VARS.md +++ b/docs/development/runtime/ENV_VARS.md @@ -41,12 +41,17 @@ NYASH_DISABLE_PLUGINS = "1" - (今後)タスク/スケジューラ関連の変数は `runtime.*` 名で集約予定 ## LLVM/AOT -- LLVM_SYS_180_PREFIX: LLVM 18 のパス指定 +- NYASH_LLVM_FEATURE: LLVM機能選択("llvm"(default) または "llvm-inkwell-legacy") +- LLVM_SYS_180_PREFIX: LLVM 18 のパス指定(llvm-inkwell-legacy使用時のみ必要) - NYASH_LLVM_VINVOKE_RET_SMOKE, NYASH_LLVM_ARRAY_RET_SMOKE: CI 用スモークトグル -- NYASH_LLVM_OBJ_OUT: Rust LLVM 経路で生成する `.o` の出力パス(Runner/スクリプトが尊重) +- NYASH_LLVM_OBJ_OUT: LLVM経路で生成する `.o` の出力パス(Runner/スクリプトが尊重) - NYASH_AOT_OBJECT_OUT: AOT パイプラインで使用する `.o` 出力ディレクトリ/パス - NYASH_LLVM_USE_HARNESS: "1" で llvmlite ハーネス経路を有効化(MIR(JSON)→Python→.ll→llc→.o) +### LLVM Feature 詳細 +- **llvm** (デフォルト): llvmlite Python ハーネス使用、LLVM_SYS_180_PREFIX不要 +- **llvm-inkwell-legacy**: Rust inkwell bindings使用、LLVM_SYS_180_PREFIX必要 + ## 管理方針(提案) - コード側: `src/config/env.rs` を単一の集約窓口に(JIT は `jit::config` に委譲)。 - ドキュメント側: 本ファイルを単一索引にし、用途別に追加。 diff --git a/src/runner/build.rs b/src/runner/build.rs index 0e30e7fe..62284dbe 100644 --- a/src/runner/build.rs +++ b/src/runner/build.rs @@ -148,14 +148,7 @@ pub(super) fn run_build_mvp_impl(runner: &NyashRunner, cfg_path: &str) -> Result let _ = std::fs::create_dir_all(&obj_dir); let obj_path = obj_dir.join("main.o"); if aot == "llvm" { - if std::env::var("LLVM_SYS_180_PREFIX").ok().is_none() - && std::env::var("LLVM_SYS_181_PREFIX").ok().is_none() - { - return Err( - "LLVM 18 not configured. Set LLVM_SYS_180_PREFIX or install LLVM 18 (llvm-config)" - .into(), - ); - } + // llvmliteハーネス使用によりLLVM_SYS_180_PREFIX不要 std::env::set_var("NYASH_LLVM_OBJ_OUT", &obj_path); println!("[emit] LLVM object → {}", obj_path.display()); let status = std::process::Command::new( diff --git a/tools/build_compiler_exe.sh b/tools/build_compiler_exe.sh index c26ce2dd..5c968c09 100644 --- a/tools/build_compiler_exe.sh +++ b/tools/build_compiler_exe.sh @@ -38,11 +38,18 @@ if ! command -v llvm-config-18 >/dev/null 2>&1; then exit 2 fi -# 1) Build nyash with LLVM harness -echo "[1/4] Building nyash (LLVM harness) ..." -_LLVMPREFIX=$(llvm-config-18 --prefix) -LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ - cargo build --release -j 24 --features llvm >/dev/null +# 1) Build nyash with LLVM backend +LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm} +echo "[1/4] Building nyash (${LLVM_FEATURE}) ..." +if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then + # Legacy inkwell needs LLVM_SYS_180_PREFIX + _LLVMPREFIX=$(llvm-config-18 --prefix) + LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ + cargo build --release -j 24 --features "${LLVM_FEATURE}" >/dev/null +else + # llvm-harness (default) doesn't need LLVM_SYS_180_PREFIX + cargo build --release -j 24 --features "${LLVM_FEATURE}" >/dev/null +fi # 2) Emit + link compiler.nyash → EXE echo "[2/4] Emitting + linking selfhost compiler ..." diff --git a/tools/build_llvm.sh b/tools/build_llvm.sh index 74ef89c7..577c9801 100644 --- a/tools/build_llvm.sh +++ b/tools/build_llvm.sh @@ -44,12 +44,18 @@ if ! command -v llvm-config-18 >/dev/null 2>&1; then fi echo "[1/4] Building nyash (feature selectable) ..." -_LLVMPREFIX=$(llvm-config-18 --prefix) # 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 -LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ +if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then + # Legacy inkwell需要LLVM_SYS_180_PREFIX + _LLVMPREFIX=$(llvm-config-18 --prefix) + LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ + CARGO_INCREMENTAL=1 cargo build --release -j 24 -p nyash-rust --features "$LLVM_FEATURE" >/dev/null +else + # llvm-harness(デフォルト)はLLVM_SYS_180_PREFIX不要 CARGO_INCREMENTAL=1 cargo build --release -j 24 -p nyash-rust --features "$LLVM_FEATURE" >/dev/null +fi echo "[2/4] Emitting object (.o) via LLVM backend ..." # Default object output path under target/aot_objects @@ -100,12 +106,13 @@ if [[ "${NYASH_LLVM_SKIP_EMIT:-0}" != "1" ]]; then esac if [[ "$COMPILER_MODE" == "harness" ]]; then if [[ "${NYASH_LLVM_FEATURE:-llvm}" == "llvm-inkwell-legacy" ]]; then - # Legacy path: do not use harness + # Legacy path: do not use harness (LLVM_SYS_180_PREFIX needed) + _LLVMPREFIX=$(llvm-config-18 --prefix) 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 (Python llvmlite) - NYASH_LLVM_OBJ_OUT="$OBJ" NYASH_LLVM_USE_HARNESS=1 LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ + # Harness path (Python llvmlite - LLVM_SYS_180_PREFIX不要) + NYASH_LLVM_OBJ_OUT="$OBJ" NYASH_LLVM_USE_HARNESS=1 \ ./target/release/nyash --backend llvm "$INPUT" >/dev/null || true fi fi diff --git a/tools/llvm_smoke.sh b/tools/llvm_smoke.sh index bf26d738..e3715a41 100644 --- a/tools/llvm_smoke.sh +++ b/tools/llvm_smoke.sh @@ -17,10 +17,18 @@ if ! command -v llvm-config-18 >/dev/null 2>&1; then exit 2 fi -# Resolve LLVM 18 prefix once and export for both 180/181 variants used by llvm-sys -_LLVMPREFIX=$(llvm-config-18 --prefix) -export LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" -export LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" +# Conditional LLVM prefix setup based on feature +LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm} +if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then + # Legacy inkwell needs LLVM_SYS_180_PREFIX + _LLVMPREFIX=$(llvm-config-18 --prefix) + export LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" + export LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" + echo "[llvm-smoke] Using legacy inkwell with LLVM_SYS_180_PREFIX=${_LLVMPREFIX}" >&2 +else + # llvm-harness (default) doesn't need LLVM_SYS_180_PREFIX + echo "[llvm-smoke] Using llvm-harness (LLVM_SYS_180_PREFIX not required)" >&2 +fi # --- AOT smoke: apps/ny-llvm-bitops (bitwise & shift operations) --- if [[ "${NYASH_LLVM_BITOPS_SMOKE:-0}" == "1" ]]; then @@ -41,9 +49,8 @@ else echo "[llvm-smoke] skipping ny-llvm-bitops (set NYASH_LLVM_BITOPS_SMOKE=1 to enable)" >&2 fi -echo "[llvm-smoke] building nyash (${MODE}, feature=llvm)..." >&2 -# Support both llvm-sys 180/181 by exporting both prefixes to the same value -cargo build -q ${MODE:+--${MODE}} --features llvm +echo "[llvm-smoke] building nyash (${MODE}, feature=${LLVM_FEATURE})..." >&2 +cargo build -q ${MODE:+--${MODE}} --features "${LLVM_FEATURE}" echo "[llvm-smoke] running --backend llvm on examples/llvm11_core_smoke.nyash ..." >&2 rm -f "$OBJ" diff --git a/tools/ny_mir_builder.sh b/tools/ny_mir_builder.sh index 5a6c9f78..e5d57f69 100644 --- a/tools/ny_mir_builder.sh +++ b/tools/ny_mir_builder.sh @@ -56,9 +56,16 @@ if ! command -v llvm-config-18 >/dev/null 2>&1; then fi # Build nyash + NyRT as needed -_LLVMPREFIX=$(llvm-config-18 --prefix) -LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ - cargo build --release -j 24 --features llvm >/dev/null +LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm} +if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then + # Legacy inkwell needs LLVM_SYS_180_PREFIX + _LLVMPREFIX=$(llvm-config-18 --prefix) + LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ + cargo build --release -j 24 --features "${LLVM_FEATURE}" >/dev/null +else + # llvm-harness (default) doesn't need LLVM_SYS_180_PREFIX + cargo build --release -j 24 --features "${LLVM_FEATURE}" >/dev/null +fi if [[ "$EMIT" == "exe" ]]; then (cd crates/nyrt && cargo build --release -j 24 >/dev/null) fi @@ -88,8 +95,13 @@ case "$EMIT" in export NYASH_LLVM_DUMP_LL=1 export NYASH_LLVM_LL_OUT="$OUT" if [[ "$VERIFY" == "1" ]]; then export NYASH_LLVM_VERIFY=1; fi - cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ - ./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true + if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then + cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ + ./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true + else + cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 \ + ./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true + fi if [[ ! -f "$OUT" ]]; then echo "error: failed to produce $OUT" >&2; exit 4; fi [[ "$QUIET" == "0" ]] && echo "OK ll:$OUT" ;; @@ -97,8 +109,13 @@ case "$EMIT" in export NYASH_LLVM_OBJ_OUT="$OUT" if [[ "$VERIFY" == "1" ]]; then export NYASH_LLVM_VERIFY=1; fi rm -f "$OUT" - cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ - ./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true + if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then + cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ + ./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true + else + cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 \ + ./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true + fi if [[ ! -f "$OUT" ]]; then echo "error: failed to produce $OUT" >&2; exit 4; fi [[ "$QUIET" == "0" ]] && echo "OK obj:$OUT" ;; @@ -108,8 +125,13 @@ case "$EMIT" in export NYASH_LLVM_OBJ_OUT="$OBJ" if [[ "$VERIFY" == "1" ]]; then export NYASH_LLVM_VERIFY=1; fi rm -f "$OBJ" - cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ - ./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true + if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then + cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \ + ./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true + else + cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 \ + ./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true + fi if [[ ! -f "$OBJ" ]]; then echo "error: failed to produce object $OBJ" >&2; exit 4; fi # Link with NyRT NYRT_BASE=${NYRT_DIR:-"$PWD/crates/nyrt"} diff --git a/tools/test/smoke/llvm/ir_phi_empty_check.sh b/tools/test/smoke/llvm/ir_phi_empty_check.sh index b8bd8af7..af7e48c5 100644 --- a/tools/test/smoke/llvm/ir_phi_empty_check.sh +++ b/tools/test/smoke/llvm/ir_phi_empty_check.sh @@ -7,11 +7,18 @@ set -euo pipefail SCRIPT=${1:-apps/tests/loop_if_phi.nyash} echo "[phi-empty-check] building nyash (llvm features)" >&2 -LLVM_PREFIX=${LLVM_SYS_180_PREFIX:-$(command -v llvm-config-18 >/dev/null 2>&1 && llvm-config-18 --prefix || true)} -if [[ -n "${LLVM_PREFIX}" ]]; then - LLVM_SYS_180_PREFIX="${LLVM_PREFIX}" cargo build --release --features llvm >/dev/null +LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm} +if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then + # Legacy inkwell needs LLVM_SYS_180_PREFIX + LLVM_PREFIX=${LLVM_SYS_180_PREFIX:-$(command -v llvm-config-18 >/dev/null 2>&1 && llvm-config-18 --prefix || true)} + if [[ -n "${LLVM_PREFIX}" ]]; then + LLVM_SYS_180_PREFIX="${LLVM_PREFIX}" cargo build --release --features "${LLVM_FEATURE}" >/dev/null + else + cargo build --release --features "${LLVM_FEATURE}" >/dev/null + fi else - cargo build --release --features llvm >/dev/null + # llvm-harness (default) doesn't need LLVM_SYS_180_PREFIX + cargo build --release --features "${LLVM_FEATURE}" >/dev/null fi IR_OUT=tmp/nyash_harness.ll diff --git a/tools/test/smoke/selfhost/m2_min/test.sh b/tools/test/smoke/selfhost/m2_min/test.sh index b84e7f4b..fa91d647 100644 --- a/tools/test/smoke/selfhost/m2_min/test.sh +++ b/tools/test/smoke/selfhost/m2_min/test.sh @@ -6,9 +6,16 @@ source "$ROOT/tools/test/lib/shlib.sh" build_nyash_release -# Skip when LLVM toolchain is not available (either llvm-config-18 or LLVM_SYS_180_PREFIX) -if ! command -v llvm-config-18 >/dev/null 2>&1 && [[ -z "${LLVM_SYS_180_PREFIX:-}" ]]; then - echo "[SKIP] selfhost M2 minimal: LLVM18 not available"; exit 0 +# Skip when LLVM toolchain is not available +if ! command -v llvm-config-18 >/dev/null 2>&1; then + # For llvm-harness (default), we only need llvm-config-18 + # For llvm-inkwell-legacy, we also need LLVM_SYS_180_PREFIX + LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm} + if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" && -z "${LLVM_SYS_180_PREFIX:-}" ]]; then + echo "[SKIP] selfhost M2 minimal: LLVM18 not available for legacy inkwell"; exit 0 + elif [[ "$LLVM_FEATURE" != "llvm-inkwell-legacy" ]]; then + echo "[SKIP] selfhost M2 minimal: llvm-config-18 not available"; exit 0 + fi fi build_ny_llvmc || { echo "[SKIP] selfhost M2 minimal: ny-llvmc not built"; exit 0; }