mirror of
https://github.com/imjasonh/nescript
synced 2026-07-08 08:55:38 +00:00
commit built ROMs alongside .ne sources
The compiler is deterministic: rebuilding any example produces a byte-identical ROM, verified across all 22 examples and all four mappers (NROM, MMC1, UxROM, MMC3). That means the .nes files are reproducible artefacts and can live next to their sources without drift. Benefits: - Users can clone the repo and open any example in an emulator without installing a Rust toolchain or running the compiler. - The emulator harness can trust examples/*.nes directly, so its CI job no longer needs a compiler build or a "compile all examples" loop — it just boots jsnes against the committed ROMs and diffs each against its golden. - ROM diffs in PRs are now meaningful: "this compiler change flipped 17 bytes in hello_sprite.nes" is visible review signal, not hidden behind the emulator golden. Guard rails so the ROMs don't drift from their sources: - .gitignore no longer excludes *.nes. - The `examples` CI job rebuilds every .ne into /tmp and fails loudly (with a GitHub error annotation pointing at the exact cargo command to rerun) if any committed ROM differs. - scripts/pre-commit does the same check locally. - CLAUDE.md now states that editing a .ne file requires rebuilding its .nes in the same commit, so future agents won't miss the invariant. Total footprint: 22 ROMs, 624 KB (avg 28 KB each — most are NROM 24 KB; two banked examples are larger). https://claude.ai/code/session_01BcCcHi6FUmTh8jC7UgkA3A
This commit is contained in:
parent
43dc1ace49
commit
57faf9e36a
26 changed files with 67 additions and 22 deletions
33
.github/workflows/ci.yml
vendored
33
.github/workflows/ci.yml
vendored
|
|
@ -58,12 +58,26 @@ jobs:
|
|||
- uses: dtolnay/rust-toolchain@stable
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
- run: cargo build --release
|
||||
- name: Compile all .ne examples
|
||||
- name: Verify committed ROMs match their .ne sources
|
||||
# Every example has a committed .nes file under examples/. The
|
||||
# compiler is deterministic (verified: same input → byte-identical
|
||||
# output), so rebuilding each example into a tmp directory and
|
||||
# diffing against the committed ROM catches "someone edited a .ne
|
||||
# file but forgot to regenerate the ROM" at PR time.
|
||||
run: |
|
||||
mkdir -p /tmp/reprotest
|
||||
fail=0
|
||||
for f in examples/*.ne; do
|
||||
echo "==> Compiling $f"
|
||||
cargo run --release -- build "$f"
|
||||
name=$(basename "$f" .ne)
|
||||
./target/release/nescript build "$f" --output "/tmp/reprotest/$name.nes"
|
||||
if ! cmp -s "examples/$name.nes" "/tmp/reprotest/$name.nes"; then
|
||||
echo "::error file=examples/$name.ne::committed examples/$name.nes is stale; rerun \`cargo run --release -- build examples/$name.ne\` and commit the new ROM"
|
||||
fail=1
|
||||
fi
|
||||
done
|
||||
if [ $fail -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
- name: Verify ROMs are valid iNES
|
||||
run: |
|
||||
for f in examples/*.nes; do
|
||||
|
|
@ -83,8 +97,6 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: dtolnay/rust-toolchain@stable
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '22'
|
||||
|
|
@ -110,14 +122,9 @@ jobs:
|
|||
libxkbcommon0 \
|
||||
libxrandr2 \
|
||||
libasound2t64
|
||||
- name: Build compiler
|
||||
run: cargo build --release
|
||||
- name: Compile all .ne examples
|
||||
run: |
|
||||
for f in examples/*.ne; do
|
||||
echo "==> Compiling $f"
|
||||
./target/release/nescript build "$f"
|
||||
done
|
||||
# No compiler build needed — the `.nes` files are committed
|
||||
# alongside their `.ne` sources, and the `examples` CI job
|
||||
# fails on any stale ROM, so the emulator job can trust them.
|
||||
- name: Install emulator harness dependencies
|
||||
working-directory: tests/emulator
|
||||
run: npm ci
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue