aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/buildgraph/executor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/corelib/buildgraph/executor.cpp')
-rw-r--r--src/lib/corelib/buildgraph/executor.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/lib/corelib/buildgraph/executor.cpp b/src/lib/corelib/buildgraph/executor.cpp
index 24f077f65..be6efc1c4 100644
--- a/src/lib/corelib/buildgraph/executor.cpp
+++ b/src/lib/corelib/buildgraph/executor.cpp
@@ -51,6 +51,7 @@
#include "rulecommands.h"
#include "rulenode.h"
#include "rulesevaluationcontext.h"
+#include "transformerchangetracking.h"
#include <buildgraph/transformer.h>
#include <language/language.h>
@@ -160,11 +161,18 @@ void Executor::setProject(const TopLevelProjectPtr &project)
{
m_project = project;
m_allProducts = project->allProducts();
+ m_projectsByName.clear();
+ m_projectsByName.insert(std::make_pair(project->name, project.get()));
+ for (const ResolvedProjectPtr &p : project->allSubProjects())
+ m_projectsByName.insert(std::make_pair(p->name, p.get()));
}
void Executor::setProducts(const QList<ResolvedProductPtr> &productsToBuild)
{
m_productsToBuild = productsToBuild;
+ m_productsByName.clear();
+ for (const ResolvedProductPtr &p : productsToBuild)
+ m_productsByName.insert(std::make_pair(p->uniqueName(), p.get()));
}
class ProductPrioritySetter
@@ -424,6 +432,11 @@ bool Executor::mustExecuteTransformer(const TransformerPtr &transformer) const
return true;
}
+ if (commandsNeedRerun(transformer.get(), transformer->product().get(), m_productsByName,
+ m_projectsByName)) {
+ return true;
+ }
+
// If all artifacts in a transformer have "alwaysUpdated" set to false, that transformer
// is always run.
return !hasAlwaysUpdatedArtifacts;
@@ -493,7 +506,7 @@ void Executor::executeRuleNode(RuleNode *ruleNode)
}
RuleNode::ApplicationResult result;
- ruleNode->apply(m_logger, changedInputArtifacts, &result);
+ ruleNode->apply(m_logger, changedInputArtifacts, m_productsByName, m_projectsByName, &result);
if (result.upToDate) {
qCDebug(lcExec) << ruleNode->toString() << "is up to date. Skipping.";
@@ -823,6 +836,9 @@ void Executor::rescueOldBuildData(Artifact *artifact, bool *childrenAdded = 0)
artifact->transformer->importedFilesUsedInCommands = rad.importedFilesUsedInCommands;
artifact->transformer->depsRequestedInPrepareScript = rad.depsRequestedInPrepareScript;
artifact->transformer->depsRequestedInCommands = rad.depsRequestedInCommands;
+ artifact->transformer->lastCommandExecutionTime = rad.lastCommandExecutionTime;
+ artifact->transformer->lastPrepareScriptExecutionTime = rad.lastPrepareScriptExecutionTime;
+ artifact->transformer->commandsNeedChangeTracking = true;
artifact->setTimestamp(rad.timeStamp);
if (childrenAdded && !childrenToConnect.empty())
*childrenAdded = true;