diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-01-31 16:36:17 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-01-31 16:36:17 +0100 |
commit | 028a2d908f269958331610b21f86cb03f1957b98 (patch) | |
tree | 4fefc28e07411b169412fd7670b039d65f44571c /src | |
parent | 606c5cd196e3345b42931306481fe8691f5bb9b6 (diff) | |
parent | 764fd1f6ea3f317ad4b50a865ab56b8a8c93080f (diff) |
Merge 1.10 into 1.11
Change-Id: I2d6cac6f24144c2c7e463ef7eed2e2c109f50bbf
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/corelib/buildgraph/executor.cpp | 57 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/executor.h | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/itemreaderastvisitor.cpp | 6 | ||||
-rw-r--r-- | src/lib/corelib/language/itemreaderastvisitor.h | 1 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 14 |
5 files changed, 63 insertions, 17 deletions
diff --git a/src/lib/corelib/buildgraph/executor.cpp b/src/lib/corelib/buildgraph/executor.cpp index fd2a22116..a7a98982c 100644 --- a/src/lib/corelib/buildgraph/executor.cpp +++ b/src/lib/corelib/buildgraph/executor.cpp @@ -149,7 +149,7 @@ void Executor::retrieveSourceFileTimestamp(Artifact *artifact) const void Executor::build() { try { - m_partialBuild = m_productsToBuild.size() != m_project->allProducts().size(); + m_partialBuild = m_productsToBuild.size() != m_allProducts.size(); doBuild(); } catch (const ErrorInfo &e) { handleError(e); @@ -159,6 +159,7 @@ void Executor::build() void Executor::setProject(const TopLevelProjectPtr &project) { m_project = project; + m_allProducts = project->allProducts(); } void Executor::setProducts(const QList<ResolvedProductPtr> &productsToBuild) @@ -168,23 +169,22 @@ void Executor::setProducts(const QList<ResolvedProductPtr> &productsToBuild) class ProductPrioritySetter { - const TopLevelProject *m_topLevelProject; + const QList<ResolvedProductPtr> &m_allProducts; unsigned int m_priority; Set<ResolvedProductPtr> m_seenProducts; public: - ProductPrioritySetter(const TopLevelProject *tlp) - : m_topLevelProject(tlp) + ProductPrioritySetter(const QList<ResolvedProductPtr> &allProducts) // TODO: Use only products to build? + : m_allProducts(allProducts) { } void apply() { - const QList<ResolvedProductPtr> &allProducts = m_topLevelProject->allProducts(); Set<ResolvedProductPtr> allDependencies; - for (const ResolvedProductPtr &product : allProducts) + for (const ResolvedProductPtr &product : m_allProducts) allDependencies += product->dependencies; const Set<ResolvedProductPtr> rootProducts - = Set<ResolvedProductPtr>::fromList(allProducts) - allDependencies; + = Set<ResolvedProductPtr>::fromList(m_allProducts) - allDependencies; m_priority = UINT_MAX; m_seenProducts.clear(); for (const ResolvedProductPtr &rootProduct : rootProducts) @@ -270,6 +270,7 @@ void Executor::doBuild() m_productInstaller->removeInstallRoot(); addExecutorJobs(); + syncFileDependencies(); prepareAllNodes(); prepareProducts(); setupRootNodes(); @@ -1111,7 +1112,7 @@ bool Executor::visit(RuleNode *ruleNode) */ void Executor::prepareAllNodes() { - for (const ResolvedProductPtr &product : m_project->allProducts()) { + for (const ResolvedProductPtr &product : m_allProducts) { if (product->enabled) { QBS_CHECK(product->buildData); for (BuildGraphNode * const node : qAsConst(product->buildData->nodes)) @@ -1125,6 +1126,41 @@ void Executor::prepareAllNodes() } } +void Executor::syncFileDependencies() +{ + Set<FileDependency *> &globalFileDepList = m_project->buildData->fileDependencies; + for (auto it = globalFileDepList.begin(); it != globalFileDepList.end(); ) { + FileDependency * const dep = *it; + if (FileInfo(dep->filePath()).exists()) { + ++it; + continue; + } + qCDebug(lcBuildGraph()) << "file dependency" << dep->filePath() << "no longer exists; " + "removing from lookup table"; + m_project->buildData->removeFromLookupTable(dep); + bool isReferencedByArtifact = false; + for (const ResolvedProductConstPtr &product : m_allProducts) { + if (!product->buildData) + continue; + const auto artifactList = filterByType<Artifact>(product->buildData->nodes); + isReferencedByArtifact = std::any_of(artifactList.begin(), artifactList.end(), + [dep](const Artifact *a) { return a->fileDependencies.contains(dep); }); + // TODO: Would it be safe to mark the artifact as "not up to date" here and clear + // its list of file dependencies, rather than doing the check again in + // isUpToDate()? + if (isReferencedByArtifact) + break; + } + if (!isReferencedByArtifact) { + qCDebug(lcBuildGraph()) << "dependency is not referenced by any artifact, deleting"; + it = globalFileDepList.erase(it); + delete dep; + } else { + ++it; + } + } +} + void Executor::prepareArtifact(Artifact *artifact) { artifact->inputsScanned = false; @@ -1139,6 +1175,9 @@ void Executor::prepareArtifact(Artifact *artifact) } // Timestamps of file dependencies must be invalid for every build. + // TODO: These should be a subset of ProjectBuildData::fileDependencies, so clear the + // timestamps in syncFileDepencencies() instead. + // TODO: Verify this assumption in the sanity checks. for (FileDependency * const fileDependency : qAsConst(artifact->fileDependencies)) fileDependency->clearTimestamp(); } @@ -1189,7 +1228,7 @@ void Executor::prepareReachableNodes_impl(BuildGraphNode *node) void Executor::prepareProducts() { - ProductPrioritySetter prioritySetter(m_project.get()); + ProductPrioritySetter prioritySetter(m_allProducts); prioritySetter.apply(); for (const ResolvedProductPtr &product : qAsConst(m_productsToBuild)) { EnvironmentScriptRunner(product.get(), m_evalContext.get(), m_project->environment) diff --git a/src/lib/corelib/buildgraph/executor.h b/src/lib/corelib/buildgraph/executor.h index cdc7e2f1a..64ea62cb8 100644 --- a/src/lib/corelib/buildgraph/executor.h +++ b/src/lib/corelib/buildgraph/executor.h @@ -111,6 +111,7 @@ private: void doBuild(); void prepareAllNodes(); + void syncFileDependencies(); void prepareArtifact(Artifact *artifact); void setupForBuildingSelectedFiles(const BuildGraphNode *node); void prepareReachableNodes(); @@ -162,6 +163,7 @@ private: ExecutorState m_state; TopLevelProjectPtr m_project; QList<ResolvedProductPtr> m_productsToBuild; + QList<ResolvedProductPtr> m_allProducts; NodeSet m_roots; Leaves m_leaves; QList<Artifact *> m_changedSourceArtifacts; diff --git a/src/lib/corelib/language/itemreaderastvisitor.cpp b/src/lib/corelib/language/itemreaderastvisitor.cpp index d6b89a2d5..5b042ffb4 100644 --- a/src/lib/corelib/language/itemreaderastvisitor.cpp +++ b/src/lib/corelib/language/itemreaderastvisitor.cpp @@ -144,7 +144,11 @@ bool ItemReaderASTVisitor::visit(AST::UiObjectDefinition *ast) Item *mdi = m_visitorState.mostDerivingItem(); m_visitorState.setMostDerivingItem(nullptr); qSwap(m_item, item); + const ItemType oldInstanceItemType = m_instanceItemType; + if (itemType == ItemType::Parameters || itemType == ItemType::Depends) + m_instanceItemType = ItemType::ModuleParameters; ast->initializer->accept(this); + m_instanceItemType = oldInstanceItemType; qSwap(m_item, item); m_visitorState.setMostDerivingItem(mdi); } @@ -299,7 +303,7 @@ Item *ItemReaderASTVisitor::targetItemForBinding(const QStringList &bindingName, for (int i = 0; i < c; ++i) { ValuePtr v = targetItem->ownProperty(bindingName.at(i)); if (!v) { - const ItemType itemType = i < c - 1 ? ItemType::ModulePrefix : ItemType::ModuleInstance; + const ItemType itemType = i < c - 1 ? ItemType::ModulePrefix : m_instanceItemType; Item *newItem = Item::create(m_itemPool, itemType); newItem->setLocation(value->location()); v = ItemValue::create(newItem); diff --git a/src/lib/corelib/language/itemreaderastvisitor.h b/src/lib/corelib/language/itemreaderastvisitor.h index 5db03b411..6bd39ceb2 100644 --- a/src/lib/corelib/language/itemreaderastvisitor.h +++ b/src/lib/corelib/language/itemreaderastvisitor.h @@ -88,6 +88,7 @@ private: Logger &m_logger; QHash<QStringList, QString> m_typeNameToFile; Item *m_item = nullptr; + ItemType m_instanceItemType = ItemType::ModuleInstance; }; } // namespace Internal diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index 35d0636b6..0f57de284 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -1571,10 +1571,9 @@ static void mergeParameters(QVariantMap &dst, const QVariantMap &src) } } -static void adjustParametersItemTypesAndScopes(Item *item, Item *scope) +static void adjustParametersScopes(Item *item, Item *scope) { - if (item->type() == ItemType::ModuleInstance) { - item->setType(ItemType::ModuleParameters); + if (item->type() == ItemType::ModuleParameters) { item->setScope(scope); return; } @@ -1582,7 +1581,7 @@ static void adjustParametersItemTypesAndScopes(Item *item, Item *scope) for (auto value : item->properties()) { if (value->type() != Value::ItemValueType) continue; - adjustParametersItemTypesAndScopes(std::static_pointer_cast<ItemValue>(value)->item(), scope); + adjustParametersScopes(std::static_pointer_cast<ItemValue>(value)->item(), scope); } } @@ -1624,7 +1623,7 @@ void ModuleLoader::mergeExportItems(const ProductContext &productContext) filesWithExportItem += exportItem->file(); for (Item * const child : exportItem->children()) { if (child->type() == ItemType::Parameters) { - adjustParametersItemTypesAndScopes(child, child); + adjustParametersScopes(child, child); mergeParameters(pmi.defaultParameters, m_evaluator->scriptValue(child).toVariant().toMap()); } else { @@ -2027,7 +2026,7 @@ void ModuleLoader::resolveDependencies(DependsContext *dependsContext, Item *ite for (Item * const dependsItem : dependsItemPerLoadedModule) { if (dependsItem == lastDependsItem) continue; - adjustParametersItemTypesAndScopes(dependsItem, dependsItem); + adjustParametersScopes(dependsItem, dependsItem); forwardParameterDeclarations(dependsItem, loadedModules); lastDependsItem = dependsItem; } @@ -2290,7 +2289,8 @@ static QVariantMap safeToVariant(const QScriptValue &v) QVariantMap ModuleLoader::extractParameters(Item *dependsItem) const { QVariantMap result; - const Item::PropertyMap &itemProperties = filterItemProperties(dependsItem->properties()); + const Item::PropertyMap &itemProperties = filterItemProperties( + rootPrototype(dependsItem)->properties()); if (itemProperties.empty()) return result; |