From 6edac50cc4ab1c122a7c65794de60b5c9ec0b9cf Mon Sep 17 00:00:00 2001 From: Eldred Habert Date: Mon, 20 Apr 2026 14:33:59 +0200 Subject: [PATCH] Target an even older version of Mac OS X We can, so let's not ask if we should! More realistically, we can right now so it's nice to mark that we do, but this is subject to be re-evaluated if any later changes conflicts with this. Note also that this only affects the binaries we distribute with our releases! It may very well be possible to compile RGBDS on even older versions of Mac OS X if you have the appropriate compiler setup; we're just not testing it nor offering such binaries ourselves, but third-party packagers are welcome to do so. (Looking at you, TigerBrew! ;) --- .github/scripts/install_deps.sh | 10 +++++++++- .github/workflows/create-release-artifacts.yml | 4 +++- .github/workflows/testing.yml | 4 +++- cmake/macos-static.cmake | 8 ++++++-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/.github/scripts/install_deps.sh b/.github/scripts/install_deps.sh index e864e45f..9f52026f 100755 --- a/.github/scripts/install_deps.sh +++ b/.github/scripts/install_deps.sh @@ -30,10 +30,18 @@ case "${OS%%-*}" in sudo apt-get install -yq $pkgs ;; macos) + pkgs=bison + case $TOOLSET in + '' | lld) + pkgs="$pkgs $TOOLSET" + TOOLSET= + ;; + esac # macOS bundles GNU Make 3.81, which doesn't support synced output. # We leave it as the default in `PATH`, to test that our Makefile works with it. # However, CMake automatically uses Homebrew's `gmake`, so our CI has synced output. - brew install bison make + # shellcheck disable=SC2086 # (This word splitting is intentional.) + brew install $pkgs make # Export `bison` to allow using the version we install from Homebrew, # instead of the outdated one preinstalled on macOS (which doesn't even support `-Wall`...). export PATH="$(brew --prefix)/opt/bison/bin:$PATH" diff --git a/.github/workflows/create-release-artifacts.yml b/.github/workflows/create-release-artifacts.yml index 6a07e83e..bc58456f 100644 --- a/.github/workflows/create-release-artifacts.yml +++ b/.github/workflows/create-release-artifacts.yml @@ -57,12 +57,14 @@ jobs: uses: actions/checkout@v6 - name: Install deps run: | - ./.github/scripts/install_deps.sh macos + ./.github/scripts/install_deps.sh macos lld - name: Build binaries run: | cmake -S . -B build --preset macos-static -DFETCHCONTENT_BASE_DIR="${{ env.DEPS_ROOT_DIR }}" cmake --build build strip rgb{asm,link,fix,gfx} + env: + LDFLAGS: -fuse-ld=lld # cmake/macos-static.cmake comments explain why we use lld. - name: Package binaries run: | zip --junk-paths rgbds-macos.zip rgb{asm,link,fix,gfx} man/* .github/scripts/install.sh diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index d7742591..01c31e85 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -113,7 +113,7 @@ jobs: uses: actions/checkout@v6 - name: Install deps run: | - .github/scripts/install_deps.sh macos + .github/scripts/install_deps.sh macos lld - name: Cache library deps uses: actions/cache@v5 with: @@ -124,6 +124,8 @@ jobs: run: | cmake -S . -B build --preset macos-static -DFETCHCONTENT_BASE_DIR="${{ env.DEPS_ROOT_DIR }}" -DTESTS_OS_NAME=macos cmake --build build + env: + LDFLAGS: -fuse-ld=lld # cmake/macos-static.cmake comments explain why we use lld. - name: Package binaries run: | mkdir bins diff --git a/cmake/macos-static.cmake b/cmake/macos-static.cmake index 5e03281a..1c7679b4 100644 --- a/cmake/macos-static.cmake +++ b/cmake/macos-static.cmake @@ -2,10 +2,14 @@ # in order to generate executables compatible with old macOS versions. # See our `macos-static` CMake preset for how it's meant to be used. -# The `-mmacosx-version-min=10.9` flag ensures that the binary only uses APIs available on Mac OS X 10.9 Mavericks. +# Note that targeting old enough versions of Mac OS X on recent enough versions of macOS +# triggers some poorly-tested code paths within Apple's linker, which then crashes. +# This can be worked around by using LLVM's LLD linker and passing `-fuse-ld=lld` when linking. + +# The `-mmacosx-version-min=10.4` flag ensures that the binary only uses APIs available on Mac OS X 10.4 Tiger. # The `-arch` flags build a "fat binary" that works on both Apple architectures: # older Intel x64 Macs and newer ARM "Apple Silicon" ones. -set(secret_sauce -mmacosx-version-min=10.9 "SHELL:-arch x86_64" "SHELL:-arch arm64") # Avoid `-arch` being dedup'd. +set(secret_sauce -mmacosx-version-min=10.4 "SHELL:-arch x86_64" "SHELL:-arch arm64") # Avoid `-arch` being dedup'd. add_compile_options(${secret_sauce}) add_link_options(${secret_sauce}) set(PNG_HARDWARE_OPTIMIZATIONS OFF) # These do not play well with a dual-arch build.