Skip to content

fix(cores): pin every remaining core to a verified upstream commit - #18

Merged
lepht merged 1 commit into
mainfrom
fix/pin-all-cores
Aug 11, 2026
Merged

fix(cores): pin every remaining core to a verified upstream commit#18
lepht merged 1 commit into
mainfrom
fix/pin-all-cores

Conversation

@lepht

@lepht lepht commented Aug 11, 2026

Copy link
Copy Markdown
Owner

Makes builds reproducible. Completes the "pin every remaining core" item in #16.

Stacked on #17. Base is fix/pin-mgba, so this shows only its own commit and can't conflict with the urgent unblock. Retargets to main when #17 merges. Merge #17 first — that one restores CI, this one is hygiene.

Why

mgba and fceumm weren't unlucky, they were first. Every core is a --depth 1 clone of third-party HEAD with a local patch applied, so any upstream edit to a patched file breaks the build with no commit here. Two had rotted already; the other 24 were one push away from the same.

What I did

For each of the 24 unpinned cores: fetched upstream HEAD, then ran git apply --check with both the tg5040 and tg5050 patches, which differ per platform.

All 24 apply cleanly at the commits pinned here. So this pins what already builds today — it moves nothing. It cannot make the current build worse than an unpinned build; it only stops it changing underneath us.

The 24 cores and their verified commits

a2600 a5200 a7800 bluemsx c128 c64 fake-08 gambatte gearcoleco gpsp handy libretro-cap32 libretro-uae mednafen_pce_fast mednafen_supafaust mednafen_vb pcsx_rearmed pet plus4 prboom race snes9x snes9x2005_plus vic

The five vice-libretro cores (c64, c128, vic, pet, plus4) share a repo and therefore a commit. Exact SHAs are in the diff.

Both makefiles still parse (make --dry-run), and every core carrying a patch now has a pin — checked programmatically, no gaps.

Limits of this verification

I confirmed the patches apply, not that the cores compile. Those are different things and only CI can settle the second. That said, the risk is bounded: these are the same commits an unpinned build would fetch right now, so a compile failure here would be a compile failure on main today too.

The trade

Cores stop drifting forward on their own. That's the point — but stale is only acceptable if bumping is easy, so #16 carries a proposed scheduled workflow that tries bumping each pin, builds what applies, and opens a PR with the ones that went green. This PR is essentially that loop run once by hand.

Cadence matters unevenly: FBNeo most (arcade romset compatibility is version-coupled and user-visible), pcsx_rearmed next (active ARM performance work), and the mature 8/16-bit cores can sit for a year without anyone noticing.

The mgba and fceumm breakages were symptoms: every core is a --depth 1 clone of
a third-party HEAD, patched locally, so any upstream change to a patched file
breaks the build with no commit here. Two had already rotted; the rest were
one push away from doing the same.

Pin the remaining 24 to the commit each was verified against. For each core:
fetched upstream HEAD, then ran git apply --check with both the tg5040 and
tg5050 patches, which differ per platform. All 24 apply cleanly there, so this
pins what already builds today rather than moving anything - it cannot make the
current build worse, only stop it changing underneath us.

Builds are now reproducible: the same nexterUI commit produces the same cores
regardless of when it is built. The cost is that cores no longer drift forward
on their own, so pins want bumping deliberately - see #16 for the proposed
automation.
Base automatically changed from fix/pin-mgba to main August 11, 2026 21:53
@lepht
lepht merged commit 46ccb45 into main Aug 11, 2026
59 of 61 checks passed
@lepht
lepht deleted the fix/pin-all-cores branch August 11, 2026 21:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant