From 9ca7f1d0de6e23282bed4546441ed9bcced30a5d Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Sun, 27 Sep 2026 21:22:25 -0500 Subject: [PATCH] Updating for use with JoeyLib installer. --- docs/INSTALL.md | 30 +++++------ docs/USAGE.md | 1 - llvmMosCommit.txt | 1 + scripts/applyBackend.sh | 1 - scripts/common.sh | 55 +++++++++++++++++++ scripts/installLlvmMos.sh | 109 +++++++++++++++----------------------- scripts/runInMame.sh | 6 ++- scripts/updateLlvmMos.sh | 45 ++++------------ scripts/verify.sh | 21 +++++--- 9 files changed, 140 insertions(+), 129 deletions(-) create mode 100644 llvmMosCommit.txt diff --git a/docs/INSTALL.md b/docs/INSTALL.md index b98e962..3f26c10 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -21,7 +21,6 @@ After install, the `llvm816/` directory tree contains everything: |---|---:|---| | `tools/llvm-mos/` | 5.0 GB | LLVM source tree (clone of llvm-mos). Our backend source is *symlinked* into here at build time. | | `tools/llvm-mos-build/` | 1.4 GB | Compiled clang/llc/llvm-mc binaries. This is where you actually run the compiler from. | -| `tools/llvm-mos-sdk/` | 400 MB | Prebuilt llvm-mos SDK (the original 6502 distribution). Mostly unused by us; kept as a reference baseline. | | `tools/calypsi/` | 580 MB | Commercial Calypsi 5.16 65816 C compiler — installed for output-quality comparisons in `compare/`. | | `tools/nlist/` | 68 KB | Dave Lyons' NiftyList toolbox catalog (`NList.Data.txt`). Source of truth for the IIgs toolbox bindings auto-generated into `runtime/include/iigs/toolbox.h`. | | `tools/gsos/` | 13 MB | Apple GS/OS 6.0.2 / 6.0.4 disk images for booting under MAME. | @@ -101,7 +100,7 @@ That's it. `setup.sh` runs five stages in order: | Stage | Script | What it does | Time | |---|---|---|---| | 1/5 | `installDeps.sh` | `sudo apt-get install` the packages listed above. | ~1 min | -| 2/5 | `installLlvmMos.sh` | Clone `llvm-mos` source (5 GB), download prebuilt llvm-mos SDK (400 MB), **apply our W65816 backend** (symlinks + patches), **build clang/llc/llvm-mc with W65816 target enabled**, **build `link816` + `omfEmit`**, and **build the runtime libraries** (`libc.o`, `crt0.o`, `libgcc.o`, soft-float, etc.). After this stage you have a working W65816 toolchain end-to-end. | ~30-60 min (first time; LLVM build is the long pole) | +| 2/5 | `installLlvmMos.sh` | Clone `llvm-mos` source (5 GB) at the commit pinned in `llvmMosCommit.txt`, **apply our W65816 backend** (symlinks + patches), **build clang/llc/llvm-mc/llvm-ar with W65816 target enabled**, **build `link816` + `omfEmit`**, and **build the runtime libraries** (`libc.o`, `crt0.o`, `libgcc.o`, soft-float, etc.). After this stage you have a working W65816 toolchain end-to-end. | ~30-60 min (first time; LLVM build is the long pole) | | 3/5 | `installMame.sh` | Install MAME via apt, download `apple2gs.zip` (ROM 03) and `apple2gsr1.zip` (ROM 01) into `tools/mame/roms/`. | ~30 s | | 4/5 | `installCalypsi.sh` | Download Calypsi 5.16 .deb, extract its payload into `tools/calypsi/` (no system-wide install). | ~30 s | | 5/5 | `installGno.sh` | Fetch GNO/ME 2.0.6 + GS/OS 6.0.4 disk images for shell-command testing under MAME. | ~30 s | @@ -176,7 +175,6 @@ llvm816/ ← your repo checkout │ ├── llvm-mc ← standalone assembler │ ├── llvm-objdump ← disassembler │ └── ... (FileCheck, llvm-readobj, opt, etc.) - ├── llvm-mos-sdk/ (400 MB) — prebuilt llvm-mos SDK ├── link816 (~120 KB) — OUR LINKER ⭐ ├── omfEmit (~70 KB) — OMF v2.1 emitter for GS/OS Loader ├── cadius/ — Apple ProDOS / GS/OS disk image tool @@ -235,8 +233,7 @@ LLVM clone). ```bash bash scripts/installDeps.sh # apt packages -bash scripts/installLlvmMos.sh # llvm-mos clone + prebuilt SDK -bash scripts/installLlvmMos.sh --build # also build clang/llc (slow) +bash scripts/installLlvmMos.sh # pinned llvm-mos clone + clang/llc build + link816 + runtime bash scripts/installMame.sh # MAME + apple2gs ROMs bash scripts/installCalypsi.sh # reference compiler (optional) bash scripts/verify.sh # sanity-check everything @@ -248,8 +245,8 @@ If you only want to *build* C programs (no benchmarks, no comparisons), ### Building W65816 clang from source `setup.sh` always builds clang from source — that's the only way to -get a `clang` that actually targets W65816 (the prebuilt llvm-mos SDK -in `tools/llvm-mos-sdk/` only knows about the 6502 MOS target). The +get a `clang` that actually targets W65816 (a stock llvm-mos release +only knows about the 6502 MOS target). The initial build takes 30-60 minutes depending on core count; after that incremental rebuilds are ~30 seconds: @@ -368,9 +365,9 @@ causes: ninja -C tools/llvm-mos-build llc clang ``` -3. You're using the prebuilt SDK (`tools/llvm-mos-sdk/bin/...`). That's - the original llvm-mos SDK; our W65816 target lives only in our - *source build* at `tools/llvm-mos-build/bin/`. +3. You're using a stock llvm-mos clang (for example a `tools/llvm-mos-sdk/` + left by an older install, or a system llvm-mos). Our W65816 target + lives only in our *source build* at `tools/llvm-mos-build/bin/`. ### `linkage error: missing __umulhisi3` / `missing __mulsi3` / similar @@ -403,18 +400,19 @@ flags. ### `git: refusing to fetch into ...` for llvm-mos -`installLlvmMos.sh` refuses to refresh the LLVM clone if it has local -modifications or is on a non-`main` branch — because our backend -symlinks are stitched into the clone and a destructive refresh would -stomp them. +The llvm-mos clone is pinned to the commit in `llvmMosCommit.txt`. +`installLlvmMos.sh` only ever moves the clone to that pin (unapplying our +backend first), and refuses if the clone is on a non-`main` branch or has +changes other than our backend. -If you really want to refresh from upstream: +To move to the latest upstream: ```bash bash scripts/updateLlvmMos.sh ``` -That script handles the symlinks safely. +That script handles the symlinks safely and rewrites `llvmMosCommit.txt`. +Rebuild, run the W65816 tests, then commit the pin file. ### Disk fills up during the LLVM build diff --git a/docs/USAGE.md b/docs/USAGE.md index c3ad08c..eb25ed8 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -62,7 +62,6 @@ llvm816/ ← repo root; everything is contained here │ │ ├── llvm-mc ← standalone assembler │ │ ├── llvm-objdump ← disassembler │ │ └── ... -│ ├── llvm-mos-sdk/ ← prebuilt llvm-mos SDK (~400 MB, mostly unused) │ ├── link816 ← OUR LINKER (single binary, ~120 KB) │ ├── omfEmit ← turns flat binary → Apple IIgs OMF v2.1 │ ├── mame/ ← Apple IIgs ROMs for MAME diff --git a/llvmMosCommit.txt b/llvmMosCommit.txt new file mode 100644 index 0000000..21457ad --- /dev/null +++ b/llvmMosCommit.txt @@ -0,0 +1 @@ +c798c31416f72b395c658b5502d281a162387ab1 diff --git a/scripts/applyBackend.sh b/scripts/applyBackend.sh index b6622e1..0a22226 100755 --- a/scripts/applyBackend.sh +++ b/scripts/applyBackend.sh @@ -13,7 +13,6 @@ set -euo pipefail source "$(dirname "$0")/common.sh" -LLVM_SRC="$TOOLS_DIR/llvm-mos" SRC_TREE="$PROJECT_ROOT/src" PATCH_DIR="$PROJECT_ROOT/patches" diff --git a/scripts/common.sh b/scripts/common.sh index 8d40ec8..3b1cb3c 100755 --- a/scripts/common.sh +++ b/scripts/common.sh @@ -6,6 +6,15 @@ PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" TOOLS_DIR="$PROJECT_ROOT/tools" DOWNLOAD_CACHE="$PROJECT_ROOT/.cache/downloads" +# The llvm-mos clone our backend is stitched into, and its build tree. +# The clone is pinned to the commit in llvmMosCommit.txt so a fresh +# install builds exactly what we last tested; updateLlvmMos.sh moves the +# pin forward. +LLVM_SRC="$TOOLS_DIR/llvm-mos" +LLVM_BUILD="$TOOLS_DIR/llvm-mos-build" +LLVM_MOS_URL="https://github.com/llvm-mos/llvm-mos.git" +LLVM_MOS_COMMIT_FILE="$PROJECT_ROOT/llvmMosCommit.txt" + install -d "$TOOLS_DIR" "$DOWNLOAD_CACHE" log() { @@ -44,6 +53,52 @@ haveCmd() { command -v "$1" >/dev/null 2>&1 } +# Print the llvm-mos commit this tree is pinned to. +llvmMosPinnedCommit() { + local commit + [ -s "$LLVM_MOS_COMMIT_FILE" ] || die "missing pin file: $LLVM_MOS_COMMIT_FILE" + commit="$(tr -d '[:space:]' < "$LLVM_MOS_COMMIT_FILE")" + [[ "$commit" =~ ^[0-9a-f]{40}$ ]] || die "bad commit in $LLVM_MOS_COMMIT_FILE: '$commit'" + printf '%s\n' "$commit" +} + +# Shallow-fetch $1 (a commit SHA) and check it out as local branch main. +# The clone must already have its backend unapplied (unapplyBackend). +checkoutLlvmMosCommit() { + local commit="$1" + git -C "$LLVM_SRC" fetch --depth=1 origin "$commit" + git -C "$LLVM_SRC" checkout -q -B main FETCH_HEAD +} + +# Undo applyBackend.sh so the clone is a pristine upstream tree again: +# reverse our patches, then delete the symlinks into src/. Dies if the +# clone still has changes afterwards (someone edited it by hand). +unapplyBackend() { + local patch + local link + local target + log "reverting any applied patches" + for patch in "$PROJECT_ROOT"/patches/*.patch; do + [ -f "$patch" ] || continue + if git -C "$LLVM_SRC" apply --reverse --check "$patch" >/dev/null 2>&1; then + git -C "$LLVM_SRC" apply --reverse "$patch" + log " reverted: $(basename "$patch")" + fi + done + # Symlinks from applyBackend.sh are untracked files inside tracked + # directories; git leaves them alone, so remove them explicitly. + log "removing symlinks under $LLVM_SRC pointing into $PROJECT_ROOT/src" + find "$LLVM_SRC" -type l | while read -r link; do + target="$(readlink -f "$link" || true)" + case "$target" in + "$PROJECT_ROOT"/src/*) rm "$link" ;; + esac + done + if ! git -C "$LLVM_SRC" diff --quiet || ! git -C "$LLVM_SRC" diff --cached --quiet; then + die "llvm-mos checkout still has local changes after cleanup. Inspect with: git -C $LLVM_SRC status" + fi +} + # runGnoMameSmoke [ ...] # # Launch an already-built GNO/ME OMF under real GS/OS 6.0.4 + GNO in diff --git a/scripts/installLlvmMos.sh b/scripts/installLlvmMos.sh index 34f0057..761b7df 100755 --- a/scripts/installLlvmMos.sh +++ b/scripts/installLlvmMos.sh @@ -1,11 +1,10 @@ #!/usr/bin/env bash # Install + build the W65816 toolchain on top of llvm-mos: -# 1. Clone llvm-mos source. -# 2. Download the prebuilt llvm-mos-sdk (reference baseline). -# 3. Apply our W65816 backend INTO the clone (symlinks + patches). -# 4. Configure + build clang + llc + llvm-mc with the W65816 target. -# 5. Build link816 + omfEmit (the linker). -# 6. Build the runtime (libc.o, crt0.o, libgcc.o, etc.). +# 1. Clone llvm-mos source at the commit pinned in llvmMosCommit.txt. +# 2. Apply our W65816 backend INTO the clone (symlinks + patches). +# 3. Configure + build clang + llc + llvm-mc + llvm-ar with the W65816 target. +# 4. Build link816 + omfEmit (the linker). +# 5. Build the runtime (libc.o, crt0.o, libgcc.o, etc.). # # Flags: # --build (no-op; retained for backward compat — we always build) @@ -15,76 +14,54 @@ source "$(dirname "$0")/common.sh" for arg in "$@"; do case "$arg" in - --build) ;; # no-op; we always build now (see step 4) + --build) ;; # no-op; we always build now (see step 3) *) die "unknown flag: $arg" ;; esac done -LLVM_SRC="$TOOLS_DIR/llvm-mos" -LLVM_BUILD="$TOOLS_DIR/llvm-mos-build" -LLVM_SDK="$TOOLS_DIR/llvm-mos-sdk" -SDK_URL="https://github.com/llvm-mos/llvm-mos-sdk/releases/latest/download/llvm-mos-linux.tar.xz" - -# 1. Source tree for backend development. +# 1. Source tree for backend development, at the pinned commit. # # IMPORTANT: this clone is ephemeral scaffolding, not where we do work. Our # own sources live in $PROJECT_ROOT/src/ and $PROJECT_ROOT/patches/ and are -# stitched into this tree by applyBackend.sh. That means a destructive -# reset here would stomp applied symlinks/patches — so we refuse to touch -# the clone if it looks modified. Use updateLlvmMos.sh to refresh safely. +# stitched into this tree by applyBackend.sh. Moving the clone therefore +# unapplies the backend first; a clone with any OTHER local change, or on a +# branch other than main, is left for a human to sort out. +pinnedCommit="$(llvmMosPinnedCommit)" if [ -d "$LLVM_SRC/.git" ]; then - currentBranch="$(git -C "$LLVM_SRC" rev-parse --abbrev-ref HEAD)" - if [ "$currentBranch" != "main" ]; then - warn "llvm-mos clone is on branch '$currentBranch' (not main); leaving untouched" - elif ! git -C "$LLVM_SRC" diff --quiet || ! git -C "$LLVM_SRC" diff --cached --quiet; then - warn "llvm-mos clone has local modifications; leaving untouched. Use scripts/updateLlvmMos.sh to refresh." + currentCommit="$(git -C "$LLVM_SRC" rev-parse HEAD)" + if [ "$currentCommit" = "$pinnedCommit" ]; then + log "llvm-mos source already at pinned commit ${pinnedCommit:0:12}" else - log "llvm-mos source already cloned; fetching and fast-forwarding main" - git -C "$LLVM_SRC" fetch --depth=1 origin main - git -C "$LLVM_SRC" merge --ff-only FETCH_HEAD || warn "fast-forward failed; leaving clone as-is" + currentBranch="$(git -C "$LLVM_SRC" rev-parse --abbrev-ref HEAD)" + if [ "$currentBranch" != "main" ]; then + die "llvm-mos clone is on branch '$currentBranch', not main; refusing to move it to the pinned commit ${pinnedCommit:0:12}" + fi + log "llvm-mos source at ${currentCommit:0:12}; moving to pinned ${pinnedCommit:0:12}" + unapplyBackend + checkoutLlvmMosCommit "$pinnedCommit" fi else - log "cloning llvm-mos (shallow)" - git clone --depth=1 https://github.com/llvm-mos/llvm-mos.git "$LLVM_SRC" + log "cloning llvm-mos at pinned commit ${pinnedCommit:0:12} (shallow)" + git init -q "$LLVM_SRC" + git -C "$LLVM_SRC" remote add origin "$LLVM_MOS_URL" + checkoutLlvmMosCommit "$pinnedCommit" fi -# 2. Prebuilt SDK for testing/reference (smoke tests against the -# vanilla 6502 MOS target; mostly unused once you have a W65816 -# build). -if [ -x "$LLVM_SDK/bin/mos-common-clang" ] || [ -x "$LLVM_SDK/bin/clang" ]; then - log "llvm-mos-sdk already extracted" -else - archive="$(fetchCached "$SDK_URL" "llvm-mos-linux.tar.xz")" - log "extracting llvm-mos-sdk" - install -d "$LLVM_SDK" - tar -xJf "$archive" -C "$LLVM_SDK" --strip-components=1 -fi - -# 3. Apply our W65816 backend INTO the clone (symlinks + patches). +# 2. Apply our W65816 backend INTO the clone (symlinks + patches). # Must run BEFORE cmake configure so the W65816 target dir + cmake # patch are present. log "applying W65816 backend (symlinks + patches)" bash "$(dirname "$0")/applyBackend.sh" -# 4. Configure + build LLVM with W65816 enabled. We always build — -# without a built clang the rest of the toolchain (runtime, link816) -# can't produce any usable output. --build is kept as a no-op flag -# for backward compat. +# 3. Configure (first time only) + build LLVM with W65816 enabled. ninja +# runs every time: it is a few-second no-op when nothing changed, and it +# is what picks up a moved pin or an edited backend source. needCmd cmake needCmd ninja -# Existence check covers the full LTO toolchain. llvm-link / llvm-as / -# llvm-dis / opt are required by scripts/ltoLink.sh (Phase 5.2 of -# GAP_CLOSURE_PLAN.md); clang and llc are the always-required core. -if [ -x "$LLVM_BUILD/bin/clang" ] && \ - [ -x "$LLVM_BUILD/bin/llc" ] && \ - [ -x "$LLVM_BUILD/bin/llvm-link" ] && \ - [ -x "$LLVM_BUILD/bin/llvm-as" ] && \ - [ -x "$LLVM_BUILD/bin/llvm-dis" ] && \ - [ -x "$LLVM_BUILD/bin/opt" ] && \ - "$LLVM_BUILD/bin/llc" --version 2>/dev/null | grep -q "^[[:space:]]*w65816[[:space:]]"; then - log "llvm-mos-build/bin/clang already exists and supports w65816 (LTO tools present)" +if [ -f "$LLVM_BUILD/build.ninja" ]; then + log "llvm-mos build already configured" else - log "configuring llvm-mos build (LLVM + clang + lld; ~5 min after the first cmake)" + log "configuring llvm-mos build (LLVM + clang + lld)" install -d "$LLVM_BUILD" cmake -S "$LLVM_SRC/llvm" -B "$LLVM_BUILD" -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ @@ -96,31 +73,31 @@ else -DLLVM_INCLUDE_TESTS=OFF \ -DLLVM_INCLUDE_EXAMPLES=OFF \ -DLLVM_INCLUDE_BENCHMARKS=OFF - log "building clang, llc, llvm-mc, llvm-objdump (the tools we actually use)" - # LTO chain: llvm-link merges bitcode, opt runs IR-level optimizations - # (including the Layer 2 gate from Phase 1.12), llvm-as / llvm-dis - # are the .bc <-> .ll round-trip for debugging. Phase 5.2. - ninja -C "$LLVM_BUILD" clang llc llvm-mc llvm-objdump llvm-readobj \ - llvm-link llvm-as llvm-dis opt - log "llvm build done: $LLVM_BUILD/bin/clang" fi +# LTO chain: llvm-link merges bitcode, opt runs IR-level optimizations +# (including the Layer 2 gate from Phase 1.12), llvm-as / llvm-dis are the +# .bc <-> .ll round-trip for debugging. Phase 5.2. llvm-ar archives the +# objects of client libraries (joeylib's libjoey.a). +log "building clang, llc, llvm-mc, llvm-ar, llvm-objdump + LTO tools (first build ~30-60 min)" +ninja -C "$LLVM_BUILD" clang llc llvm-mc llvm-ar llvm-objdump llvm-readobj \ + llvm-link llvm-as llvm-dis opt +log "llvm build done: $LLVM_BUILD/bin/clang" # Sanity check: llc must list w65816 as a registered target. if ! "$LLVM_BUILD/bin/llc" --version 2>/dev/null | grep -q "^[[:space:]]*w65816[[:space:]]"; then "$LLVM_BUILD/bin/llc" --version 2>/dev/null | head -20 warn "llc built but does NOT list w65816 as a target. Backend symlinks/patches may have failed. Re-run scripts/applyBackend.sh and ninja -C tools/llvm-mos-build." fi -# 5. Build link816 + omfEmit. +# 4. Build link816 + omfEmit. log "building link816 + omfEmit" make -C "$PROJECT_ROOT/src/link816" all -# 6. Build the runtime (libc.o, crt0.o, libgcc.o, etc.). +# 5. Build the runtime (libc.o, crt0.o, libgcc.o, etc.). log "building runtime" bash "$PROJECT_ROOT/runtime/build.sh" log "llvm-mos install done" -log " source: $LLVM_SRC" -log " sdk: $LLVM_SDK" +log " source: $LLVM_SRC (llvm-mos ${pinnedCommit:0:12})" log " build: $LLVM_BUILD" log " clang: $LLVM_BUILD/bin/clang" log " link816: $PROJECT_ROOT/tools/link816" diff --git a/scripts/runInMame.sh b/scripts/runInMame.sh index 1c6301b..15c0fc4 100755 --- a/scripts/runInMame.sh +++ b/scripts/runInMame.sh @@ -118,8 +118,10 @@ $LUA_CHECKS end) EOF -OUT=$(SDL_VIDEODRIVER=dummy SDL_AUDIODRIVER=dummy timeout 30 mame apple2gs \ - -rompath "$PROJECT_ROOT/tools/mame/roms" \ +# MAME and MAME_ROMPATH let a client project (joeylib) supply its own +# patched MAME and ROM set instead of the ones installMame.sh sets up. +OUT=$(SDL_VIDEODRIVER=dummy SDL_AUDIODRIVER=dummy timeout 30 "${MAME:-mame}" apple2gs \ + -rompath "${MAME_ROMPATH:-$PROJECT_ROOT/tools/mame/roms}" \ -plugins -autoboot_script "$LUA_PATH" \ -video none -sound none -nothrottle -seconds_to_run "$SECS" 2>&1 | grep "^MAME-") diff --git a/scripts/updateLlvmMos.sh b/scripts/updateLlvmMos.sh index 606676f..727bdd8 100755 --- a/scripts/updateLlvmMos.sh +++ b/scripts/updateLlvmMos.sh @@ -1,16 +1,14 @@ #!/usr/bin/env bash -# Refresh the ephemeral llvm-mos checkout to the latest upstream main, -# then re-apply our backend (symlinks + patches). +# Move the pinned llvm-mos checkout to the latest upstream main, re-apply +# our backend (symlinks + patches), and record the new commit in +# llvmMosCommit.txt. Rebuild, run the tests, then commit the pin file. # -# This is the ONLY script that is allowed to destructively reset the -# clone. installLlvmMos.sh intentionally refuses to do so because a -# reset would destroy any applied patches. +# This is the ONLY script that is allowed to move the clone to an +# UNPINNED commit. installLlvmMos.sh only ever moves it to the pin. set -euo pipefail source "$(dirname "$0")/common.sh" -LLVM_SRC="$TOOLS_DIR/llvm-mos" - [ -d "$LLVM_SRC/.git" ] || die "llvm-mos checkout not found; run setup.sh first" currentBranch="$(git -C "$LLVM_SRC" rev-parse --abbrev-ref HEAD)" @@ -18,33 +16,7 @@ if [ "$currentBranch" != "main" ]; then die "llvm-mos is on branch '$currentBranch', expected main. Refusing to reset." fi -# First un-apply our patches so the reset only discards upstream drift, -# not our work. Symlinks are unaffected by git reset since untracked -# directories are left alone (our symlinks live inside tracked dirs but -# are untracked files themselves). -log "reverting any applied patches" -for patch in "$PROJECT_ROOT"/patches/*.patch; do - [ -f "$patch" ] || continue - if git -C "$LLVM_SRC" apply --reverse --check "$patch" >/dev/null 2>&1; then - git -C "$LLVM_SRC" apply --reverse "$patch" - log " reverted: $(basename "$patch")" - fi -done - -# Symlinks from applyBackend.sh are untracked files inside tracked -# directories. git reset --hard leaves them in place, but we clean -# them proactively so the fast-forward sees a truly clean tree. -log "removing symlinks under $LLVM_SRC pointing into $PROJECT_ROOT/src" -find "$LLVM_SRC" -type l | while read -r link; do - target="$(readlink -f "$link" || true)" - case "$target" in - "$PROJECT_ROOT"/src/*) rm "$link" ;; - esac -done - -if ! git -C "$LLVM_SRC" diff --quiet || ! git -C "$LLVM_SRC" diff --cached --quiet; then - die "llvm-mos checkout still has local changes after cleanup. Inspect with: git -C $LLVM_SRC status" -fi +unapplyBackend log "fetching and resetting to origin/main" git -C "$LLVM_SRC" fetch --depth=1 origin main @@ -53,4 +25,7 @@ git -C "$LLVM_SRC" reset --hard FETCH_HEAD log "re-applying backend" "$PROJECT_ROOT/scripts/applyBackend.sh" -log "update complete" +newCommit="$(git -C "$LLVM_SRC" rev-parse HEAD)" +printf '%s\n' "$newCommit" > "$LLVM_MOS_COMMIT_FILE" +log "update complete: pinned llvm-mos to $newCommit" +log "rebuild (ninja -C $LLVM_BUILD), run the W65816 tests, then commit llvmMosCommit.txt" diff --git a/scripts/verify.sh b/scripts/verify.sh index 324c643..168582a 100755 --- a/scripts/verify.sh +++ b/scripts/verify.sh @@ -24,9 +24,10 @@ check "ninja" ninja --version check "clang (host)" clang --version check "git" git --version -# llvm-mos source + SDK -check "llvm-mos source tree" test -d "$TOOLS_DIR/llvm-mos/.git" -check "llvm-mos-sdk extracted" test -x "$TOOLS_DIR/llvm-mos-sdk/bin/mos-common-clang" +# llvm-mos source, at the pinned commit +check "llvm-mos source tree" test -d "$LLVM_SRC/.git" +check "llvm-mos at pinned commit ($(llvmMosPinnedCommit | cut -c1-12))" \ + test "$(git -C "$LLVM_SRC" rev-parse HEAD 2>/dev/null)" = "$(llvmMosPinnedCommit)" # W65816 backend integration check "W65816 source symlinked into llvm-mos" \ @@ -34,6 +35,7 @@ check "W65816 source symlinked into llvm-mos" \ check "W65816 clang built" test -x "$TOOLS_DIR/llvm-mos-build/bin/clang" check "W65816 llc built" test -x "$TOOLS_DIR/llvm-mos-build/bin/llc" check "W65816 llvm-mc built" test -x "$TOOLS_DIR/llvm-mos-build/bin/llvm-mc" +check "llvm-ar built" test -x "$TOOLS_DIR/llvm-mos-build/bin/llvm-ar" check "llc lists w65816 target" \ bash -c "'$TOOLS_DIR/llvm-mos-build/bin/llc' --version 2>/dev/null | grep -q '^[[:space:]]*w65816[[:space:]]'" @@ -48,11 +50,14 @@ check "runtime/libgcc.o" test -s "$PROJECT_ROOT/runtime/libgcc.o" check "runtime/softFloat.o" test -s "$PROJECT_ROOT/runtime/softFloat.o" check "runtime/softDouble.o" test -s "$PROJECT_ROOT/runtime/softDouble.o" -# MAME + ROMs -check "mame binary" command -v mame -check "mame Lua console support" bash -c "mame -showusage 2>&1 | grep -q -- '-console'" -check "rom: apple2gs.zip" test -s "$TOOLS_DIR/mame/roms/apple2gs.zip" -check "rom: apple2gsr1.zip" test -s "$TOOLS_DIR/mame/roms/apple2gsr1.zip" +# MAME + ROMs (optional; --skip-mame at install skips this, e.g. when a +# client project such as joeylib provides its own MAME). +if [ -d "$TOOLS_DIR/mame" ]; then + check "mame binary" command -v mame + check "mame Lua console support" bash -c "mame -showusage 2>&1 | grep -q -- '-console'" + check "rom: apple2gs.zip" test -s "$TOOLS_DIR/mame/roms/apple2gs.zip" + check "rom: apple2gsr1.zip" test -s "$TOOLS_DIR/mame/roms/apple2gsr1.zip" +fi # Calypsi benchmark (optional; --skip-calypsi at install skips this). if [ -d "$TOOLS_DIR/calypsi" ]; then