From 8d27b407787549a90d47d273a753bb0000e5e73e Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 8 Oct 2015 13:37:37 -0400 Subject: [PATCH] cmFileTimeComparison: Port to OS X nanosecond times (#15769) --- Source/CMakeLists.txt | 1 + Source/cmFileTimeComparison.cxx | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 28a3fd143..ee690e68a 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -550,6 +550,7 @@ endforeach() foreach(check STAT_HAS_ST_MTIM + STAT_HAS_ST_MTIMESPEC ) if(KWSYS_CXX_${check}_COMPILED) # abuse KWSys check cache entry set(CMake_${check} 1) diff --git a/Source/cmFileTimeComparison.cxx b/Source/cmFileTimeComparison.cxx index 8d5e08daa..279b61da9 100644 --- a/Source/cmFileTimeComparison.cxx +++ b/Source/cmFileTimeComparison.cxx @@ -166,6 +166,24 @@ int cmFileTimeComparisonInternal::Compare(cmFileTimeComparison_Type* s1, { return 1; } +# elif CMake_STAT_HAS_ST_MTIMESPEC + // Compare using nanosecond resolution. + if(s1->st_mtimespec.tv_sec < s2->st_mtimespec.tv_sec) + { + return -1; + } + else if(s1->st_mtimespec.tv_sec > s2->st_mtimespec.tv_sec) + { + return 1; + } + else if(s1->st_mtimespec.tv_nsec < s2->st_mtimespec.tv_nsec) + { + return -1; + } + else if(s1->st_mtimespec.tv_nsec > s2->st_mtimespec.tv_nsec) + { + return 1; + } # else // Compare using 1 second resolution. if(s1->st_mtime < s2->st_mtime) @@ -207,6 +225,23 @@ bool cmFileTimeComparisonInternal::TimesDiffer(cmFileTimeComparison_Type* s1, { return false; } +# elif CMake_STAT_HAS_ST_MTIMESPEC + // Times are integers in units of 1ns. + long long bil = 1000000000; + long long t1 = s1->st_mtimespec.tv_sec * bil + s1->st_mtimespec.tv_nsec; + long long t2 = s2->st_mtimespec.tv_sec * bil + s2->st_mtimespec.tv_nsec; + if(t1 < t2) + { + return (t2 - t1) >= bil; + } + else if(t2 < t1) + { + return (t1 - t2) >= bil; + } + else + { + return false; + } # else // Times are integers in units of 1s. if(s1->st_mtime < s2->st_mtime)