Conversation
…sc.sh The shipyard pkg's postinstall no longer writes the CMake user package registry, and MavericksShipyardConfig.cmake refuses any cmake but shipyard-cmake. Two consequences here. Every cmake/ctest at command position becomes shipyard-cmake/shipyard-ctest: all three separately-configured projects (the root preset builds, updater/, menubar/) plus the iso preset build in both workflows. The three find_package(MavericksShipyard REQUIRED) calls stay -- they now resolve from shipyard-cmake's own prefix. cmake/package_pkg.sh had the repo's only shell-level shipyard locator: $SHIPYARD_SCRIPTS with a --msc-scripts flag and no fallback, so off CI it had nothing to fall back to once the registry went away. It now sources the canonical msc.sh, which asks shipyard-cmake where find_package lands. --msc-scripts still wins when given, and skips the probe. msc.sh goes at the repo root, not build/: container-tools has no tracked build/ and .gitignore blanket-ignores build*/ (the repo writes build/updater, build/menubar, build-cross and build-iso). A root copy tracks without git add -f. Check 17 accepts both. Eleven more sites the conventions gate cannot see were converted too: three printed `(cmake --build <dir>)` recipes, four comments handing a reader a plain cmake recipe, and four test assertions that grepped for the bare command name. Those four assertions needed more than a rename. `grep -q 'cmake --preset iso'` is satisfied by `shipyard-cmake --preset iso` -- the substring -- so this change is what would have made them unfalsifiable, and `grep -q 'shipyard-cmake --preset iso'` is only better by degree: a comment mentioning the command satisfies it while the run: line says plain cmake. All four now anchor the command position with an ERE, and each workflow additionally asserts that NO line runs a plain cmake/ctest/cpack -- the case an existence check structurally cannot see, where a plain call is ADDED beside the converted one. Mutation-checked, six mutants, every one caught by its own message, not the catch-all: reverting each of the four lines to plain cmake/ctest fails its own assertion (exit 1), and adding a plain call beside each converted one fails the negative (exit 1). All six pass again on restore. BREAKING CHANGE: requires the shipyard pkg (it provides shipyard-cmake) on PATH. Do not merge until shipyard has landed bc3082a. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GTxFde2TJMmp5p64DhvDSK
schmonz
force-pushed
the
shipyard-cmake-flagday
branch
from
September 14, 2026 02:13
0b7cdc1 to
1572c98
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Do not merge until shipyard has landed bc3082a.
After the cutover the CMake user package registry is neither written nor read; only
shipyard-cmake(from the shipyard pkg, at/usr/local/bin/) may configure against shipyard.What changed
12
cmake/ctestcalls in the two workflows →shipyard-cmake/shipyard-ctest. container-tools configures three separate CMake projects — the root (--preset cross,--preset iso),updater/, andmenubar/— each with its ownfind_package(MavericksShipyard REQUIRED). Those threefind_packagecalls stay; they now resolve from shipyard-cmake's own prefix.cmake/package_pkg.shwas the repo's only shell-level shipyard locator —$SHIPYARD_SCRIPTSwith a--msc-scriptsflag and no fallback. It now sourcesmsc.sh, guarded so--msc-scriptsstill wins and skips the ~2 s probe:msc.shat the repo root, byte-identical to shipyard'sscripts/templates/msc.sh(blob43c2af0, mode100644,cmpclean). Root rather thanbuild/: container-tools has no trackedbuild/, and.gitignoreblanket-ignoresbuild*/(this repo writesbuild/updater,build/menubar,build-cross,build-iso), so abuild/msc.shwould needgit add -fand would live inside a directory every build writes into. Check 17 accepts either.Seven sites no gate reports, converted because they would have shipped wrong:
(cmake --build <dir>)recipes —cmake/demo_osinit_guard.sh,tests/compat_guard_test.sh,tests/sdk_coverage_test.sh(check 18 deliberately treats a bare(as not command position)cmakerecipe —CMakeLists.txt×2,menubar/CMakeLists.txt,updater/CMakeLists.txtNo workflow step was added:
install@v1's default mode already putsshipyard-cmakeonPATH.Four tests that could no longer fail — fixed, not just renamed
The repo asserts its own workflows by grepping them:
shipyard-cmake --preset isocontainscmake --preset iso, so this change is what would have turned four falsifiable assertions into four that pass either way. Renaming the needle toshipyard-cmake …is better only by degree — a comment mentioning the command satisfies it while therun:line says plaincmake, and an existence check structurally cannot see a plain call added beside the converted one.All four now anchor the command position, and each workflow gains a negative assertion that no line runs a plain
cmake/ctest/cpack:Mutation-checked — six mutants, every one caught by its own message rather than the catch-all. Baseline: both suites exit 0.
boot2docker.yml:34→cmake --preset isoboot2docker_ci_test.shmissing configure presetboot2docker.yml:35→cmake --build --preset isoboot2docker_ci_test.shmissing build presetboot2docker.yml:36→ctest --preset iso …boot2docker_ci_test.shmissing test presetrelease.yml:158→cmake -S menubar …docker_menubar_test.shrelease.yml must build the menubar app with shipyard-cmakecmake --preset isoadded beside the converted linesboot2docker_ci_test.shboot2docker.yml runs a plain cmake/ctest/cpack …cmake -S menubar …added beside the converted linedocker_menubar_test.shrelease.yml configures menubar with a plain cmake …Mutants 5 and 6 exist because 1–4 alone would leave the new negative assertions themselves untested. All six fail on exit status, not merely on printed output, and the tree was byte-identical to HEAD after each restore.
Verification
check-family-conventions.sh(fromshipyard-cmake-collapsed): 12 failures →ok, exit 0.check-shell-portability.shok;check-comments.shexit 0;sh -non every tracked*.shand onmsc.sh(plusbash -non the two edited tests); all four workflows parse as YAML. All 16 runnable tests intests/exit 0.Whole-tree sweeps (
git ls-files -z | xargs -0 command grep, since.gitignorehidesbuild*/from a bare grep): nocmake/ctest/cpackleft at command position, no.cmake/packagesor.local/share/cmakeread anywhere, and the one remaining bare-paren hit is(ctest code 77)— prose about an exit code.msc.shproven on four paths, sourced from the sameif-body shapepackage_pkg.shuses:$SHIPYARD_SCRIPTSset → straight through; no shipyard at all → exits 1 with msc.sh's message under both/bin/shand bash 3.2 (theset -epropagation through a sourcedreturn 1holds);--msc-scriptsgiven → no probe; and against a stubshipyard-cmakethat answers the probe → the helper resolves, which is the tier that replaces the registry.CI on this PR will fail until shipyard lands bc3082a —
shipyard-cmakeexists on no runner yet. Expected, not a defect in this PR.🤖 Generated with Claude Code
https://claude.ai/code/session_01GTxFde2TJMmp5p64DhvDSK