From 6c1bc80d2791af9a5b07d59ce8e6f7039577eece 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 +- meson.build | 26 ++++++++++++++++++++++++-- 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index bf14e2b..1f78e4f 100644 --- a/configure.ac +++ b/configure.ac @@ -671,18 +671,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 16ba777..99aaa8a 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 diff --git a/meson.build b/meson.build index 1ea8340..c80b2b6 100644 --- a/meson.build +++ b/meson.build @@ -2,7 +2,7 @@ project('gstreamer', 'c', 'cpp', version : '1.9.90', meson_version : '>= 0.33.0', default_options : [ 'warning_level=1', - 'c_std=gnu99', + 'c_std=c99', 'buildtype=debugoptimized' ]) gst_version = meson.project_version() @@ -185,8 +185,30 @@ endif if cc.has_function('getpagesize', prefix : '#include') cdata.set('HAVE_GETPAGESIZE', 1) endif + +# With OS X 10.11.6 and XCode 8, clock_gettime will be incorrectly detected as +# being available because the symbol is available in the .tbd file as a weak +# symbol. See: https://github.com/Homebrew/homebrew-core/issues/3727#issue-170086273 +# +# We cannot simply do cc.has_function with -Wl,-no_weak_imports because the +# check does its own prototype decl 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 for older versions. +for_osx_10_12_src = '''#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 cc.has_function('clock_gettime', prefix : '#include ') - cdata.set('HAVE_CLOCK_GETTIME', 1) + if host_machine.system() == 'darwin' + if cc.compiles(for_osx_10_12_src, name : 'minimum OS X version required >= 10.12') + cdata.set('HAVE_CLOCK_GETTIME', 1) + endif + else + cdata.set('HAVE_CLOCK_GETTIME', 1) + endif endif # We only want to use the __declspec(dllexport/import) dance in GST_EXPORT when -- 2.7.4