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.