Fix problems with clock_gettime and OSX < 10.12 + XCode 8
authorChristopher Dykes <cdykes@fb.com>
Fri, 10 Mar 2017 21:52:11 +0000 (13:52 -0800)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Fri, 10 Mar 2017 22:05:02 +0000 (14:05 -0800)
Summary: It's a pain, so rely on macros to figure a few things about the build configuration.

Reviewed By: yfeldblum

Differential Revision: D4229128

fbshipit-source-id: 78b414c21cae6ba51ade2ab75b117cccad5c608c

folly/portability/Time.cpp
folly/portability/Time.h

index 237bc9e370e05df40ae78cd178cb1ee534179224..dec1daf427969e817ae0fbb0cded6f473079ef73 100755 (executable)
@@ -32,7 +32,7 @@ static void duration_to_ts(
                          .count());
 }
 
-#if !FOLLY_HAVE_CLOCK_GETTIME
+#if !FOLLY_HAVE_CLOCK_GETTIME || FOLLY_FORCE_CLOCK_GETTIME_DEFINITION
 #if __MACH__
 #include <errno.h>
 #include <mach/mach_init.h>
index 708a5faf956c1dc4442015bda698bcd15982f527..0ed24a27f5522eb9cbcaeb719b265f91d3ac4067 100755 (executable)
 
 #include <folly/portability/Config.h>
 
+// OSX is a pain. The XCode 8 SDK always declares clock_gettime
+// even if the target OS version doesn't support it, so you get
+// an error at runtime because it can't resolve the symbol. We
+// solve that by pretending we have it here in the header and
+// then enable our implementation on the source side so that
+// gets linked in instead.
+#if __MACH__ && ( \
+      MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12 || \
+      __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0)
+
+# ifdef FOLLY_HAVE_CLOCK_GETTIME
+# undef FOLLY_HAVE_CLOCK_GETTIME
+# endif
+
+# define FOLLY_HAVE_CLOCK_GETTIME 1
+# define FOLLY_FORCE_CLOCK_GETTIME_DEFINITION 1
+
+#endif
+
 // These aren't generic implementations, so we can only declare them on
 // platforms we support.
 #if !FOLLY_HAVE_CLOCK_GETTIME && (defined(__MACH__) || defined(_WIN32))