Skip to content

Commit

Permalink
Fix legacy builds crashing in 10.9-10.11 by disabling clock_gettime
Browse files Browse the repository at this point in the history
Recent Vim builds introduced the use of clock_gettime(), which on macOS
was only introduced in 10.12. In Vim, we added a configure check to
detect its existence (vim/vim#12242) but it
only works to detect the build-time environment. For MacVim builds we
build on new machines but deploy on old machines by using
MACOSX_DEPLOYMENT_TARGET=10.9 when building. This means that the
configure script will detect clock_gettime() exists and includes it, but
at runtime the app will crash when running MacVim (legacy builds) in
10.9-10.11.

To fix this, add explicit checks to make sure we undef
HAVE_CLOCK_GETTIME if deployment target is below 10.12. Unfortunately
there isn't really a way to detect such things automatically in a
configure script as it requires knowledge of historical releases.
  • Loading branch information
ychin committed Jul 6, 2023
1 parent 3aa035b commit 6aae44a
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 0 deletions.
1 change: 1 addition & 0 deletions .github/workflows/ci-macvim.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ jobs:
- name: Check version
run: |
${VIM_BIN} --version
${VIM_BIN} -u NONE -i NONE --not-a-term -esNX -V1 -c 'echo "prof_nsec:" .. has("prof_nsec")' -c quit
${VIM_BIN} -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-1.vim -c quit
${VIM_BIN} -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-2.vim -c quit
Expand Down
8 changes: 8 additions & 0 deletions src/os_mac.h
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,14 @@ typedef int clockid_t;
# define CLOCK_MONOTONIC 1
# endif

# if !defined(MAC_OS_X_VERSION_10_12) \
|| (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12)
// This happens when building on a newer machine for a min deployment lower
// than 10.12. The build environment supports clock_gettime(), but the target
// runtime doesn't.
# undef HAVE_CLOCK_GETTIME
# endif

struct itimerspec
{
struct timespec it_interval; // timer period
Expand Down

0 comments on commit 6aae44a

Please sign in to comment.