aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/language/moduleloader.h
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-05-07 12:24:02 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2018-05-16 07:28:50 +0000
commita0d3454e7b8d816f5bb5c76ed2e9d50ff6550485 (patch)
tree924065974118f0591475ec6271cbb7485ca860df /src/lib/corelib/language/moduleloader.h
parentbe8432fac97e701d3c7b7b45171f773ab33b9aae (diff)
Make Depends.productTypes in Export items work
Change-Id: I441c0454ee7a4b928c132052c49db1cddc34d3c9 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/lib/corelib/language/moduleloader.h')
-rw-r--r--src/lib/corelib/language/moduleloader.h34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/lib/corelib/language/moduleloader.h b/src/lib/corelib/language/moduleloader.h
index dc33171f1..7e551b5c2 100644
--- a/src/lib/corelib/language/moduleloader.h
+++ b/src/lib/corelib/language/moduleloader.h
@@ -151,6 +151,24 @@ private:
typedef std::vector<ModuleLoaderResult::ProductInfo::Dependency> ProductDependencies;
+ // This is the data we need to store at the point where a dependency is deferred
+ // in order to properly resolve the dependency in pass 2.
+ struct DeferredDependsContext {
+ DeferredDependsContext(Item *exportingProduct, Item *parent)
+ : exportingProductItem(exportingProduct), parentItem(parent) {}
+ Item *exportingProductItem = nullptr;
+ Item *parentItem = nullptr;
+ bool operator==(const DeferredDependsContext &other) const
+ {
+ return exportingProductItem == other.exportingProductItem
+ && parentItem == other.parentItem;
+ }
+ bool operator<(const DeferredDependsContext &other) const
+ {
+ return parentItem < other.parentItem;
+ }
+ };
+
class ProductContext : public ContextBase
{
public:
@@ -162,7 +180,10 @@ private:
QVariantMap moduleProperties;
std::map<QString, ProductDependencies> productModuleDependencies;
std::unordered_map<const Item *, std::vector<ErrorInfo>> unknownProfilePropertyErrors;
- QList<Item *> deferredDependsItems;
+
+ // The key corresponds to DeferredDependsContext.exportingProductItem, which is the
+ // only value from that data structure that we still need here.
+ std::unordered_map<Item *, std::vector<Item *>> deferredDependsItems;
QString uniqueName() const;
};
@@ -229,13 +250,15 @@ private:
static MultiplexTable combine(const MultiplexTable &table, const MultiplexRow &values);
MultiplexInfo extractMultiplexInfo(Item *productItem, Item *qbsModuleItem);
QList<Item *> multiplexProductItem(ProductContext *dummyContext, Item *productItem);
- void normalizeDependencies(ProductContext &product);
+ void normalizeDependencies(ProductContext *product,
+ const DeferredDependsContext &dependsContext);
void adjustDependenciesForMultiplexing(const TopLevelProjectContext &tlp);
void adjustDependenciesForMultiplexing(const ProductContext &product);
void adjustDependenciesForMultiplexing(const ProductContext &product, Item *dependsItem);
void prepareProduct(ProjectContext *projectContext, Item *productItem);
- void setupProductDependencies(ProductContext *productContext);
+ void setupProductDependencies(ProductContext *productContext,
+ const Set<DeferredDependsContext> &deferredDependsContext);
void handleProduct(ProductContext *productContext);
void checkDependencyParameterDeclarations(const ProductContext *productContext) const;
void handleModuleSetupError(ProductContext *productContext, const Item::Module &module,
@@ -390,7 +413,10 @@ private:
QVariantMap m_localProfiles;
std::multimap<QString, const ProductContext *> m_productsByName;
std::multimap<FileTag, const ProductContext *> m_productsByType;
- Set<ProductContext *> m_productsWithDeferredDependsItems;
+
+ std::unordered_map<ProductContext *, Set<DeferredDependsContext>> m_productsWithDeferredDependsItems;
+ Set<Item *> m_exportsWithDeferredDependsItems;
+
SetupProjectParameters m_parameters;
std::unique_ptr<Settings> m_settings;
Version m_qbsVersion;