Commit c85ef9c3 authored by Sebastian Holtermann's avatar Sebastian Holtermann Committed by Brad King
Browse files

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.
parent 9c1efb61
......@@ -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<bool>(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;
}
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment