diff options
author | Brad King <brad.king@kitware.com> | 2022-06-10 15:11:06 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2022-06-10 15:11:25 (GMT) |
commit | efbbae9705d89719804387056c8d592545710487 (patch) | |
tree | 0cd2fec013c3104ed34ad681e6558a0002c1cd7b /Source | |
parent | ec6d574d4a4d0347f714086707f6a24b2bb16775 (diff) | |
parent | a54f7a698374c699540b790baaafca9dd0e3b0a4 (diff) | |
download | CMake-efbbae9705d89719804387056c8d592545710487.zip CMake-efbbae9705d89719804387056c8d592545710487.tar.gz CMake-efbbae9705d89719804387056c8d592545710487.tar.bz2 |
Merge topic 'update-kwsys' into release-3.24
a54f7a6983 Merge branch 'upstream-KWSys' into update-kwsys
975c44654d KWSys 2022-06-09 (9b65e88d)
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !7345
Diffstat (limited to 'Source')
-rw-r--r-- | Source/kwsys/SystemTools.cxx | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx index c38b456..5889a4b 100644 --- a/Source/kwsys/SystemTools.cxx +++ b/Source/kwsys/SystemTools.cxx @@ -94,6 +94,13 @@ # include <linux/fs.h> #endif +#if defined(__APPLE__) && \ + (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0 >= 101200) +# define KWSYS_SYSTEMTOOLS_HAVE_MACOS_COPYFILE_CLONE +# include <copyfile.h> +# include <sys/stat.h> +#endif + // Windows API. #if defined(_WIN32) # include <windows.h> @@ -2474,6 +2481,26 @@ Status SystemTools::CloneFileContent(std::string const& source, close(out); return status; +#elif defined(__APPLE__) && \ + defined(KWSYS_SYSTEMTOOLS_HAVE_MACOS_COPYFILE_CLONE) + // NOTE: we cannot use `clonefile` as the {a,c,m}time for the file needs to + // be updated by `copy_file_if_different` and `copy_file`. + if (copyfile(source.c_str(), destination.c_str(), nullptr, + COPYFILE_METADATA | COPYFILE_CLONE) < 0) { + return Status::POSIX_errno(); + } +# if KWSYS_CXX_HAS_UTIMENSAT + // utimensat is only available on newer Unixes and macOS 10.13+ + if (utimensat(AT_FDCWD, destination.c_str(), nullptr, 0) < 0) { + return Status::POSIX_errno(); + } +# else + // fall back to utimes + if (utimes(destination.c_str(), nullptr) < 0) { + return Status::POSIX_errno(); + } +# endif + return Status::Success(); #else (void)source; (void)destination; |