aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--changelogs/changes-1.12.1.md1
-rw-r--r--src/lib/corelib/buildgraph/buildgraph.cpp22
-rw-r--r--src/lib/corelib/language/language.cpp8
-rw-r--r--src/lib/corelib/language/language.h2
-rw-r--r--src/lib/corelib/language/projectresolver.cpp13
-rw-r--r--src/lib/corelib/tools/persistence.cpp2
6 files changed, 29 insertions, 19 deletions
diff --git a/changelogs/changes-1.12.1.md b/changelogs/changes-1.12.1.md
index ff14d8169..e4edeb136 100644
--- a/changelogs/changes-1.12.1.md
+++ b/changelogs/changes-1.12.1.md
@@ -4,3 +4,4 @@
* Fixed rpaths not ending up on the command line under certain circumstances (QBS-1372).
* Fixed possible crash when scanning qrc files (QBS-1375).
* Fixed spurious re-building of .pc and .qbs module files.
+* Fixed possible crash on storing a build graph after re-resolving.
diff --git a/src/lib/corelib/buildgraph/buildgraph.cpp b/src/lib/corelib/buildgraph/buildgraph.cpp
index f12c27ab6..e9767b942 100644
--- a/src/lib/corelib/buildgraph/buildgraph.cpp
+++ b/src/lib/corelib/buildgraph/buildgraph.cpp
@@ -222,9 +222,25 @@ private:
QScriptValue result = engine->newArray();
quint32 idx = 0;
const bool exportCase = depType == DependencyType::Exported;
- const std::vector<ResolvedProductPtr> &productDeps = (exportCase
- ? product->exportedModule.productDependencies
- : product->dependencies);
+ std::vector<ResolvedProductPtr> productDeps;
+ if (exportCase) {
+ if (!product->exportedModule.productDependencies.empty()) {
+ const auto allProducts = product->topLevelProject()->allProducts();
+ const auto getProductForName = [&allProducts](const QString &name) {
+ const auto cmp = [name](const ResolvedProductConstPtr &p) {
+ return p->uniqueName() == name;
+ };
+ const auto it = std::find_if(allProducts.cbegin(), allProducts.cend(), cmp);
+ QBS_ASSERT(it != allProducts.cend(), return ResolvedProductPtr());
+ return *it;
+ };
+ std::transform(product->exportedModule.productDependencies.cbegin(),
+ product->exportedModule.productDependencies.cend(),
+ std::back_inserter(productDeps), getProductForName);
+ }
+ } else {
+ productDeps = product->dependencies;
+ }
for (const ResolvedProductPtr &dependency : qAsConst(productDeps)) {
QScriptValue obj = engine->newObject(engine->productPropertyScriptClass());
obj.setPrototype(setupProductScriptValue(static_cast<ScriptEngine *>(engine),
diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp
index 56c310272..5351ba80c 100644
--- a/src/lib/corelib/language/language.cpp
+++ b/src/lib/corelib/language/language.cpp
@@ -979,11 +979,6 @@ bool operator==(const ExportedItem &i1, const ExportedItem &i2)
bool operator==(const ExportedModule &m1, const ExportedModule &m2)
{
- static const auto cmpProductsByName = [](
- const ResolvedProductConstPtr &p1,
- const ResolvedProductConstPtr &p2) {
- return p1->name == p2->name;
- };
static const auto depMapsEqual = [](const QMap<ResolvedProductConstPtr, QVariantMap> &m1,
const QMap<ResolvedProductConstPtr, QVariantMap> &m2) {
if (m1.size() != m2.size())
@@ -1003,8 +998,7 @@ bool operator==(const ExportedModule &m1, const ExportedModule &m2)
&& m1.m_properties == m2.m_properties
&& m1.importStatements == m2.importStatements
&& m1.productDependencies.size() == m2.productDependencies.size()
- && std::equal(m1.productDependencies.cbegin(), m1.productDependencies.cend(),
- m2.productDependencies.cbegin(), cmpProductsByName)
+ && m1.productDependencies == m2.productDependencies
&& depMapsEqual(m1.dependencyParameters, m2.dependencyParameters);
}
diff --git a/src/lib/corelib/language/language.h b/src/lib/corelib/language/language.h
index 05fcfcf46..571681241 100644
--- a/src/lib/corelib/language/language.h
+++ b/src/lib/corelib/language/language.h
@@ -540,7 +540,7 @@ public:
QVariantMap propertyValues;
QVariantMap modulePropertyValues;
std::vector<ExportedItemPtr> children;
- std::vector<ResolvedProductPtr> productDependencies;
+ std::vector<QString> productDependencies;
std::vector<ExportedModuleDependency> moduleDependencies;
std::vector<ExportedProperty> m_properties;
QMap<ResolvedProductConstPtr, QVariantMap> dependencyParameters;
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp
index 348858f2b..97015dae4 100644
--- a/src/lib/corelib/language/projectresolver.cpp
+++ b/src/lib/corelib/language/projectresolver.cpp
@@ -911,19 +911,18 @@ void ProjectResolver::collectExportedProductDependencies()
if (!contains(directDepNames, dep.product->name))
continue;
- if (!contains(exportingProduct->exportedModule.productDependencies, dep.product))
- exportingProduct->exportedModule.productDependencies.push_back(dep.product);
+ if (!contains(exportingProduct->exportedModule.productDependencies,
+ dep.product->uniqueName())) {
+ exportingProduct->exportedModule.productDependencies.push_back(
+ dep.product->uniqueName());
+ }
if (!dep.parameters.isEmpty()) {
exportingProduct->exportedModule.dependencyParameters.insert(dep.product,
dep.parameters);
}
}
auto &productDeps = exportingProduct->exportedModule.productDependencies;
- static const auto cmpFunc = [](const ResolvedProductConstPtr &p1,
- const ResolvedProductConstPtr &p2) {
- return p1->uniqueName() < p2->uniqueName();
- };
- std::sort(productDeps.begin(), productDeps.end(), cmpFunc);
+ std::sort(productDeps.begin(), productDeps.end());
}
}
diff --git a/src/lib/corelib/tools/persistence.cpp b/src/lib/corelib/tools/persistence.cpp
index e705cb2da..996c8415d 100644
--- a/src/lib/corelib/tools/persistence.cpp
+++ b/src/lib/corelib/tools/persistence.cpp
@@ -49,7 +49,7 @@
namespace qbs {
namespace Internal {
-static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-119";
+static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-120";
NoBuildGraphError::NoBuildGraphError(const QString &filePath)
: ErrorInfo(Tr::tr("Build graph not found for configuration '%1'. Expected location was '%2'.")