Commit 3062a63364d6c213cb501809c727ff828eb9acae

Edward Thomson 2021-07-30T12:03:35

cmake: extended futimens checking on macOS

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 58214fd..ff34119 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -27,6 +27,7 @@ INCLUDE(AddCFlagIfSupported)
 INCLUDE(FindPkgLibraries)
 INCLUDE(FindThreads)
 INCLUDE(FindStatNsec)
+INCLUDE(Findfutimens)
 INCLUDE(GNUInstallDirs)
 INCLUDE(IdeSplitSources)
 INCLUDE(FeatureSummary)
diff --git a/cmake/Findfutimens.cmake b/cmake/Findfutimens.cmake
new file mode 100644
index 0000000..73b7952
--- /dev/null
+++ b/cmake/Findfutimens.cmake
@@ -0,0 +1,14 @@
+INCLUDE(EnableWarnings)
+
+IF (APPLE)
+	# We cannot simply CHECK_FUNCTION_EXISTS on macOS because
+	# MACOSX_DEPLOYMENT_TARGET may be set to a version in the past
+	# that doesn't have futimens.  Instead we need to enable warnings
+	# as errors, then check for the symbol existing in `sys/stat.h`,
+	# then reset warnings as errors.
+	ENABLE_WARNINGS(error)
+	CHECK_SYMBOL_EXISTS(futimens sys/stat.h HAVE_FUTIMENS)
+	DISABLE_WARNINGS(error)
+ELSE ()
+	CHECK_FUNCTION_EXISTS(futimens HAVE_FUTIMENS)
+ENDIF ()
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8d15595..d340899 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -38,10 +38,10 @@ IF(ENABLE_TRACE)
 ENDIF()
 ADD_FEATURE_INFO(tracing GIT_TRACE "tracing support")
 
-CHECK_FUNCTION_EXISTS(futimens HAVE_FUTIMENS)
 IF (HAVE_FUTIMENS)
 	SET(GIT_USE_FUTIMENS 1)
 ENDIF ()
+ADD_FEATURE_INFO(futimens GIT_USE_FUTIMENS "futimens support")
 
 CHECK_PROTOTYPE_DEFINITION(qsort_r
 	"void qsort_r(void *base, size_t nmemb, size_t size, void *thunk, int (*compar)(void *, const void *, const void *))"