diff options
Diffstat (limited to 'src/plugins/qbsprojectmanager/qbsnodes.cpp')
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsnodes.cpp | 63 |
1 files changed, 59 insertions, 4 deletions
diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index 61b7b005de..68731e30a1 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp @@ -151,6 +151,33 @@ QString QbsProductNode::getBuildKey(const QJsonObject &product) + product.value("multiplex-configuration-id").toString(); } +bool QbsProductNode::isAggregated() const +{ + return m_productData.value("is-multiplexed").toBool() + && m_productData.value("multiplex-configuration-id").toString().isEmpty(); +} + +const QList<const QbsProductNode*> QbsProductNode::aggregatedProducts() const +{ + if (!isAggregated()) + return {}; + const ProjectNode *parentNode = managingProject(); + QTC_ASSERT(parentNode != nullptr && parentNode != this, return {}); + + QSet<QString> dependencies; + for (const auto &a : m_productData.value("dependencies").toArray()) + dependencies << a.toString(); + + QList<const QbsProductNode*> qbsProducts; + parentNode->forEachProjectNode([&qbsProducts, dependencies](const ProjectNode *node) { + if (const auto qbsChildNode = dynamic_cast<const QbsProductNode *>(node)) { + if (dependencies.contains(qbsChildNode->fullDisplayName())) + qbsProducts << qbsChildNode; + } + }); + return qbsProducts; +} + QVariant QbsProductNode::data(Id role) const { if (role == Android::Constants::AndroidDeploySettingsFile) { @@ -164,10 +191,16 @@ QVariant QbsProductNode::data(Id role) const if (role == Android::Constants::AndroidSoLibPath) { QStringList ret{m_productData.value("build-directory").toString()}; - forAllArtifacts(m_productData, ArtifactType::Generated, [&ret](const QJsonObject &artifact) { - if (artifact.value("file-tags").toArray().contains("dynamiclibrary")) - ret << QFileInfo(artifact.value("file-path").toString()).path(); - }); + if (!isAggregated()) { + forAllArtifacts(m_productData, ArtifactType::Generated, + [&ret](const QJsonObject &artifact) { + if (artifact.value("file-tags").toArray().contains("dynamiclibrary")) + ret << QFileInfo(artifact.value("file-path").toString()).path(); + }); + } else { + for (const auto &a : aggregatedProducts()) + ret += a->data(Android::Constants::AndroidSoLibPath).toStringList(); + } ret.removeDuplicates(); return ret; } @@ -188,6 +221,28 @@ QVariant QbsProductNode::data(Id role) const return m_productData.value("module-properties").toObject() .value("Qt.core.enableKeywords").toBool(); + if (role == Android::Constants::ANDROID_ABIS) { + // Try using qbs.architectures + QStringList qbsAbis; + QMap<QString, QString> archToAbi { + {"armv7a", ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A}, + {"arm64", ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A}, + {"x86", ProjectExplorer::Constants::ANDROID_ABI_X86}, + {"x86_64", ProjectExplorer::Constants::ANDROID_ABI_X86_64}}; + for (const auto &a : m_productData.value("module-properties").toObject() + .value(Constants::QBS_ARCHITECTURES).toArray()) { + if (archToAbi.contains(a.toString())) + qbsAbis << archToAbi[a.toString()]; + } + if (!qbsAbis.empty()) + return qbsAbis; + // Try using qbs.architecture + QString architecture = m_productData.value("module-properties").toObject() + .value(Constants::QBS_ARCHITECTURE).toString(); + if (archToAbi.contains(architecture)) + qbsAbis << archToAbi[architecture]; + return qbsAbis; + } return {}; } |