[mono] Add proper check for clock_gettime (#42206)
authorRyan Lucia <rylucia@microsoft.com>
Wed, 16 Sep 2020 15:24:14 +0000 (11:24 -0400)
committerGitHub <noreply@github.com>
Wed, 16 Sep 2020 15:24:14 +0000 (11:24 -0400)
Fixes mono/mono wasm build

src/mono/configure.ac
src/mono/mono/utils/mono-time.c

index 24cfa42..945618a 100644 (file)
@@ -2254,7 +2254,28 @@ if test x$host_win32 = xno; then
                [#include <sys/types.h>])
 
        dnl hires monotonic clock support
-       AC_SEARCH_LIBS(clock_gettime, rt)
+
+       # Check for clock_gettime
+       if test x$target_osx = xyes; then
+               # On OSX, clock_gettime is only really available on 10.12 or later
+               # However, it exists as a weak symbol on earlier versions, so hard-code a version check
+               AC_MONO_APPLE_AVAILABLE(clock_gettime_available, [whether clock_gettime is available on OSX],
+               [(MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)])
+               if test x$clock_gettime_available = xyes; then
+                       AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [clock_gettime])
+               fi
+       else
+               AC_CHECK_FUNC(clock_gettime, [
+                       AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [clock_gettime])
+               ], [
+                       # Old glibc (< 2.17) has clock_gettime in librt, so check there too
+                       AC_CHECK_LIB(rt, clock_gettime, [
+                               AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [clock_gettime])
+                               LIBS="$LIBS -lrt"
+                       ])
+               ])
+       fi
+
        AC_CHECK_FUNCS(clock_nanosleep)
 
        dnl dynamic loader support
index 05dd2b9..beec026 100644 (file)
@@ -298,13 +298,17 @@ mono_clock_cleanup (mono_clock_id_t clk_id)
 
 guint64
 mono_clock_get_time_ns (mono_clock_id_t clk_id)
-{      
+{
+#ifdef HAVE_CLOCK_GETTIME
        struct timespec ts;
 
        if (clock_gettime (clk_id, &ts) == -1)
                g_error ("%s: clock_gettime () returned -1, errno = %d", __func__, errno);
 
        return ((guint64) ts.tv_sec * 1000000000) + (guint64) ts.tv_nsec;
+#else
+       return 0;
+#endif
 }
 
 #else