From 32ae9c6127d21b8408f2573904fec8ab0b666d36 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 3 Oct 2016 20:22:53 +0530 Subject: [PATCH] build: Fix clock_gettime check with XCode 8 With XCode 8, clock_gettime will be incorrectly detected as being available regardless of what OS X version we're targetting because the symbol is available in the .tbd library as a weak symbol. See: https://github.com/Homebrew/homebrew-core/issues/3727#issue-170086273 It's only starting from macOS 10.12 that clock_gettime is actually available, so we can unconditionally disable it when targetting older versions. We cannot simply do AC_CHECK_FUNCS with -Wl,-no_weak_imports because the autoconf check does its own prototype declaration that doesn't trigger that compiler flag. https://bugzilla.gnome.org/show_bug.cgi?id=772451 --- configure.ac | 38 +++++++++++++++++++++++++++++++++++--- m4/check-checks.m4 | 2 +- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 05ac220f72..b07dbf2c0c 100644 --- a/configure.ac +++ b/configure.ac @@ -675,18 +675,50 @@ AC_CHECK_FUNCS([posix_memalign]) AC_CHECK_FUNCS([getpagesize]) dnl Check for POSIX timers -AC_CHECK_FUNCS(clock_gettime, [], [ +CLOCK_GETTIME_FOUND="no" +AC_CHECK_FUNC(clock_gettime, [CLOCK_GETTIME_FOUND="yes"], [ AC_CHECK_LIB(rt, clock_gettime, [ - AC_DEFINE(HAVE_CLOCK_GETTIME, 1) + CLOCK_GETTIME_FOUND="yes" LIBS="$LIBS -lrt" ], [ AC_CHECK_LIB(pthread, clock_gettime, [ - AC_DEFINE(HAVE_CLOCK_GETTIME, 1) + CLOCK_GETTIME_FOUND="yes" LIBS="$LIBS -lpthread" ]) ]) ]) +# With XCode 8, clock_gettime will be incorrectly detected as being available +# regardless of what version of OS X you target because the symbol is available +# in the .tbd file as a weak symbol. +# See: https://bugzilla.gnome.org/show_bug.cgi?id=772451 +# +# We cannot simply do AC_CHECK_FUNCS with -Wl,-no_weak_imports because the +# autoconf check does its own prototype declaration that doesn't trigger that +# compiler flag. +# +# It's only starting from macOS 10.12, that clock_gettime is actually available, +# so we can unconditionally disable it when targetting older versions. +case "$host_os" in + darwin*) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#include +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12 +#error "Not compiling for OS X 10.12 or later" +#endif + ]])], [], [ + if test "$CLOCK_GETTIME_FOUND" = "yes"; then + AC_MSG_NOTICE([Disabling incorrectly detected clock_gettime on OS X]) + fi + CLOCK_GETTIME_FOUND="no" + ]) + ;; +esac + +if test "$CLOCK_GETTIME_FOUND" = "yes"; then + AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [Have clock_gettime]) +fi + AC_CACHE_CHECK(for posix timers, gst_cv_posix_timers, AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include diff --git a/m4/check-checks.m4 b/m4/check-checks.m4 index 16ba777d37..99aaa8ad7f 100644 --- a/m4/check-checks.m4 +++ b/m4/check-checks.m4 @@ -95,7 +95,7 @@ AC_CHECK_LIB([rt], [timer_create, timer_settime, timer_delete]) AM_CONDITIONAL(HAVE_TIMER_CREATE_SETTIME_DELETE, test "x$ac_cv_lib_rt_timer_create__timer_settime__timer_delete" = "xyes") dnl Allow for checking HAVE_CLOCK_GETTIME in automake files -AM_CONDITIONAL(HAVE_CLOCK_GETTIME, test "x$ac_cv_func_clock_gettime" = "xyes") +AM_CONDITIONAL(HAVE_CLOCK_GETTIME, test "x$HAVE_CLOCK_GETTIME" = "xyes") dnl Create _stdint.h in the top-level directory AX_CREATE_STDINT_H