|
|
@@ -1180,11 +1180,54 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
|
|
|
if (useNinjaDepfile) {
|
|
|
// Create a custom command that generates a timestamp file and
|
|
|
// has a depfile assigned. The depfile is created by JobDepFilesMergeT.
|
|
|
-
|
|
|
- // Add additional autogen target dependencies
|
|
|
+ //
|
|
|
+ // Also create an additional '_autogen_timestamp_deps' that the custom
|
|
|
+ // command will depend on. It will have no sources or commands to
|
|
|
+ // execute, but it will have dependencies that would originally be
|
|
|
+ // assigned to the pre-Qt 5.15 'autogen' target. These dependencies will
|
|
|
+ // serve as a list of order-only dependencies for the custom command,
|
|
|
+ // without forcing the custom command to re-execute.
|
|
|
+ //
|
|
|
+ // The dependency tree would then look like
|
|
|
+ // '_autogen_timestamp_deps (order-only)' <- '/timestamp' file <-
|
|
|
+ // '_autogen' target.
|
|
|
+ const auto timestampTargetName =
|
|
|
+ cmStrCat(this->GenTarget->GetName(), "_autogen_timestamp_deps");
|
|
|
+ std::vector<std::string> timestampTargetProvides;
|
|
|
+ cmCustomCommandLines timestampTargetCommandLines;
|
|
|
+
|
|
|
+ // Add additional autogen target dependencies to
|
|
|
+ // '_autogen_timestamp_deps'.
|
|
|
for (const cmTarget* t : this->AutogenTarget.DependTargets) {
|
|
|
dependencies.push_back(t->GetName());
|
|
|
}
|
|
|
+
|
|
|
+ cmTarget* timestampTarget = this->LocalGen->AddUtilityCommand(
|
|
|
+ timestampTargetName, true, this->Dir.Work.c_str(),
|
|
|
+ /*byproducts=*/timestampTargetProvides,
|
|
|
+ /*depends=*/dependencies, timestampTargetCommandLines, false, nullptr);
|
|
|
+ this->LocalGen->AddGeneratorTarget(
|
|
|
+ cm::make_unique<cmGeneratorTarget>(timestampTarget, this->LocalGen));
|
|
|
+
|
|
|
+ // Set FOLDER property on the timestamp target, so it appears in the
|
|
|
+ // appropriate folder in an IDE or in the file api.
|
|
|
+ if (!this->TargetsFolder.empty()) {
|
|
|
+ timestampTarget->SetProperty("FOLDER", this->TargetsFolder);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Make '/timestamp' file depend on '_autogen_timestamp_deps' and on the
|
|
|
+ // moc and uic executables (whichever are enabled).
|
|
|
+ dependencies.clear();
|
|
|
+ dependencies.push_back(timestampTargetName);
|
|
|
+
|
|
|
+ if (this->Moc.ExecutableTarget != nullptr) {
|
|
|
+ dependencies.push_back(this->Moc.ExecutableTarget->Target->GetName());
|
|
|
+ }
|
|
|
+ if (this->Uic.ExecutableTarget != nullptr) {
|
|
|
+ dependencies.push_back(this->Uic.ExecutableTarget->Target->GetName());
|
|
|
+ }
|
|
|
+
|
|
|
+ // Create the custom command that outputs the timestamp file.
|
|
|
const char timestampFileName[] = "timestamp";
|
|
|
const std::string outputFile =
|
|
|
cmStrCat(this->Dir.Build, "/", timestampFileName);
|