mirror of
https://github.com/macvim-dev/macvim.git
synced 2026-06-11 15:37:29 +02:00
95277c3842
When Apple Silicon came out, we needed to get universal binaries of gettext/libsodium to link against, and solved it in a somewhat hacky temporary solution by just downloading the bottles from Homebrew and patching them with the x86_64 version. However, Homebrew only maintains bottles for 3 recent OSes, and with macOS 14's release, they no longer have bottles for macOS 11, which we still want to support as it's a recent OS. As such, we need to build the arm64 version of the packages in CI as well instead of just downloading. When installing from source, Homebrew uses a custom "clang" script that injects compiler flags including "-march" which will cause clang to fail to work when building universal binaries (since it doesn't make sense to specify Intel architectures when specifying `-arch arm64`). Just force it to use system clang instead to avoid inject unwanted flags.
85 lines
3.9 KiB
YAML
85 lines
3.9 KiB
YAML
name: Universal package
|
|
description: Create universal Homebrew package which contains x86_64 and arm64
|
|
|
|
# Instead of using the default binary installed by Homebrew, we need to build our own because third-party libraries are
|
|
# statically linked in MacVim, and need to be built against MACOSX_DEPLOYMENT_TARGET to ensure the built binary will
|
|
# work on supported macOS versions. Another reason for building our own custom package is to build a unviersal binary
|
|
# that has both x86_64 and arm64 arch, as Homebrew's distributed bottles are thin binaries with only one arch.
|
|
#
|
|
# We still use Homebrew to manage the library because their formulas are up to date and have correct build instructions
|
|
# that will work. This way we don't have to manually configuring and building and updating the package info.
|
|
|
|
inputs:
|
|
formula:
|
|
description: Formura name
|
|
required: true
|
|
contents:
|
|
description: Path for contents in package's keg
|
|
required: true
|
|
runs:
|
|
using: 'composite'
|
|
steps:
|
|
- name: Set up formula
|
|
id: setup-formula
|
|
shell: bash
|
|
run: |
|
|
echo '::group::Set up formula'
|
|
set -o pipefail
|
|
formula=${{ inputs.formula }}
|
|
|
|
# Need to make sure we get the latest before patching. Otherwise Homebrew may later try to get the latest
|
|
# version and stomp what we have here.
|
|
brew update
|
|
|
|
# Patch the official Homebrew formula to explicitly build for min deployment target and a universal binary. We
|
|
# also need to explicitly use system Clang because Homebrew's bundled clang script tries to inject -march
|
|
# compiler flags that will cause universal builds to fail as Clang does not like that.
|
|
brew cat ${formula} | \
|
|
sed '/^[[:blank:]]*def install$/a\'$'\n ENV["MACOSX_DEPLOYMENT_TARGET"] = "'${MACOSX_DEPLOYMENT_TARGET}$'"\n' | \
|
|
sed '/^[[:blank:]]*def install$/a\'$'\n ENV["CC"] = "/usr/bin/clang"\n' | \
|
|
sed '/^[[:blank:]]*def install$/a\'$'\n ENV["CFLAGS"] = "-arch x86_64 -arch arm64"\n' | \
|
|
sed '/^[[:blank:]]*def install$/a\'$'\n ENV["LDFLAGS"] = "-arch x86_64 -arch arm64"\n' >${formula}.rb
|
|
|
|
# Uninstall the already installed formula because we want to build our own
|
|
brew uninstall --ignore-dependencies ${formula} || true
|
|
|
|
# Extract Xcode version to serve as part of the key for caching
|
|
xcode_version=$(xcodebuild -version | tail -1 | sed -E 's/Build version (.*)/\1/')
|
|
echo "xcode_version=$xcode_version" >> $GITHUB_OUTPUT
|
|
|
|
echo '::endgroup::'
|
|
|
|
- name: Cache keg
|
|
id: cache-keg
|
|
uses: actions/cache@v3
|
|
with:
|
|
path: /usr/local/Cellar/${{ inputs.formula }}
|
|
key: ${{ inputs.formula }}-homebrew-cache-custom-unified-xcode${{ steps.setup-formula.outputs.xcode_version }}-${{ hashFiles(format('{0}.rb', inputs.formula)) }}
|
|
|
|
- name: Install formula
|
|
shell: bash
|
|
run: |
|
|
echo '::group::Install formula'
|
|
formula=${{ inputs.formula }}
|
|
|
|
# This will be a no-op if formula was cached
|
|
brew install --formula -s ./${formula}.rb
|
|
|
|
# If formula was cached, this step is necessary to relink it to /usr/local/
|
|
brew unlink ${formula} && brew link ${formula}
|
|
echo '::endgroup::'
|
|
|
|
echo '::group::Verify built version'
|
|
contents=($(IFS=,; for x in ${{ inputs.contents }}; do echo ${x}; done))
|
|
|
|
for content in "${contents[@]}"; do
|
|
# Print out the archs and verify they are universal fat binary.
|
|
lipo -info /usr/local/${content} | grep 'x86_64 arm64'
|
|
|
|
# Make sure deployment target is correct. Later macOS versions have a different binary format (just search for
|
|
# "minos") but for 10.13 we need to look for LC_VERSION_MIN_MACOSX.
|
|
otool -l /usr/local/${content} | grep -A 2 LC_VERSION_MIN_MACOSX | tail -1 | grep "${MACOSX_DEPLOYMENT_TARGET}"
|
|
done
|
|
|
|
echo '::endgroup::'
|