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.cpp61
1 files changed, 31 insertions, 30 deletions
diff --git a/src/lib/corelib/buildgraph/executor.cpp b/src/lib/corelib/buildgraph/executor.cpp
index f0fe7d726..2b8232a0a 100644
--- a/src/lib/corelib/buildgraph/executor.cpp
+++ b/src/lib/corelib/buildgraph/executor.cpp
@@ -135,11 +135,9 @@ void Executor::retrieveSourceFileTimestamp(Artifact *artifact) const
{
QBS_CHECK(artifact->artifactType == Artifact::SourceFile);
- if (m_buildOptions.changedFiles().empty())
- artifact->setTimestamp(recursiveFileTime(artifact->filePath()));
- else if (m_buildOptions.changedFiles().contains(artifact->filePath()))
+ if (m_buildOptions.changedFiles().contains(artifact->filePath()))
artifact->setTimestamp(FileTime::currentTime());
- else if (!artifact->timestamp().isValid())
+ else if (m_buildOptions.changedFiles().empty() || !artifact->timestamp().isValid())
artifact->setTimestamp(recursiveFileTime(artifact->filePath()));
artifact->timestampRetrieved = true;
@@ -206,7 +204,7 @@ private:
{
if (!m_seenProducts.insert(product).second)
return;
- for (const ResolvedProductPtr &dependency : qAsConst(product->dependencies))
+ for (const ResolvedProductPtr &dependency : std::as_const(product->dependencies))
traverse(dependency);
if (!product->buildData)
return;
@@ -265,6 +263,7 @@ void Executor::doBuild()
QBS_CHECK(!m_project->buildData->evaluationContext);
m_project->buildData->evaluationContext = std::make_shared<RulesEvaluationContext>(m_logger);
m_evalContext = m_project->buildData->evaluationContext;
+ m_progressObserver->addScriptEngine(m_evalContext->engine());
m_elapsedTimeRules = m_elapsedTimeScanners = m_elapsedTimeInstalling = 0;
m_evalContext->engine()->enableProfiling(m_buildOptions.logElapsedTime());
@@ -330,7 +329,7 @@ void Executor::updateLeaves(BuildGraphNode *node, NodeSet &seenNodes)
}
bool isLeaf = true;
- for (BuildGraphNode *child : qAsConst(node->children)) {
+ for (BuildGraphNode *child : std::as_const(node->children)) {
if (child->buildState != BuildGraphNode::Built) {
isLeaf = false;
updateLeaves(child, seenNodes);
@@ -398,8 +397,10 @@ bool Executor::schedulingBlockedByJobLimit(const BuildGraphNode *node)
if (currentJobCount == 0)
continue;
const auto jobLimitIsExceeded = [currentJobCount, jobPool, this](const Transformer *t) {
- const int maxJobCount = m_jobLimitsPerProduct.at(t->product().get())
- .getLimit(jobPool);
+ const auto it = m_jobLimitsPerProduct.find(t->product().get());
+ if (it == m_jobLimitsPerProduct.cend())
+ return false; // See checkNodeProduct() for why this is possible
+ const int maxJobCount = it->second.getLimit(jobPool);
return maxJobCount > 0 && currentJobCount >= maxJobCount;
};
@@ -451,7 +452,7 @@ bool Executor::isUpToDate(Artifact *artifact) const
return false;
}
- for (FileDependency *fileDependency : qAsConst(artifact->fileDependencies)) {
+ for (FileDependency *fileDependency : std::as_const(artifact->fileDependencies)) {
if (!fileDependency->timestamp().isValid()) {
qCDebug(lcUpToDateCheck) << "file dependency doesn't exist"
<< fileDependency->filePath();
@@ -478,7 +479,7 @@ bool Executor::mustExecuteTransformer(const TransformerPtr &transformer) const
bool hasAlwaysUpdatedArtifacts = false;
bool hasUpToDateNotAlwaysUpdatedArtifacts = false;
- for (Artifact *artifact : qAsConst(transformer->outputs)) {
+ for (Artifact *artifact : std::as_const(transformer->outputs)) {
if (isUpToDate(artifact)) {
if (artifact->alwaysUpdated)
hasAlwaysUpdatedArtifacts = true;
@@ -567,7 +568,7 @@ void Executor::finishJob(ExecutorJob *job, bool success)
updateJobCounts(transformer.get(), -1);
if (success) {
m_project->buildData->setDirty();
- for (Artifact * const artifact : qAsConst(transformer->outputs)) {
+ for (Artifact * const artifact : std::as_const(transformer->outputs)) {
if (artifact->alwaysUpdated) {
artifact->setTimestamp(FileTime::currentTime());
for (Artifact * const parent : artifact->parentArtifacts())
@@ -626,7 +627,7 @@ static bool allChildrenBuilt(BuildGraphNode *node)
void Executor::finishNode(BuildGraphNode *leaf)
{
leaf->buildState = BuildGraphNode::Built;
- for (BuildGraphNode * const parent : qAsConst(leaf->parents)) {
+ for (BuildGraphNode * const parent : std::as_const(leaf->parents)) {
if (parent->buildState != BuildGraphNode::Buildable) {
qCDebug(lcExec).noquote() << "parent" << parent->toString()
<< "build state:" << toString(parent->buildState);
@@ -679,7 +680,7 @@ bool Executor::transformerHasMatchingInputFiles(const TransformerConstPtr &trans
return false;
if (transformer->inputs.empty())
return true;
- for (const Artifact * const input : qAsConst(transformer->inputs)) {
+ for (const Artifact * const input : std::as_const(transformer->inputs)) {
const auto files = m_buildOptions.filesToConsider();
for (const QString &filePath : files) {
if (input->filePath() == filePath
@@ -695,7 +696,7 @@ bool Executor::transformerHasMatchingInputFiles(const TransformerConstPtr &trans
void Executor::setupJobLimits()
{
Settings settings(m_buildOptions.settingsDirectory());
- for (const auto &p : qAsConst(m_productsToBuild)) {
+ for (const auto &p : std::as_const(m_productsToBuild)) {
const Preferences prefs(&settings, p->profile());
const JobLimits &jobLimitsFromSettings = prefs.jobLimits();
JobLimits effectiveJobLimits;
@@ -732,7 +733,7 @@ void Executor::setupProgressObserver()
if (!m_progressObserver)
return;
int totalEffort = 1; // For the effort after the last rule application;
- for (const auto &product : qAsConst(m_productsToBuild)) {
+ for (const auto &product : std::as_const(m_productsToBuild)) {
QBS_CHECK(product->buildData);
const auto filtered = filterByType<RuleNode>(product->buildData->allNodes());
totalEffort += std::distance(filtered.begin(), filtered.end());
@@ -744,7 +745,7 @@ void Executor::doSanityChecks()
{
QBS_CHECK(m_project);
QBS_CHECK(!m_productsToBuild.empty());
- for (const auto &product : qAsConst(m_productsToBuild)) {
+ for (const auto &product : std::as_const(m_productsToBuild)) {
QBS_CHECK(product->buildData);
QBS_CHECK(product->topLevelProject() == m_project.get());
}
@@ -915,7 +916,7 @@ bool Executor::checkForUnbuiltDependencies(Artifact *artifact)
{
bool buildingDependenciesFound = false;
NodeSet unbuiltDependencies;
- for (BuildGraphNode * const dependency : qAsConst(artifact->children)) {
+ for (BuildGraphNode * const dependency : std::as_const(artifact->children)) {
switch (dependency->buildState) {
case BuildGraphNode::Untouched:
case BuildGraphNode::Buildable:
@@ -946,7 +947,7 @@ bool Executor::checkForUnbuiltDependencies(Artifact *artifact)
void Executor::potentiallyRunTransformer(const TransformerPtr &transformer)
{
- for (Artifact * const output : qAsConst(transformer->outputs)) {
+ for (Artifact * const output : std::as_const(transformer->outputs)) {
// Rescuing build data can introduce new dependencies, potentially delaying execution of
// this transformer.
bool childrenAddedDueToRescue;
@@ -969,7 +970,7 @@ void Executor::potentiallyRunTransformer(const TransformerPtr &transformer)
const bool mustExecute = mustExecuteTransformer(transformer);
if (mustExecute || m_buildOptions.forceTimestampCheck()) {
- for (Artifact * const output : qAsConst(transformer->outputs)) {
+ for (Artifact * const output : std::as_const(transformer->outputs)) {
// Scan all input artifacts. If new dependencies were found during scanning, delay
// execution of this transformer.
InputArtifactScanner scanner(output, m_inputArtifactScanContext, m_logger);
@@ -1000,7 +1001,7 @@ void Executor::runTransformer(const TransformerPtr &transformer)
// create the output directories
if (!m_buildOptions.dryRun()) {
- for (Artifact * const output : qAsConst(transformer->outputs)) {
+ for (Artifact * const output : std::as_const(transformer->outputs)) {
QDir outDir = QFileInfo(output->filePath()).absoluteDir();
if (!outDir.exists() && !outDir.mkpath(StringConstants::dot())) {
throw ErrorInfo(tr("Failed to create directory '%1'.")
@@ -1011,7 +1012,7 @@ void Executor::runTransformer(const TransformerPtr &transformer)
QBS_CHECK(!m_availableJobs.empty());
ExecutorJob *job = m_availableJobs.takeFirst();
- for (Artifact * const artifact : qAsConst(transformer->outputs))
+ for (Artifact * const artifact : std::as_const(transformer->outputs))
artifact->buildState = BuildGraphNode::Building;
m_processingJobs.insert(job, transformer);
updateJobCounts(transformer.get(), 1);
@@ -1021,7 +1022,7 @@ void Executor::runTransformer(const TransformerPtr &transformer)
void Executor::finishTransformer(const TransformerPtr &transformer)
{
transformer->markedForRerun = false;
- for (Artifact * const artifact : qAsConst(transformer->outputs)) {
+ for (Artifact * const artifact : std::as_const(transformer->outputs)) {
possiblyInstallArtifact(artifact);
finishArtifact(artifact);
}
@@ -1082,9 +1083,9 @@ void Executor::checkForUnbuiltProducts()
if (m_buildOptions.executeRulesOnly())
return;
std::vector<ResolvedProductPtr> unbuiltProducts;
- for (const ResolvedProductPtr &product : qAsConst(m_productsToBuild)) {
+ for (const ResolvedProductPtr &product : std::as_const(m_productsToBuild)) {
bool productBuilt = true;
- for (BuildGraphNode *rootNode : qAsConst(product->buildData->rootNodes())) {
+ for (BuildGraphNode *rootNode : std::as_const(product->buildData->rootNodes())) {
if (rootNode->buildState != BuildGraphNode::Built) {
productBuilt = false;
unbuiltProducts.push_back(product);
@@ -1198,11 +1199,11 @@ void Executor::prepareAllNodes()
for (const ResolvedProductPtr &product : m_allProducts) {
if (product->enabled) {
QBS_CHECK(product->buildData);
- for (BuildGraphNode * const node : qAsConst(product->buildData->allNodes()))
+ for (BuildGraphNode * const node : std::as_const(product->buildData->allNodes()))
node->buildState = BuildGraphNode::Untouched;
}
}
- for (const ResolvedProductPtr &product : qAsConst(m_productsToBuild)) {
+ for (const ResolvedProductPtr &product : std::as_const(m_productsToBuild)) {
QBS_CHECK(product->buildData);
for (Artifact * const artifact : filterByType<Artifact>(product->buildData->allNodes()))
prepareArtifact(artifact);
@@ -1286,7 +1287,7 @@ void Executor::setupForBuildingSelectedFiles(const BuildGraphNode *node)
*/
void Executor::prepareReachableNodes()
{
- for (BuildGraphNode * const root : qAsConst(m_roots))
+ for (BuildGraphNode * const root : std::as_const(m_roots))
prepareReachableNodes_impl(root);
}
@@ -1298,7 +1299,7 @@ void Executor::prepareReachableNodes_impl(BuildGraphNode *node)
return;
node->buildState = BuildGraphNode::Buildable;
- for (BuildGraphNode *child : qAsConst(node->children))
+ for (BuildGraphNode *child : std::as_const(node->children))
prepareReachableNodes_impl(child);
}
@@ -1306,7 +1307,7 @@ void Executor::prepareProducts()
{
ProductPrioritySetter prioritySetter(m_allProducts);
prioritySetter.apply();
- for (const ResolvedProductPtr &product : qAsConst(m_productsToBuild)) {
+ for (const ResolvedProductPtr &product : std::as_const(m_productsToBuild)) {
EnvironmentScriptRunner(product.get(), m_evalContext.get(), m_project->environment)
.setupForBuild();
}
@@ -1315,7 +1316,7 @@ void Executor::prepareProducts()
void Executor::setupRootNodes()
{
m_roots.clear();
- for (const ResolvedProductPtr &product : qAsConst(m_productsToBuild))
+ for (const ResolvedProductPtr &product : std::as_const(m_productsToBuild))
m_roots += product->buildData->rootNodes();
}