aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Clason <c.clason@uni-graz.at>2022-06-25 12:16:04 +0200
committerGitHub <noreply@github.com>2022-06-25 12:16:04 +0200
commit5c2c88717a9d32df3b59065397d9ee7c357491b4 (patch)
treed27e6944167e2fa8e60c37118f99c4ee33bedca3
parentece2960f1b2994c58c7978435309e46d241307ac (diff)
parentd0644fa9bfc3fa3abdd886d2ef13533778317154 (diff)
downloadrneovim-5c2c88717a9d32df3b59065397d9ee7c357491b4.tar.gz
rneovim-5c2c88717a9d32df3b59065397d9ee7c357491b4.tar.bz2
rneovim-5c2c88717a9d32df3b59065397d9ee7c357491b4.zip
Merge pull request #19029 from carlocab/macos-universal
ci: build universal release on macOS
-rw-r--r--.github/workflows/notes.md2
-rw-r--r--.github/workflows/release.yml43
-rw-r--r--third-party/CMakeLists.txt13
-rw-r--r--third-party/cmake/BuildLuajit.cmake77
-rw-r--r--third-party/cmake/BuildLuv.cmake4
-rw-r--r--third-party/cmake/BuildMsgpack.cmake4
-rw-r--r--third-party/cmake/BuildTreesitterParsers.cmake4
7 files changed, 104 insertions, 43 deletions
diff --git a/.github/workflows/notes.md b/.github/workflows/notes.md
index 3bd6c739a5..86f9e8e618 100644
--- a/.github/workflows/notes.md
+++ b/.github/workflows/notes.md
@@ -22,7 +22,7 @@ ${NVIM_VERSION}
1. Download **nvim-macos.tar.gz**
2. Extract: `tar xzvf nvim-macos.tar.gz`
-3. Run `./nvim-osx64/bin/nvim`
+3. Run `./nvim-macos/bin/nvim`
### Linux (x64)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index aad76d0979..1c6e62abbb 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -78,7 +78,7 @@ jobs:
retention-days: 1
macOS:
- runs-on: macos-10.15
+ runs-on: macos-11
steps:
- uses: actions/checkout@v3
with:
@@ -91,27 +91,36 @@ jobs:
run: printf 'NVIM_BUILD_TYPE=Release\n' >> $GITHUB_ENV
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
run: printf 'NVIM_BUILD_TYPE=RelWithDebInfo\n' >> $GITHUB_ENV
+ - name: Provision universal `libintl`
+ run: |
+ GETTEXT_PREFIX="$(brew --prefix gettext)"
+ printf 'GETTEXT_PREFIX=%s\n' "$GETTEXT_PREFIX" >> $GITHUB_ENV
+ bottle_tag="arm64_big_sur"
+ brew fetch --bottle-tag="$bottle_tag" gettext
+ cd "$(mktemp -d)"
+ tar xf "$(brew --cache)"/**/*gettext*${bottle_tag}*.tar.gz
+ lipo gettext/*/lib/libintl.a "${GETTEXT_PREFIX}/lib/libintl.a" -create -output libintl.a
+ mv -f libintl.a /usr/local/lib/
+ - name: Ensure static linkage to `libintl`
+ run: |
+ # We're about to mangle `gettext`, so let's remove any potentially broken
+ # installs (e.g. curl, git) as those could interfere with our build.
+ brew uninstall $(brew uses --installed --recursive gettext)
+ brew unlink gettext
+ ln -sf "$(brew --prefix)/opt/$(readlink "${GETTEXT_PREFIX}")/bin"/* /usr/local/bin/
+ rm -f "$GETTEXT_PREFIX"
- name: Build release
run: |
- make CMAKE_BUILD_TYPE=${NVIM_BUILD_TYPE} CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11"
- make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-osx64" install
+ export MACOSX_DEPLOYMENT_TARGET="$(sw_vers -productVersion | cut -f1 -d.)"
+ OSX_FLAGS="-DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} -DCMAKE_OSX_ARCHITECTURES=arm64\;x86_64"
+ make CMAKE_BUILD_TYPE=${NVIM_BUILD_TYPE} \
+ CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH= $OSX_FLAGS" \
+ DEPS_CMAKE_FLAGS="$OSX_FLAGS"
+ make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-macos" install
- name: Create package
run: |
cd "$GITHUB_WORKSPACE/build/release"
- mkdir -p nvim-osx64/libs
- libs=($(otool -L nvim-osx64/bin/nvim | sed 1d | sed -E -e 's|^[[:space:]]*||' -e 's| .*||'))
- echo "libs:"
- for lib in "${libs[@]}"; do
- if echo "$lib" | grep -q -E 'libSystem|CoreServices' 2>/dev/null; then
- echo " [skipped] $lib"
- else
- echo " $lib"
- relname="libs/${lib##*/}"
- cp -L "$lib" "nvim-osx64/$relname"
- install_name_tool -change "$lib" "@executable_path/../$relname" nvim-osx64/bin/nvim
- fi
- done
- tar cfz nvim-macos.tar.gz nvim-osx64
+ tar cfz nvim-macos.tar.gz nvim-macos
- uses: actions/upload-artifact@v3
with:
name: nvim-macos
diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt
index 9f1b3f0706..6fe5c2baf5 100644
--- a/third-party/CMakeLists.txt
+++ b/third-party/CMakeLists.txt
@@ -119,6 +119,19 @@ if(CMAKE_OSX_SYSROOT)
endif()
endif()
+if(CMAKE_OSX_ARCHITECTURES)
+ string(REPLACE ";" "|" CMAKE_OSX_ARCHITECTURES_ALT_SEP "${CMAKE_OSX_ARCHITECTURES}")
+ # The LuaJIT build does not like being passed multiple `-arch` flags
+ # so we handle a universal build the old-fashioned way.
+ set(LUAJIT_C_COMPILER "${DEPS_C_COMPILER}")
+ foreach(ARCH IN LISTS CMAKE_OSX_ARCHITECTURES)
+ set(DEPS_C_COMPILER "${DEPS_C_COMPILER} -arch ${ARCH}")
+ if(DEPS_CXX_COMPILER)
+ set(DEPS_CXX_COMPILER "${DEPS_CXX_COMPILER} -arch ${ARCH}")
+ endif()
+ endforeach()
+endif()
+
set(HOSTDEPS_INSTALL_DIR "${DEPS_INSTALL_DIR}")
set(HOSTDEPS_BIN_DIR "${DEPS_BIN_DIR}")
set(HOSTDEPS_LIB_DIR "${DEPS_LIB_DIR}")
diff --git a/third-party/cmake/BuildLuajit.cmake b/third-party/cmake/BuildLuajit.cmake
index fc8558588b..23422f2708 100644
--- a/third-party/cmake/BuildLuajit.cmake
+++ b/third-party/cmake/BuildLuajit.cmake
@@ -5,7 +5,7 @@ function(BuildLuajit)
cmake_parse_arguments(_luajit
""
"TARGET"
- "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND;DEPENDS"
${ARGN})
if(NOT _luajit_CONFIGURE_COMMAND AND NOT _luajit_BUILD_COMMAND
AND NOT _luajit_INSTALL_COMMAND)
@@ -30,13 +30,14 @@ function(BuildLuajit)
CONFIGURE_COMMAND "${_luajit_CONFIGURE_COMMAND}"
BUILD_IN_SOURCE 1
BUILD_COMMAND "${_luajit_BUILD_COMMAND}"
- INSTALL_COMMAND "${_luajit_INSTALL_COMMAND}")
+ INSTALL_COMMAND "${_luajit_INSTALL_COMMAND}"
+ DEPENDS "${_luajit_DEPENDS}")
# Create symlink for development version manually.
if(UNIX)
add_custom_command(
TARGET ${_luajit_TARGET}
- COMMAND ${CMAKE_COMMAND} -E create_symlink luajit-2.1.0-beta3 ${DEPS_BIN_DIR}/luajit)
+ COMMAND ${CMAKE_COMMAND} -E create_symlink luajit-2.1.0-beta3 ${DEPS_BIN_DIR}/${_luajit_TARGET})
endif()
endfunction()
@@ -51,30 +52,62 @@ if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
else()
set(AMD64_ABI "")
endif()
-set(INSTALLCMD_UNIX ${MAKE_PRG} CFLAGS=-fPIC
- CFLAGS+=-DLUA_USE_APICHECK
- CFLAGS+=-funwind-tables
- ${NO_STACK_CHECK}
- ${AMD64_ABI}
- CCDEBUG+=-g
- Q=
- install)
+set(BUILDCMD_UNIX ${MAKE_PRG} CFLAGS=-fPIC
+ CFLAGS+=-DLUA_USE_APICHECK
+ CFLAGS+=-funwind-tables
+ ${NO_STACK_CHECK}
+ ${AMD64_ABI}
+ CCDEBUG+=-g
+ Q=)
-if(UNIX)
- if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
- if(CMAKE_OSX_DEPLOYMENT_TARGET)
- set(DEPLOYMENT_TARGET "MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}")
- else()
- # Use the same target as our nightly builds
- set(DEPLOYMENT_TARGET "MACOSX_DEPLOYMENT_TARGET=10.11")
- endif()
+if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ if(CMAKE_OSX_DEPLOYMENT_TARGET)
+ set(DEPLOYMENT_TARGET "MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}")
else()
- set(DEPLOYMENT_TARGET "")
+ execute_process(COMMAND sw_vers -productVersion OUTPUT_VARIABLE MACOS_VERSION)
+ set(DEPLOYMENT_TARGET "MACOSX_DEPLOYMENT_TARGET=${MACOS_VERSION}")
endif()
+else()
+ set(DEPLOYMENT_TARGET "")
+endif()
- BuildLuaJit(INSTALL_COMMAND ${INSTALLCMD_UNIX}
+if((UNIX AND NOT APPLE) OR (APPLE AND NOT CMAKE_OSX_ARCHITECTURES))
+ BuildLuaJit(INSTALL_COMMAND ${BUILDCMD_UNIX}
CC=${DEPS_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR}
- ${DEPLOYMENT_TARGET})
+ ${DEPLOYMENT_TARGET} install)
+
+elseif(CMAKE_OSX_ARCHITECTURES AND APPLE)
+
+ # Passing multiple `-arch` flags to the LuaJIT build will cause it to fail.
+ # To get a working universal build, we build each requested architecture slice
+ # individually then `lipo` them all up.
+ set(LUAJIT_SRC_DIR "${DEPS_BUILD_DIR}/src/luajit")
+ foreach(ARCH IN LISTS CMAKE_OSX_ARCHITECTURES)
+ set(STATIC_CC "${LUAJIT_C_COMPILER} -arch ${ARCH}")
+ set(DYNAMIC_CC "${LUAJIT_C_COMPILER} -arch ${ARCH} -fPIC")
+ set(TARGET_LD "${LUAJIT_C_COMPILER} -arch ${ARCH}")
+ list(APPEND LUAJIT_THIN_EXECUTABLES "${LUAJIT_SRC_DIR}-${ARCH}/src/luajit")
+ list(APPEND LUAJIT_THIN_STATIC_LIBS "${LUAJIT_SRC_DIR}-${ARCH}/src/libluajit.a")
+ list(APPEND LUAJIT_THIN_DYLIBS "${LUAJIT_SRC_DIR}-${ARCH}/src/libluajit.so")
+ list(APPEND LUAJIT_THIN_TARGETS "luajit-${ARCH}")
+
+ # See https://luajit.org/install.html#cross.
+ BuildLuaJit(TARGET "luajit-${ARCH}"
+ BUILD_COMMAND ${BUILDCMD_UNIX}
+ CC=${LUAJIT_C_COMPILER} STATIC_CC=${STATIC_CC}
+ DYNAMIC_CC=${DYNAMIC_CC} TARGET_LD=${TARGET_LD}
+ PREFIX=${DEPS_INSTALL_DIR}
+ ${DEPLOYMENT_TARGET})
+ endforeach()
+ BuildLuaJit(
+ CONFIGURE_COMMAND ${BUILDCMD_UNIX} CC=${LUAJIT_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR} ${DEPLOYMENT_TARGET}
+ COMMAND ${CMAKE_COMMAND} -E rm -f ${LUAJIT_SRC_DIR}/src/luajit ${LUAJIT_SRC_DIR}/src/libluajit.so ${LUAJIT_SRC_DIR}/src/libluajit.a
+ BUILD_COMMAND lipo ${LUAJIT_THIN_EXECUTABLES} -create -output ${LUAJIT_SRC_DIR}/src/luajit
+ COMMAND lipo ${LUAJIT_THIN_STATIC_LIBS} -create -output ${LUAJIT_SRC_DIR}/src/libluajit.a
+ COMMAND lipo ${LUAJIT_THIN_DYLIBS} -create -output ${LUAJIT_SRC_DIR}/src/libluajit.so
+ INSTALL_COMMAND ${BUILDCMD_UNIX} CC=${LUAJIT_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR} ${DEPLOYMENT_TARGET} install
+ DEPENDS ${LUAJIT_THIN_TARGETS}
+ )
elseif(MINGW)
diff --git a/third-party/cmake/BuildLuv.cmake b/third-party/cmake/BuildLuv.cmake
index 001f5a325a..6e9a333dc8 100644
--- a/third-party/cmake/BuildLuv.cmake
+++ b/third-party/cmake/BuildLuv.cmake
@@ -48,7 +48,8 @@ function(BuildLuv)
PATCH_COMMAND "${_luv_PATCH_COMMAND}"
CONFIGURE_COMMAND "${_luv_CONFIGURE_COMMAND}"
BUILD_COMMAND "${_luv_BUILD_COMMAND}"
- INSTALL_COMMAND "${_luv_INSTALL_COMMAND}")
+ INSTALL_COMMAND "${_luv_INSTALL_COMMAND}"
+ LIST_SEPARATOR |)
endfunction()
set(LUV_SRC_DIR ${DEPS_BUILD_DIR}/src/luv)
@@ -65,6 +66,7 @@ set(LUV_CONFIGURE_COMMAND_COMMON
-DCMAKE_GENERATOR=${CMAKE_GENERATOR}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES_ALT_SEP}
-DLUA_BUILD_TYPE=System
-DLUA_COMPAT53_DIR=${DEPS_BUILD_DIR}/src/lua-compat-5.3
-DWITH_SHARED_LIBUV=ON
diff --git a/third-party/cmake/BuildMsgpack.cmake b/third-party/cmake/BuildMsgpack.cmake
index a89c1e34d0..10bf1c8e37 100644
--- a/third-party/cmake/BuildMsgpack.cmake
+++ b/third-party/cmake/BuildMsgpack.cmake
@@ -27,7 +27,8 @@ function(BuildMsgpack)
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
CONFIGURE_COMMAND "${_msgpack_CONFIGURE_COMMAND}"
BUILD_COMMAND "${_msgpack_BUILD_COMMAND}"
- INSTALL_COMMAND "${_msgpack_INSTALL_COMMAND}")
+ INSTALL_COMMAND "${_msgpack_INSTALL_COMMAND}"
+ LIST_SEPARATOR |)
endfunction()
set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack
@@ -36,6 +37,7 @@ set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack
-DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES_ALT_SEP}
"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} -fPIC"
-DCMAKE_GENERATOR=${CMAKE_GENERATOR})
diff --git a/third-party/cmake/BuildTreesitterParsers.cmake b/third-party/cmake/BuildTreesitterParsers.cmake
index 4ceb402455..11ffb792de 100644
--- a/third-party/cmake/BuildTreesitterParsers.cmake
+++ b/third-party/cmake/BuildTreesitterParsers.cmake
@@ -19,9 +19,11 @@ CMAKE_ARGS
-DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES_ALT_SEP}
# Pass toolchain
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-DPARSERLANG=c
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
-INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE}
+LIST_SEPARATOR |)