feat(macos): buildable osxcross image, universal arch, ad-hoc signing #17

Merged
picklemustard merged 1 commit from feat/macos-osxcross into main 2026-09-25 01:00:30 +00:00

The macOS image was written in M5 and never built, on the belief that the
SDK needed the paid Apple Developer Program. It does not: Xcode downloads
with a free Apple ID, and osxcross extracts the SDK from the .xip on Linux.

macOS toolchain:

  • scripts/package-macos-sdk.sh packages the SDK from an Xcode .xip in a
    throwaway container, at the osxcross commit the Dockerfile pins
  • macos.Dockerfile: clang 19, explicit osxcross "latest" flavor,
    compiler-rt for @available, asserted lipo, pinned rcodesign
  • scripts/push-macos-image.sh builds gbb-macos from the tree and pushes it
    to the private registry only; public and unqualified registries refused

Builds:

  • arch=universal (macOS only): two SCons passes, joined by lipo inside
    Godot's generate_bundle; only the bundle is collected
  • editor bundles are ad-hoc signed with rcodesign using Godot's own
    entitlements, so arm64 editors launch on Apple Silicon
  • template jobs ship Godot's macos_template.app zip (single target)
  • macOS compile failures end with custom-module hints
  • a module restricted by arch is offered to universal only if it lists
    both x86_64 and arm64
  • the Kubernetes executor refuses macOS, as it already refuses mono: its
    compile phase skips the entrypoint that configures osxcross

Also includes the mono glue-phase work: C# glue is generated in a
linuxbsd/x86_64 linux-mono container before the build container, so mono
is available on every platform, and zip moves into the base image.

Rebased onto the mono NuGet versioning fix (#16) and adapted to the glue
phase: GBB_MONO_VERSION_SUFFIX now reaches both the glue and the build
container, GODOT_VERSION_STATUS is exported at the entrypoint's top level
so packages and binary carry one version, and the --no-deprecated support
check and package-stamp check run in the glue phase. NUGET_PACKAGES stays
out of the build container, which runs no .NET.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

The macOS image was written in M5 and never built, on the belief that the SDK needed the paid Apple Developer Program. It does not: Xcode downloads with a free Apple ID, and osxcross extracts the SDK from the .xip on Linux. macOS toolchain: - scripts/package-macos-sdk.sh packages the SDK from an Xcode .xip in a throwaway container, at the osxcross commit the Dockerfile pins - macos.Dockerfile: clang 19, explicit osxcross "latest" flavor, compiler-rt for @available, asserted lipo, pinned rcodesign - scripts/push-macos-image.sh builds gbb-macos from the tree and pushes it to the private registry only; public and unqualified registries refused Builds: - arch=universal (macOS only): two SCons passes, joined by lipo inside Godot's generate_bundle; only the bundle is collected - editor bundles are ad-hoc signed with rcodesign using Godot's own entitlements, so arm64 editors launch on Apple Silicon - template jobs ship Godot's macos_template.app zip (single target) - macOS compile failures end with custom-module hints - a module restricted by arch is offered to universal only if it lists both x86_64 and arm64 - the Kubernetes executor refuses macOS, as it already refuses mono: its compile phase skips the entrypoint that configures osxcross Also includes the mono glue-phase work: C# glue is generated in a linuxbsd/x86_64 linux-mono container before the build container, so mono is available on every platform, and zip moves into the base image. Rebased onto the mono NuGet versioning fix (#16) and adapted to the glue phase: GBB_MONO_VERSION_SUFFIX now reaches both the glue and the build container, GODOT_VERSION_STATUS is exported at the entrypoint's top level so packages and binary carry one version, and the --no-deprecated support check and package-stamp check run in the glue phase. NUGET_PACKAGES stays out of the build container, which runs no .NET. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat(macos): buildable osxcross image, universal arch, ad-hoc signing
All checks were successful
CI / Dedupe (push) Successful in 1s
CI / Dedupe (pull_request) Successful in 1s
CI / Go (pull_request) Successful in 1m43s
CI / Go (push) Successful in 3m31s
CI / Frontend (push) Successful in 28s
CI / Badges (push) Has been skipped
CI / Publish images (push) Has been skipped
CI / Frontend (pull_request) Successful in 34s
CI / Badges (pull_request) Has been skipped
CI / Publish images (pull_request) Has been skipped
bb02f21de8
The macOS image was written in M5 and never built, on the belief that the
SDK needed the paid Apple Developer Program. It does not: Xcode downloads
with a free Apple ID, and osxcross extracts the SDK from the .xip on Linux.

macOS toolchain:
- scripts/package-macos-sdk.sh packages the SDK from an Xcode .xip in a
  throwaway container, at the osxcross commit the Dockerfile pins
- macos.Dockerfile: clang 19, explicit osxcross "latest" flavor,
  compiler-rt for @available, asserted lipo, pinned rcodesign
- scripts/push-macos-image.sh builds gbb-macos from the tree and pushes it
  to the private registry only; public and unqualified registries refused

Builds:
- arch=universal (macOS only): two SCons passes, joined by lipo inside
  Godot's generate_bundle; only the bundle is collected
- editor bundles are ad-hoc signed with rcodesign using Godot's own
  entitlements, so arm64 editors launch on Apple Silicon
- template jobs ship Godot's macos_template.app zip (single target)
- macOS compile failures end with custom-module hints
- a module restricted by arch is offered to universal only if it lists
  both x86_64 and arm64
- the Kubernetes executor refuses macOS, as it already refuses mono: its
  compile phase skips the entrypoint that configures osxcross

Also includes the mono glue-phase work: C# glue is generated in a
linuxbsd/x86_64 linux-mono container before the build container, so mono
is available on every platform, and zip moves into the base image.

Rebased onto the mono NuGet versioning fix (#16) and adapted to the glue
phase: GBB_MONO_VERSION_SUFFIX now reaches both the glue and the build
container, GODOT_VERSION_STATUS is exported at the entrypoint's top level
so packages and binary carry one version, and the --no-deprecated support
check and package-stamp check run in the glue phase. NUGET_PACKAGES stays
out of the build container, which runs no .NET.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
StudioTeal/GodotBinaryBuilder!17
No description provided.