From 6dcd1bfa39684c952730904a43e268f42bf98301 Mon Sep 17 00:00:00 2001 From: Yves Frederix Date: Fri, 20 Apr 2018 15:37:06 +0200 Subject: file(INSTALL): Preserve file time when writing NTFS alternate stream When cross-compiling on a Windows host, we use a `:cmake_mode_t` NTFS alternate stream to store the file mode for use during packaging. Writing to this stream changes the file modification time, so save and restore the original modification time since we are not modifying the real file content. Fixes: #17922 --- Source/cmFileCommand.cxx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 0d31070..6c1a869 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -1129,14 +1129,26 @@ protected: if (permissions) { #ifdef WIN32 if (Makefile->IsOn("CMAKE_CROSSCOMPILING")) { + // Store the mode in an NTFS alternate stream. std::string mode_t_adt_filename = std::string(toFile) + ":cmake_mode_t"; + // Writing to an NTFS alternate stream changes the modification + // time, so we need to save and restore its original value. + cmSystemToolsFileTime* file_time_orig = cmSystemTools::FileTimeNew(); + cmSystemTools::FileTimeGet(toFile, file_time_orig); + cmsys::ofstream permissionStream(mode_t_adt_filename.c_str()); if (permissionStream) { permissionStream << std::oct << permissions << std::endl; } + + permissionStream.close(); + + cmSystemTools::FileTimeSet(toFile, file_time_orig); + + cmSystemTools::FileTimeDelete(file_time_orig); } #endif -- cgit v0.12