From c85ef9c339a9aea5160217e33f917b5d130c9fab Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Tue, 6 Feb 2018 14:51:44 +0100 Subject: [PATCH] Autogen: Overwrite info files when changed only Check if the content of the AUTOMOC/UIC/RCC info file will change before overwriting it. This avoids unnecessary AUTORCC rebuilds when AUTORCC unrelated CMake settings change. --- Source/cmQtAutoGenInitializer.cxx | 46 ++++++++----------------------- 1 file changed, 12 insertions(+), 34 deletions(-) diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx index 41142e5ab6..93c78b5bdf 100644 --- a/Source/cmQtAutoGenInitializer.cxx +++ b/Source/cmQtAutoGenInitializer.cxx @@ -8,6 +8,7 @@ #include "cmCustomCommandLines.h" #include "cmDuration.h" #include "cmFilePathChecksum.h" +#include "cmGeneratedFileStream.h" #include "cmGeneratorTarget.h" #include "cmGlobalGenerator.h" #include "cmLinkItem.h" @@ -22,7 +23,6 @@ #include "cmStateTypes.h" #include "cmSystemTools.h" #include "cmTarget.h" -#include "cm_sys_stat.h" #include "cmake.h" #include "cmsys/FStream.hxx" #include "cmsys/SystemInformation.hxx" @@ -867,34 +867,6 @@ void cmQtAutoGenInitializer::SetupCustomTargets() dir += cfg; } - auto OpenInfoFile = [](cmsys::ofstream& ofs, - std::string const& fileName) -> bool { - // Ensure we have write permission - if (cmSystemTools::FileExists(fileName)) { - mode_t perm = 0; -#if defined(_WIN32) && !defined(__CYGWIN__) - mode_t mode_write = S_IWRITE; -#else - mode_t mode_write = S_IWUSR; -#endif - cmSystemTools::GetPermissions(fileName, perm); - if (!(perm & mode_write)) { - cmSystemTools::SetPermissions(fileName, perm | mode_write); - } - } - - ofs.open(fileName.c_str(), - (std::ios::out | std::ios::binary | std::ios::trunc)); - if (!ofs) { - // File open error - std::string error = "Internal CMake error when trying to open file: "; - error += Quoted(fileName); - error += " for writing."; - cmSystemTools::Error(error.c_str()); - } - return static_cast(ofs); - }; - // Generate autogen target info file if (this->MocEnabled || this->UicEnabled) { if (this->MocEnabled) { @@ -911,8 +883,10 @@ void cmQtAutoGenInitializer::SetupCustomTargets() this->Parallel = std::to_string(GetParallelCPUCount()); } - cmsys::ofstream ofs; - if (OpenInfoFile(ofs, this->AutogenInfoFile)) { + cmGeneratedFileStream ofs; + ofs.SetCopyIfDifferent(true); + ofs.Open(this->AutogenInfoFile.c_str(), false, true); + if (ofs) { // Utility lambdas auto CWrite = [&ofs](const char* key, std::string const& value) { ofs << "set(" << key << " " << cmOutputConverter::EscapeForCMake(value) @@ -1012,14 +986,18 @@ void cmQtAutoGenInitializer::SetupCustomTargets() CWriteNestedLists("AM_UIC_OPTIONS_OPTIONS", this->UicFileOptions); CWriteList("AM_UIC_SEARCH_PATHS", this->UicSearchPaths); } + } else { + return; } } // Generate auto RCC info files if (this->RccEnabled) { for (Qrc const& qrc : this->Qrcs) { - cmsys::ofstream ofs; - if (OpenInfoFile(ofs, qrc.InfoFile)) { + cmGeneratedFileStream ofs; + ofs.SetCopyIfDifferent(true); + ofs.Open(qrc.InfoFile.c_str(), false, true); + if (ofs) { // Utility lambdas auto CWrite = [&ofs](const char* key, std::string const& value) { ofs << "set(" << key << " " @@ -1069,7 +1047,7 @@ void cmQtAutoGenInitializer::SetupCustomTargets() CWrite("ARCC_OPTIONS", cmJoin(qrc.Options, ";")); CWrite("ARCC_INPUTS", cmJoin(qrc.Resources, ";")); } else { - break; + return; } } }