Skip to content

Cross-platform build, packaging and macOS runtime fixes - #17

Merged
nolnoch merged 9 commits into
masterfrom
build-system
Nov 4, 2026
Merged

nolnoch merged 9 commits into
masterfrom
build-system

Conversation

@nolnoch

@nolnoch nolnoch commented Nov 4, 2026

Copy link
Copy Markdown
Owner

Summary

Replaces the per-machine build (hardcoded Qt/oneDPL paths, hand-run deploy scripts) with a portable CMake-presets + vcpkg build and a GitHub Actions pipeline that produces release packages for all four targets. Also fixes two macOS runtime bugs found while testing the packages.

Build and CI

  • CMake presets per platform (linux-release, macos-arm64-release, macos-x64-release, windows-release), vcpkg manifest with custom triplets, no hardcoded per-machine paths.
  • .github/workflows/build.yml builds on every push/PR and uploads 4 packages as artifacts:
    • Linux x86_64 AppImage (packaging/linux/build-appimage.sh)
    • macOS arm64 and Intel DMGs, Developer ID signed and notarized (packaging/macos/package-dmg.sh; Qt is built from source with Vulkan via packaging/macos/build-qt.sh, plus MoltenVK)
    • Windows x64 zip
  • Pushing a v* tag runs a release job that attaches all four packages to a draft prerelease.
  • main.cpp finds configs/ and shaders/ relative to the executable.
  • The old doc/deploy scripts are removed; the packaging/ scripts supersede them. README gains Download and Build-from-source sections.

macOS runtime fixes

Tested

Open follow-ups

🤖 Generated with Claude Code

nolnoch and others added 9 commits November 4, 2026 12:45
- CMakePresets.json: dev (Ninja Multi-Config) plus linux/macos-arm64/macos-x64/windows release
  presets; all read VCPKG_ROOT and QT_ROOT_DIR from the environment. Replaces the per-OS
  preset files and the tracked CMakeUserPresets.json.
- vcpkg overlay triplets (static, release-only) in cmake/triplets; oneDPL headers fetched by CMake.
- Install layout per platform: macOS .app with bundled Vulkan loader + MoltenVK, flat Windows
  folder (windeployqt, MSVC runtime), Linux FHS tree for linuxdeploy.
- main.cpp finds configs/shaders relative to the executable and points Qt at the bundled
  Vulkan loader on macOS.
- packaging/: Linux AppImage script, macOS sign/DMG/notarize script + entitlements,
  Windows resource file.
- GitHub Actions workflow builds all four packages; tags v* create a draft release.
- Removes the old doc/deploy scripts; README gains Download and Build-from-source sections.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Qt's prebuilt macOS binaries are configured without Vulkan (no QVulkanWindow).
  packaging/macos/build-qt.sh builds qtbase + qtdeclarative 6.12.0 from source against
  Vulkan-Headers 1.3.296, asserts Vulkan is enabled, and disables the QML JIT. CI caches the
  install per arch, saving it right after the build.
- With no JIT, the hardened runtime needs no exceptions: entitlements file removed.
- Linux: install the X11/XRandR/Wayland headers vcpkg's vulkan-loader compiles against.
- README: macOS Qt and Linux header requirements.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
stapler validate failed with NSURLErrorDomain -1005 (exit 68) talking to
api.apple-cloudkit.com after notarization was Accepted and stapling succeeded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pool held MAX_FRAMES_IN_FLIGHT uniform-buffer descriptors but
createDescriptorSets allocates MAX_FRAMES_IN_FLIGHT * setCount sets of one
descriptor each. Windows drivers tolerated the overrun; MoltenVK 1.4 (Metal 3
argument buffers) enforces the pool size, so vkAllocateDescriptorSets failed
in initResources and atomix aborted at startup on macOS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Qt's cocoa plugin answers -[CALayer display] with a synchronous expose,
QGuiApplication synthesizes a QPaintEvent from it, and QVulkanWindow
renders on Paint. On MoltenVK that frame blocks in -[CAMetalLayer
nextDrawable] inside the CA transaction commit while the Metal
completion thread waits to present, so the main thread hangs and the
window never appears (seen on macOS 27.2 / M4 Pro). Swallow Paint on
macOS and requestUpdate() instead; the display link delivers that on the
main queue outside the display cycle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolve conflicts in favour of the new build system: src/CMakeLists.txt
keeps the build-system version (no per-machine Qt/oneDPL paths; bundle
properties already set), and the old doc/deploy/mac files
(macdeploy.sh, Info.plist.in, atomix.entitlements) are dropped, since
packaging/macos/package-dmg.sh replaces them and the hardened runtime
needs no entitlements with the QML JIT disabled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@nolnoch
nolnoch merged commit 29dae4f into master Nov 4, 2026
5 of 9 checks passed
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