From fa5284f07f20e6d62ca5d2dab36ecc48c0511eba Mon Sep 17 00:00:00 2001 From: Mike Pagel Date: Mon, 28 Sep 2015 15:33:10 +0200 Subject: VS: Prevent generated "rule" files from causing rebuilds When we generate a ".rule" file to attach a custom command in a VS IDE project, set the file timestamp to be old enough to prevent the rule from re-running due to its timestamp. --- Source/cmVisualStudio10TargetGenerator.cxx | 27 +++++++++++++++++++++++++++ Source/cmVisualStudio10TargetGenerator.h | 2 ++ 2 files changed, 29 insertions(+) diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 92403e3..6c71313 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -9,6 +9,7 @@ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more information. ============================================================================*/ +#include "windows.h" #include "cmVisualStudio10TargetGenerator.h" #include "cmGlobalVisualStudio10Generator.h" #include "cmGeneratorTarget.h" @@ -871,6 +872,9 @@ cmVisualStudio10TargetGenerator::WriteCustomRule(cmSourceFile const* source, fout << "# generated from CMake\n"; fout.flush(); fout.close(); + // Force given file to have a very old timestamp, thus + // preventing dependent rebuilds. + this->ForceOld(sourcePath); } else { @@ -3458,3 +3462,26 @@ cmVisualStudio10TargetGenerator this->WriteString("BuildFileStream) << cmVS10EscapeXML(keyFile) << "\" />\n"; } + +bool cmVisualStudio10TargetGenerator::ForceOld(const std::string& source) const +{ + HANDLE h = CreateFileW( + cmSystemTools::ConvertToWindowsExtendedPath(source).c_str(), + FILE_WRITE_ATTRIBUTES, + FILE_SHARE_WRITE, 0, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, 0); + if (!h) + { + return false; + } + + FILETIME const ftime_20010101 = { 3365781504, 29389701 }; + if (!SetFileTime(h, &ftime_20010101, &ftime_20010101, &ftime_20010101)) + { + CloseHandle(h); + return false; + } + + CloseHandle(h); + return true; +} diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h index 5fadb60..f2aaf05 100644 --- a/Source/cmVisualStudio10TargetGenerator.h +++ b/Source/cmVisualStudio10TargetGenerator.h @@ -130,6 +130,8 @@ private: cmIDEFlagTable const* GetLinkFlagTable() const; cmIDEFlagTable const* GetMasmFlagTable() const; + bool ForceOld(const std::string& source) const; + private: typedef cmVisualStudioGeneratorOptions Options; typedef std::map OptionsMap; -- cgit v0.12