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.cpp100
1 files changed, 49 insertions, 51 deletions
diff --git a/src/lib/corelib/buildgraph/executor.cpp b/src/lib/corelib/buildgraph/executor.cpp
index 583fd2396..f54034173 100644
--- a/src/lib/corelib/buildgraph/executor.cpp
+++ b/src/lib/corelib/buildgraph/executor.cpp
@@ -111,7 +111,12 @@ void Executor::retrieveSourceFileTimestamp(Artifact *artifact) const
{
QBS_CHECK(artifact->artifactType == Artifact::SourceFile);
- artifact->setTimestamp(recursiveFileTime(artifact->filePath()));
+ if (m_buildOptions.changedFiles().contains(artifact->filePath()))
+ artifact->setTimestamp(FileTime::currentTime());
+ else if (m_buildOptions.changedFiles().isEmpty())
+ artifact->setTimestamp(recursiveFileTime(artifact->filePath()));
+ else
+ artifact->setTimestamp(FileTime::oldestTime());
artifact->timestampRetrieved = true;
}
@@ -220,21 +225,10 @@ void Executor::setBuildOptions(const BuildOptions &buildOptions)
m_buildOptions = buildOptions;
}
-static void initNodesBottomUp(BuildGraphNode *node)
-{
- if (node->buildState == BuildGraphNode::Untouched)
- return;
- node->buildState = BuildGraphNode::Buildable;
- foreach (BuildGraphNode *parent, node->parents)
- initNodesBottomUp(parent);
-}
void Executor::initLeaves()
{
- if (m_buildOptions.changedFiles().isEmpty())
- updateLeaves(m_roots);
- else
- initLeavesForSelectedFiles();
+ updateLeaves(m_roots);
}
void Executor::updateLeaves(const NodeSet &nodes)
@@ -244,28 +238,6 @@ void Executor::updateLeaves(const NodeSet &nodes)
updateLeaves(node, seenNodes);
}
-void Executor::initLeavesForSelectedFiles()
-{
- ArtifactSet changedArtifacts;
- foreach (const QString &filePath, m_buildOptions.changedFiles()) {
- QList<FileResourceBase *> lookupResults;
- lookupResults.append(m_project->buildData->lookupFiles(filePath));
- if (lookupResults.isEmpty()) {
- m_logger.qbsWarning() << QString::fromLocal8Bit("Out of date file '%1' provided "
- "but not found.").arg(QDir::toNativeSeparators(filePath));
- continue;
- }
- foreach (FileResourceBase *lookupResult, lookupResults)
- if (Artifact *artifact = dynamic_cast<Artifact *>(lookupResult))
- changedArtifacts += artifact;
- }
-
- foreach (Artifact *artifact, changedArtifacts) {
- m_leaves.push(artifact);
- initNodesBottomUp(artifact);
- }
-}
-
void Executor::updateLeaves(BuildGraphNode *node, NodeSet &seenNodes)
{
if (seenNodes.contains(node))
@@ -306,7 +278,8 @@ bool Executor::scheduleJobs()
switch (nodeToBuild->buildState) {
case BuildGraphNode::Untouched:
- QBS_ASSERT(!"untouched node in leaves list", /* ignore */);
+ QBS_ASSERT(!"untouched node in leaves list",
+ qDebug("%s", qPrintable(nodeToBuild->toString())));
break;
case BuildGraphNode::Buildable:
// This is the only state in which we want to build a node.
@@ -582,6 +555,34 @@ QString Executor::configString() const
return tr(" for configuration %1").arg(m_project->id());
}
+bool Executor::transformerHasMatchingOutputTags(const TransformerConstPtr &transformer) const
+{
+ if (m_activeFileTags.isEmpty())
+ return true; // No filtering requested.
+
+ foreach (Artifact * const output, transformer->outputs) {
+ if (m_activeFileTags.matches(output->fileTags))
+ return true;
+ }
+
+ return false;
+}
+
+bool Executor::transformerHasMatchingInputFiles(const TransformerConstPtr &transformer) const
+{
+ if (m_buildOptions.filesToConsider().isEmpty())
+ return true; // No filtering requested.
+
+ foreach (const Artifact * const input, transformer->inputs) {
+ foreach (const QString &filePath, m_buildOptions.filesToConsider()) {
+ if (input->filePath() == filePath)
+ return true;
+ }
+ }
+
+ return false;
+}
+
void Executor::cancelJobs()
{
m_logger.qbsTrace() << "Canceling all jobs.";
@@ -733,8 +734,6 @@ bool Executor::checkForUnbuiltDependencies(Artifact *artifact)
void Executor::potentiallyRunTransformer(const TransformerPtr &transformer)
{
- bool matchingFileTagsExist = m_activeFileTags.isEmpty();
-
foreach (Artifact * const output, transformer->outputs) {
// Rescuing build data can introduce new dependencies, potentially delaying execution of
// this transformer.
@@ -742,20 +741,22 @@ void Executor::potentiallyRunTransformer(const TransformerPtr &transformer)
rescueOldBuildData(output, &childrenAddedDueToRescue);
if (childrenAddedDueToRescue && checkForUnbuiltDependencies(output))
return;
-
- if (!matchingFileTagsExist && m_activeFileTags.matches(output->fileTags))
- matchingFileTagsExist = true;
}
- // Skip if we're building just one file and the file tags do not match.
- if (!matchingFileTagsExist) {
+ if (!transformerHasMatchingOutputTags(transformer)) {
if (m_doDebug)
m_logger.qbsDebug() << "[EXEC] file tags do not match. Skipping.";
finishTransformer(transformer);
return;
}
- // Skip transformers that do not need to be built.
+ if (!transformerHasMatchingInputFiles(transformer)) {
+ if (m_doDebug)
+ m_logger.qbsDebug() << "[EXEC] input files do not match. Skipping.";
+ finishTransformer(transformer);
+ return;
+ }
+
if (!mustExecuteTransformer(transformer)) {
if (m_doDebug)
m_logger.qbsDebug() << "[EXEC] Up to date. Skipping.";
@@ -927,21 +928,18 @@ void Executor::prepareArtifact(Artifact *artifact)
*/
void Executor::prepareReachableNodes()
{
- const BuildGraphNode::BuildState initialBuildState = m_buildOptions.changedFiles().isEmpty()
- ? BuildGraphNode::Buildable : BuildGraphNode::Built;
foreach (BuildGraphNode *root, m_roots)
- prepareReachableNodes_impl(root, initialBuildState);
+ prepareReachableNodes_impl(root);
}
-void Executor::prepareReachableNodes_impl(BuildGraphNode *node,
- const BuildGraphNode::BuildState buildState)
+void Executor::prepareReachableNodes_impl(BuildGraphNode *node)
{
if (node->buildState != BuildGraphNode::Untouched)
return;
- node->buildState = buildState;
+ node->buildState = BuildGraphNode::Buildable;
foreach (BuildGraphNode *child, node->children)
- prepareReachableNodes_impl(child, buildState);
+ prepareReachableNodes_impl(child);
}
void Executor::prepareProducts()