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
This commit is contained in:
Yves Frederix
2018-04-20 15:37:06 +02:00
committed by Brad King
parent fe0082875a
commit 6dcd1bfa39

View File

@@ -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