mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-05 21:31:08 -06:00
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:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user