Skip to content

Commit d326ba5

Browse files
committed
ci: provide separate macos releases for intel and arm
This will immensely reduce the complexity required to support both architectures, reduce overall lines of code and unblock follow-up simplifications.
1 parent 011585f commit d326ba5

18 files changed

+60
-113
lines changed

Diff for: .github/scripts/build_universal_macos.sh

-22
This file was deleted.

Diff for: .github/workflows/build.yml

-11
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,6 @@ env:
2020
INSTALL_PREFIX: ${{ github.workspace }}/nvim-install
2121

2222
jobs:
23-
macos-universal:
24-
runs-on: macos-14
25-
timeout-minutes: 20
26-
steps:
27-
- uses: actions/checkout@v4
28-
- uses: ./.github/actions/setup
29-
- run: printf 'CMAKE_BUILD_TYPE=Release\n' >> $GITHUB_ENV
30-
31-
- name: Build universal binary
32-
run: ./.github/scripts/build_universal_macos.sh
33-
3423
old-cmake:
3524
name: Test oldest supported cmake
3625
runs-on: ubuntu-22.04

Diff for: .github/workflows/notes.md

+14-6
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,19 @@ ${NVIM_VERSION}
1818
2. Run the MSI
1919
3. Run `nvim.exe` on your CLI of choice
2020

21-
### macOS
21+
### macOS (x86_64)
2222

23-
1. Download **nvim-macos.tar.gz**
24-
2. Run `xattr -c ./nvim-macos.tar.gz` (to avoid "unknown developer" warning)
25-
3. Extract: `tar xzvf nvim-macos.tar.gz`
26-
4. Run `./nvim-macos/bin/nvim`
23+
1. Download **nvim-macos-x86_86.tar.gz**
24+
2. Run `xattr -c ./nvim-macos-x86_86.tar.gz` (to avoid "unknown developer" warning)
25+
3. Extract: `tar xzvf nvim-macos-x86_86.tar.gz`
26+
4. Run `./nvim-macos-x86_86/bin/nvim`
27+
28+
### macOS (arm64)
29+
30+
1. Download **nvim-macos-arm64.tar.gz**
31+
2. Run `xattr -c ./nvim-macos-arm64.tar.gz` (to avoid "unknown developer" warning)
32+
3. Extract: `tar xzvf nvim-macos-arm64.tar.gz`
33+
4. Run `./nvim-macos-arm64/bin/nvim`
2734

2835
### Linux (x64)
2936

@@ -56,7 +63,8 @@ https://github.com/neovim/neovim-releases.
5663
${SHA_LINUX_64_TAR}
5764
${SHA_APP_IMAGE}
5865
${SHA_APP_IMAGE_ZSYNC}
59-
${SHA_MACOS}
66+
${SHA_MACOS_X86_64}
67+
${SHA_MACOS_ARM64}
6068
${SHA_WIN_64_ZIP}
6169
${SHA_WIN_64_MSI}
6270
```

Diff for: .github/workflows/release.yml

+41-10
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,17 @@ jobs:
5959
./build/bin/nvim --version | head -n 3 >> $GITHUB_OUTPUT
6060
printf 'END\n' >> $GITHUB_OUTPUT
6161
62-
macOS:
63-
runs-on: macos-14
62+
macos:
63+
strategy:
64+
fail-fast: false
65+
matrix:
66+
runner: [ macos-12, macos-14 ]
67+
include:
68+
- runner: macos-12
69+
arch: x86_64
70+
- runner: macos-14
71+
arch: arm64
72+
runs-on: ${{ matrix.runner }}
6473
steps:
6574
- uses: actions/checkout@v4
6675
with:
@@ -72,17 +81,37 @@ jobs:
7281
run: printf 'CMAKE_BUILD_TYPE=Release\n' >> $GITHUB_ENV
7382
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
7483
run: printf 'CMAKE_BUILD_TYPE=RelWithDebInfo\n' >> $GITHUB_ENV
75-
- name: Build universal binary
76-
run: ./.github/scripts/build_universal_macos.sh
84+
85+
- name: Build deps
86+
run: |
87+
MACOSX_DEPLOYMENT_TARGET=11.0
88+
cmake -S cmake.deps -B .deps -G Ninja \
89+
-D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \
90+
-D CMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} \
91+
-D CMAKE_FIND_FRAMEWORK=NEVER
92+
cmake --build .deps
93+
94+
- name: Build neovim
95+
run: |
96+
MACOSX_DEPLOYMENT_TARGET=11.0
97+
cmake -B build -G Ninja \
98+
-D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \
99+
-D CMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} \
100+
-D ENABLE_LIBINTL=OFF \
101+
-D CMAKE_FIND_FRAMEWORK=NEVER
102+
cmake --build build
103+
104+
- name: Package
105+
run: cpack --config build/CPackConfig.cmake
106+
77107
- uses: actions/upload-artifact@v4
78108
with:
79109
name: nvim-macos
80-
path: build/nvim-macos.tar.gz
110+
path: build/nvim-macos-${{ matrix.arch }}.tar.gz
81111
retention-days: 1
82112

83113
windows:
84114
runs-on: windows-2019
85-
name: windows (MSVC_64)
86115
steps:
87116
- uses: actions/checkout@v4
88117
with:
@@ -106,7 +135,7 @@ jobs:
106135
retention-days: 1
107136

108137
publish:
109-
needs: [linux, macOS, windows]
138+
needs: [linux, macos, windows]
110139
runs-on: ubuntu-latest
111140
env:
112141
GH_REPO: ${{ github.repository }}
@@ -160,11 +189,13 @@ jobs:
160189
cd ./appimage
161190
sha256sum nvim.appimage.zsync > nvim.appimage.zsync.sha256sum
162191
echo "SHA_APP_IMAGE_ZSYNC=$(cat nvim.appimage.zsync.sha256sum)" >> $GITHUB_ENV
163-
- name: Generate macOS SHA256 checksums
192+
- name: Generate macos SHA256 checksums
164193
run: |
165194
cd ./nvim-macos
166-
sha256sum nvim-macos.tar.gz > nvim-macos.tar.gz.sha256sum
167-
echo "SHA_MACOS=$(cat nvim-macos.tar.gz.sha256sum)" >> $GITHUB_ENV
195+
sha256sum nvim-macos-x86_64.tar.gz > nvim-macos-x86_64.tar.gz.sha256sum
196+
echo "SHA_MACOS_X86_64=$(cat nvim-macos-x86_64.tar.gz.sha256sum)" >> $GITHUB_ENV
197+
sha256sum nvim-macos-arm64.tar.gz > nvim-macos-arm64.tar.gz.sha256sum
198+
echo "SHA_MACOS_ARM64=$(cat nvim-macos-arm64.tar.gz.sha256sum)" >> $GITHUB_ENV
168199
- name: Generate Win64 SHA256 checksums
169200
run: |
170201
cd ./nvim-win64

Diff for: CMakeLists.txt

-1
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,6 @@ ExternalProject_Add(uncrustify
307307
URL_HASH SHA256=ecaf4c0adca14c36dfffa30bc28e69865115ecd602c90eb16a8cddccb41caad2
308308
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/uncrustify
309309
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
310-
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
311310
EXCLUDE_FROM_ALL TRUE
312311
DOWNLOAD_NO_PROGRESS TRUE)
313312

Diff for: cmake.deps/cmake/BuildGettext.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ if(MSVC)
88
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
99
-D LIBICONV_INCLUDE_DIRS=${DEPS_INSTALL_DIR}/include
1010
-D LIBICONV_LIBRARIES=${DEPS_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}libcharset${CMAKE_STATIC_LIBRARY_SUFFIX}$<SEMICOLON>${DEPS_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}libiconv${CMAKE_STATIC_LIBRARY_SUFFIX}
11-
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
1211
${EXTERNALPROJECT_OPTIONS})
1312
else()
1413
message(FATAL_ERROR "Trying to build gettext in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")

Diff for: cmake.deps/cmake/BuildLibiconv.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ if(MSVC)
66
${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibiconvCMakeLists.txt
77
${DEPS_BUILD_DIR}/src/libiconv/CMakeLists.txt
88
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
9-
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
109
${EXTERNALPROJECT_OPTIONS})
1110
else()
1211
message(FATAL_ERROR "Trying to build libiconv in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")

Diff for: cmake.deps/cmake/BuildLibuv.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,4 @@ ExternalProject_Add(libuv
66
-D BUILD_TESTING=OFF
77
-D LIBUV_BUILD_SHARED=OFF
88
-D UV_LINT_W4=OFF
9-
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
109
${EXTERNALPROJECT_OPTIONS})

Diff for: cmake.deps/cmake/BuildLibvterm.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,4 @@ ExternalProject_Add(libvterm
55
${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibvtermCMakeLists.txt
66
${DEPS_BUILD_DIR}/src/libvterm/CMakeLists.txt
77
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
8-
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
98
${EXTERNALPROJECT_OPTIONS})

Diff for: cmake.deps/cmake/BuildLpeg.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ ExternalProject_Add(lpeg
55
${CMAKE_CURRENT_SOURCE_DIR}/cmake/LpegCMakeLists.txt
66
${DEPS_BUILD_DIR}/src/lpeg/CMakeLists.txt
77
CMAKE_ARGS ${DEPS_CMAKE_ARGS} -DCMAKE_C_FLAGS=${DEPS_INCLUDE_FLAGS}
8-
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
98
${EXTERNALPROJECT_OPTIONS})
109

1110
if(USE_BUNDLED_LUAJIT)

Diff for: cmake.deps/cmake/BuildLuajit.cmake

+4-45
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,13 @@
44
function(BuildLuajit)
55
cmake_parse_arguments(_luajit
66
""
7-
"TARGET"
7+
""
88
"CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND;DEPENDS"
99
${ARGN})
10-
if(NOT _luajit_TARGET)
11-
set(_luajit_TARGET "luajit")
12-
endif()
1310

1411
get_externalproject_options(luajit ${DEPS_IGNORE_SHA})
15-
ExternalProject_Add(${_luajit_TARGET}
16-
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/${_luajit_TARGET}
12+
ExternalProject_Add(luajit
13+
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/luajit
1714
CONFIGURE_COMMAND "${_luajit_CONFIGURE_COMMAND}"
1815
BUILD_IN_SOURCE 1
1916
BUILD_COMMAND "${_luajit_BUILD_COMMAND}"
@@ -47,49 +44,11 @@ if(APPLE)
4744
set(DEPLOYMENT_TARGET "MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}")
4845
endif()
4946

50-
if((UNIX AND NOT APPLE) OR (APPLE AND NOT CMAKE_OSX_ARCHITECTURES))
47+
if(UNIX)
5148
BuildLuaJit(INSTALL_COMMAND ${BUILDCMD_UNIX}
5249
CC=${DEPS_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR}
5350
${DEPLOYMENT_TARGET} install)
5451

55-
elseif(CMAKE_OSX_ARCHITECTURES AND APPLE)
56-
57-
set(LUAJIT_C_COMPILER "${CMAKE_C_COMPILER}")
58-
if(CMAKE_OSX_SYSROOT)
59-
set(LUAJIT_C_COMPILER "${LUAJIT_C_COMPILER} -isysroot${CMAKE_OSX_SYSROOT}")
60-
endif()
61-
62-
# Passing multiple `-arch` flags to the LuaJIT build will cause it to fail.
63-
# To get a working universal build, we build each requested architecture slice
64-
# individually then `lipo` them all up.
65-
set(LUAJIT_SRC_DIR "${DEPS_BUILD_DIR}/src/luajit")
66-
foreach(ARCH IN LISTS CMAKE_OSX_ARCHITECTURES)
67-
set(STATIC_CC "${LUAJIT_C_COMPILER} -arch ${ARCH}")
68-
set(DYNAMIC_CC "${LUAJIT_C_COMPILER} -arch ${ARCH} -fPIC")
69-
set(TARGET_LD "${LUAJIT_C_COMPILER} -arch ${ARCH}")
70-
list(APPEND LUAJIT_THIN_EXECUTABLES "${LUAJIT_SRC_DIR}-${ARCH}/src/luajit")
71-
list(APPEND LUAJIT_THIN_STATIC_LIBS "${LUAJIT_SRC_DIR}-${ARCH}/src/libluajit.a")
72-
list(APPEND LUAJIT_THIN_DYLIBS "${LUAJIT_SRC_DIR}-${ARCH}/src/libluajit.so")
73-
list(APPEND LUAJIT_THIN_TARGETS "luajit-${ARCH}")
74-
75-
# See https://luajit.org/install.html#cross.
76-
BuildLuaJit(TARGET "luajit-${ARCH}"
77-
BUILD_COMMAND ${BUILDCMD_UNIX}
78-
CC=${LUAJIT_C_COMPILER} STATIC_CC=${STATIC_CC}
79-
DYNAMIC_CC=${DYNAMIC_CC} TARGET_LD=${TARGET_LD}
80-
PREFIX=${DEPS_INSTALL_DIR}
81-
${DEPLOYMENT_TARGET})
82-
endforeach()
83-
BuildLuaJit(
84-
CONFIGURE_COMMAND ${BUILDCMD_UNIX} CC=${LUAJIT_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR} ${DEPLOYMENT_TARGET}
85-
COMMAND ${CMAKE_COMMAND} -E rm -f ${LUAJIT_SRC_DIR}/src/luajit ${LUAJIT_SRC_DIR}/src/libluajit.so ${LUAJIT_SRC_DIR}/src/libluajit.a
86-
BUILD_COMMAND lipo ${LUAJIT_THIN_EXECUTABLES} -create -output ${LUAJIT_SRC_DIR}/src/luajit
87-
COMMAND lipo ${LUAJIT_THIN_STATIC_LIBS} -create -output ${LUAJIT_SRC_DIR}/src/libluajit.a
88-
COMMAND lipo ${LUAJIT_THIN_DYLIBS} -create -output ${LUAJIT_SRC_DIR}/src/libluajit.so
89-
INSTALL_COMMAND ${BUILDCMD_UNIX} CC=${LUAJIT_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR} ${DEPLOYMENT_TARGET} install
90-
DEPENDS ${LUAJIT_THIN_TARGETS}
91-
)
92-
9352
elseif(MINGW)
9453

9554
if(CMAKE_GENERATOR MATCHES "Ninja")

Diff for: cmake.deps/cmake/BuildLuv.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ ExternalProject_Add(luv
3131
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/luv
3232
SOURCE_DIR ${DEPS_BUILD_DIR}/src/luv
3333
CMAKE_ARGS ${DEPS_CMAKE_ARGS} ${LUV_CMAKE_ARGS}
34-
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
3534
${EXTERNALPROJECT_OPTIONS})
3635

3736
if(USE_BUNDLED_LUAJIT)

Diff for: cmake.deps/cmake/BuildMsgpack.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,4 @@ ExternalProject_Add(msgpack
44
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
55
-D MSGPACK_BUILD_TESTS=OFF
66
-D MSGPACK_BUILD_EXAMPLES=OFF
7-
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
87
${EXTERNALPROJECT_OPTIONS})

Diff for: cmake.deps/cmake/BuildTreesitter.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,4 @@ ExternalProject_Add(treesitter
55
${CMAKE_CURRENT_SOURCE_DIR}/cmake/TreesitterCMakeLists.txt
66
${DEPS_BUILD_DIR}/src/treesitter/CMakeLists.txt
77
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
8-
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
98
${EXTERNALPROJECT_OPTIONS})

Diff for: cmake.deps/cmake/BuildTreesitterParsers.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ function(BuildTSParser)
2525
${DEPS_BUILD_DIR}/src/${NAME}/CMakeLists.txt
2626
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
2727
-D PARSERLANG=${TS_LANG}
28-
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
2928
${EXTERNALPROJECT_OPTIONS})
3029
endfunction()
3130

Diff for: cmake.deps/cmake/BuildUnibilium.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,4 @@ get_externalproject_options(unibilium ${DEPS_IGNORE_SHA})
22
ExternalProject_Add(unibilium
33
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/unibilium
44
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
5-
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
65
${EXTERNALPROJECT_OPTIONS})

Diff for: cmake.packaging/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ if(WIN32)
4444
list(APPEND CPACK_WIX_EXTENSIONS WixUtilExtension)
4545
list(APPEND CPACK_WIX_PATCH_FILE ${CMAKE_CURRENT_LIST_DIR}/WixPatch.xml)
4646
elseif(APPLE)
47-
set(CPACK_PACKAGE_FILE_NAME "nvim-macos")
47+
set(CPACK_PACKAGE_FILE_NAME "nvim-macos-${CMAKE_SYSTEM_PROCESSOR}")
4848
set(CPACK_GENERATOR TGZ)
4949
set(CPACK_PACKAGE_ICON ${CMAKE_CURRENT_LIST_DIR}/neovim.icns)
5050
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")

Diff for: cmake/Deps.cmake

-7
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ if(APPLE)
1818
list(APPEND DEPS_CMAKE_ARGS -D CMAKE_FIND_FRAMEWORK=${CMAKE_FIND_FRAMEWORK})
1919
endif()
2020

21-
set(DEPS_CMAKE_CACHE_ARGS -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES})
22-
2321
# MAKE_PRG
2422
if(UNIX)
2523
find_program(MAKE_PRG NAMES gmake make)
@@ -48,11 +46,6 @@ set(DEPS_C_COMPILER "${CMAKE_C_COMPILER}")
4846
if(CMAKE_OSX_SYSROOT)
4947
set(DEPS_C_COMPILER "${DEPS_C_COMPILER} -isysroot${CMAKE_OSX_SYSROOT}")
5048
endif()
51-
if(CMAKE_OSX_ARCHITECTURES)
52-
foreach(ARCH IN LISTS CMAKE_OSX_ARCHITECTURES)
53-
set(DEPS_C_COMPILER "${DEPS_C_COMPILER} -arch ${ARCH}")
54-
endforeach()
55-
endif()
5649

5750
function(get_externalproject_options name DEPS_IGNORE_SHA)
5851
string(TOUPPER ${name} name_allcaps)

0 commit comments

Comments
 (0)