aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/android/androidmanager.cpp5
-rw-r--r--src/plugins/qbsprojectmanager/qbsnodes.cpp63
-rw-r--r--src/plugins/qbsprojectmanager/qbsnodes.h3
-rw-r--r--src/plugins/qbsprojectmanager/qbssession.cpp2
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",