Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ jobs:
strategy:
fail-fast: false
matrix:
# macos-26 carries the Xcode 27 toolchain (macOS 27 SDK): the
# newest-SKU check alongside the macos-15 floor.
os: [macos-15, macos-26, ubuntu-24.04, windows-2025]
# macOS 26 is the minimum supported system, so macos-26 (which
# carries the Xcode 27 toolchain) is the only macOS leg.
os: [macos-26, ubuntu-24.04, windows-2025]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
Expand All @@ -33,7 +33,7 @@ jobs:
sudo apt-get install -y build-essential g++
libxcb1-dev libxkbcommon-dev libxkbcommon-x11-dev
- name: Format check
if: matrix.os == 'macos-15'
if: matrix.os == 'macos-26'
run: cargo fmt --check
- name: Clippy
run: cargo clippy --all-targets -- -D warnings
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ To package locally: `scripts/package-macos.sh 0.1.0` produces

| Platform | Status |
| --- | --- |
| macOS (Apple silicon / Intel) | built, tested, and manually verified — including on macOS 27 (Xcode 27 SDK) |
| macOS 26+ (Apple silicon / Intel) | built, tested, and manually verified — including on macOS 27 (Xcode 27 SDK) |
| Linux (X11 / Wayland) | compiles and unit-tested via CI; rendering uses Vulkan through blade-graphics, linking needs `libxcb`, `libxkbcommon`, `libxkbcommon-x11`, `libstdc++` |
| Windows | compiles and unit-tested via CI (MSVC toolchain) |
| FreeBSD | compiles via CI (GPUI gates its X11/Wayland backend to `linux` + `freebsd`); least-tested platform |
Expand All @@ -61,7 +61,7 @@ cross-platform; only the final Linux binary link needs native X11 libraries.

- Stable Rust toolchain
- `git` on your `PATH`
- macOS: Xcode command line tools (`xcode-select --install`) for the Metal backend
- macOS 26 or newer: Xcode command line tools (`xcode-select --install`) for the Metal backend
- Linux: the X11/xkbcommon dev packages above plus a Vulkan-capable driver stack

## Usage
Expand Down
9 changes: 5 additions & 4 deletions docs/BUILDING.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@ does and why, per target.

### macOS

Builds with Xcode 26 or 27 (macOS 26/27 SDK); the universal package is
built on the newest CI runner image so releases pick up the latest
SDK's platforms support while `LSMinimumSystemVersion` (13.0) keeps
older systems working.
Minimum supported system: **macOS 26**. Builds with Xcode 26 or 27
(macOS 26/27 SDK); the universal package links with
`MACOSX_DEPLOYMENT_TARGET=26.0` and carries
`LSMinimumSystemVersion` 26.0, and CI builds/tests on the macos-26
runner image.

Requirements: stable Rust, Xcode command line tools
(`xcode-select --install`).
Expand Down
6 changes: 5 additions & 1 deletion scripts/package-macos.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ cd "$ROOT"

echo "==> Building universal binary (aarch64 + x86_64 apple-darwin)"
rustup target add aarch64-apple-darwin x86_64-apple-darwin
# Minimum supported macOS: both slices link with a 26.0 floor, matching
# LSMinimumSystemVersion below (Gatekeeper/LaunchServices enforce the
# plist; the Mach-O min version is what older systems actually read).
export MACOSX_DEPLOYMENT_TARGET=26.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Low: The script never verifies that the 26.0 floor actually landed in the produced binary. MACOSX_DEPLOYMENT_TARGET is not part of cargo's fingerprinting, so an incremental local build can reuse previously linked slices (e.g. from before this change, minos 11.0/13.0) and lipo/codesign/ditto will happily package them while the plist claims 26.0 — shipped artifact then lies about its floor. The author verified minos 26.0 manually once; make it a build gate instead: in the existing ==> Verifying section add something like vtool -arch arm64 -show-build -output ... | grep -q 'Platform: MacOS\|MinOS: 26.0' (or otool -l ... | grep -A2 LC_BUILD_VERSION) for both slices and fail the script on mismatch.

cargo build --release --target aarch64-apple-darwin --target x86_64-apple-darwin

rm -rf "$DIST"
Expand Down Expand Up @@ -52,7 +56,7 @@ cat > "$DIST/$APP_NAME.app/Contents/Info.plist" <<PLIST
<key>CFBundleVersion</key><string>${VERSION}</string>
<key>CFBundleShortVersionString</key><string>${VERSION}</string>
<key>CFBundleInfoDictionaryVersion</key><string>6.0</string>
<key>LSMinimumSystemVersion</key><string>13.0</string>
<key>LSMinimumSystemVersion</key><string>26.0</string>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Low: The minimum version is now hardcoded in two places in this script: MACOSX_DEPLOYMENT_TARGET=26.0 (line 28) and the LSMinimumSystemVersion value here. If a future bump edits one and not the other, the plist and the Mach-O LC_BUILD_VERSION silently disagree — exactly the mismatch this PR was written to fix. Since the heredoc delimiter is unquoted (it already expands ${BUNDLE_ID} and ${VERSION}), define MIN_MACOS=26.0 once and use it in both the export and <key>LSMinimumSystemVersion</key><string>${MIN_MACOS}</string>.

<key>LSApplicationCategoryType</key><string>public.app-category.developer-tools</string>
<key>NSHighResolutionCapable</key><true/>
<key>NSSupportsAutomaticGraphicsSwitching</key><true/>
Expand Down
Loading