diff options
-rw-r--r-- | src/plugins/android/androidmanager.cpp | 5 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsnodes.cpp | 63 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsnodes.h | 3 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbssession.cpp | 2 |
4 files changed, 69 insertions, 4 deletions
diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index fd681a5db8..3a5124a624 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -372,6 +372,11 @@ static QString preferredAbi(const QStringList &appAbis, const Target *target) QString AndroidManager::apkDevicePreferredAbi(const Target *target) { auto libsPath = dirPath(target).pathAppended("libs"); + if (!libsPath.exists()) { + if (const ProjectNode *node = currentProjectNode(target)) + return preferredAbi(node->data(Android::Constants::ANDROID_ABIS).toStringList(), + target); + } QStringList apkAbis; for (const auto &abi : QDir{libsPath.toString()}.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) if (!QDir{libsPath.pathAppended(abi).toString()}.entryList(QStringList("*.so"), QDir::Files | QDir::NoDotAndDotDot).isEmpty()) 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 {}; } diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h index f5131e0f73..0f188ea6dc 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.h +++ b/src/plugins/qbsprojectmanager/qbsnodes.h @@ -65,6 +65,9 @@ public: static QString getBuildKey(const QJsonObject &product); + bool isAggregated() const; + const QList<const QbsProductNode*> aggregatedProducts() const; + const QJsonObject productData() const { return m_productData; } QJsonObject mainGroup() const; QVariant data(Utils::Id role) const override; diff --git a/src/plugins/qbsprojectmanager/qbssession.cpp b/src/plugins/qbsprojectmanager/qbssession.cpp index 7485aa3b90..621572f265 100644 --- a/src/plugins/qbsprojectmanager/qbssession.cpp +++ b/src/plugins/qbsprojectmanager/qbssession.cpp @@ -376,6 +376,8 @@ RunEnvironmentResult QbsSession::getRunEnvironment( void QbsSession::insertRequestedModuleProperties(QJsonObject &request) { request.insert("module-properties", QJsonArray::fromStringList({ + "qbs.architecture", + "qbs.architectures", "cpp.commonCompilerFlags", "cpp.compilerVersionMajor", "cpp.compilerVersionMinor", |