PCH: Copy the timestamp from an absolute header file

If `target_precompile_headers` contains a file from the project,
then CMake will set the timestamp for `cmake_pch.h|xx` from that
file.

This helps with ccache and precompile headers.

Fixes: #19923
This commit is contained in:
Cristian Adam
2020-02-26 15:16:30 +01:00
committed by Brad King
parent 125f0451a9
commit 7e9b9fe918
+13
View File
@@ -25,6 +25,7 @@
#include "cmCustomCommand.h" #include "cmCustomCommand.h"
#include "cmCustomCommandGenerator.h" #include "cmCustomCommandGenerator.h"
#include "cmCustomCommandLines.h" #include "cmCustomCommandLines.h"
#include "cmFileTimes.h"
#include "cmGeneratedFileStream.h" #include "cmGeneratedFileStream.h"
#include "cmGeneratorExpression.h" #include "cmGeneratorExpression.h"
#include "cmGeneratorExpressionContext.h" #include "cmGeneratorExpressionContext.h"
@@ -3424,6 +3425,7 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
auto pchPrologue = this->Makefile->GetDefinition("CMAKE_PCH_PROLOGUE"); auto pchPrologue = this->Makefile->GetDefinition("CMAKE_PCH_PROLOGUE");
auto pchEpilogue = this->Makefile->GetDefinition("CMAKE_PCH_EPILOGUE"); auto pchEpilogue = this->Makefile->GetDefinition("CMAKE_PCH_EPILOGUE");
std::string firstHeaderOnDisk;
{ {
cmGeneratedFileStream file( cmGeneratedFileStream file(
filename_tmp, false, filename_tmp, false,
@@ -3447,6 +3449,11 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
} else { } else {
file << "#include \"" << header_bt.Value << "\"\n"; file << "#include \"" << header_bt.Value << "\"\n";
} }
if (cmSystemTools::FileExists(header_bt.Value) &&
firstHeaderOnDisk.empty()) {
firstHeaderOnDisk = header_bt.Value;
}
} }
if (language == "CXX") { if (language == "CXX") {
file << "#endif // __cplusplus\n"; file << "#endif // __cplusplus\n";
@@ -3458,6 +3465,11 @@ std::string cmGeneratorTarget::GetPchHeader(const std::string& config,
file << pchEpilogue << "\n"; file << pchEpilogue << "\n";
} }
} }
if (!firstHeaderOnDisk.empty()) {
cmFileTimes::Copy(firstHeaderOnDisk, filename_tmp);
}
cmSystemTools::MoveFileIfDifferent(filename_tmp, filename); cmSystemTools::MoveFileIfDifferent(filename_tmp, filename);
} }
} }
@@ -3516,6 +3528,7 @@ std::string cmGeneratorTarget::GetPchSource(const std::string& config,
cmGeneratedFileStream file(filename_tmp); cmGeneratedFileStream file(filename_tmp);
file << "/* generated by CMake */\n"; file << "/* generated by CMake */\n";
} }
cmFileTimes::Copy(pchHeader, filename_tmp);
cmSystemTools::MoveFileIfDifferent(filename_tmp, filename); cmSystemTools::MoveFileIfDifferent(filename_tmp, filename);
} }
} }