summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhjk <hjk@qt.io>2018-12-05 10:29:48 +0100
committerhjk <hjk@qt.io>2018-12-20 13:13:51 +0000
commit93257a56a0056dc83ab28238c99ea4a4e863423d (patch)
tree4d81dbc3a3047317b4286cc5414239cb5f90f5ac
parent41a88b0763ee4548463e4652ace2e97cb81eba6c (diff)
downloadqt-creator-93257a56a0056dc83ab28238c99ea4a4e863423d.tar.gz
QmakeAndroid: Replace remaining AndroidQtSupport
This uses the same approach as in the previous patches: Have some generic interface in the base classes (here ProjectNode::targetData() setTargetData()) and implement on the qmake project side. Implementation for Cmake/QBS is architecture-wise possible, but not used right now, and left for later. Change-Id: I3bbf66170020cf9027a894cd66db15ec7ffbf499 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r--src/plugins/android/android.pro1
-rw-r--r--src/plugins/android/android.qbs1
-rw-r--r--src/plugins/android/androidbuildapkstep.cpp15
-rw-r--r--src/plugins/android/androidbuildapkwidget.h1
-rw-r--r--src/plugins/android/androidconstants.h6
-rw-r--r--src/plugins/android/androiddebugsupport.cpp49
-rw-r--r--src/plugins/android/androiddeployconfiguration.cpp1
-rw-r--r--src/plugins/android/androiddeployqtstep.cpp11
-rw-r--r--src/plugins/android/androidextralibrarylistmodel.cpp20
-rw-r--r--src/plugins/android/androidmanager.cpp35
-rw-r--r--src/plugins/android/androidmanager.h3
-rw-r--r--src/plugins/android/androidmanifesteditorwidget.cpp1
-rw-r--r--src/plugins/android/androidqtsupport.h74
-rw-r--r--src/plugins/android/createandroidmanifestwizard.cpp25
-rw-r--r--src/plugins/projectexplorer/project.cpp2
-rw-r--r--src/plugins/projectexplorer/project.h2
-rw-r--r--src/plugins/projectexplorer/projectnodes.cpp21
-rw-r--r--src/plugins/projectexplorer/projectnodes.h9
-rw-r--r--src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp156
-rw-r--r--src/plugins/qmakeandroidsupport/qmakeandroidsupport.h50
-rw-r--r--src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro2
-rw-r--r--src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs2
-rw-r--r--src/plugins/qmakeandroidsupport/qmakeandroidsupportplugin.cpp2
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodes.cpp70
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodes.h4
25 files changed, 203 insertions, 360 deletions
diff --git a/src/plugins/android/android.pro b/src/plugins/android/android.pro
index d6ee2f56fc..7b4d76014c 100644
--- a/src/plugins/android/android.pro
+++ b/src/plugins/android/android.pro
@@ -6,7 +6,6 @@ else:ANDROID_EXPERIMENTAL_STR="false"
QT += xml network
HEADERS += \
- androidqtsupport.h \
androidconstants.h \
androidconfigurations.h \
androidmanager.h \
diff --git a/src/plugins/android/android.qbs b/src/plugins/android/android.qbs
index cc5e62d97b..41b4d9da52 100644
--- a/src/plugins/android/android.qbs
+++ b/src/plugins/android/android.qbs
@@ -78,7 +78,6 @@ Project {
"androidpotentialkit.h",
"androidqmltoolingsupport.cpp",
"androidqmltoolingsupport.h",
- "androidqtsupport.h",
"androidqtversion.cpp",
"androidqtversion.h",
"androidqtversionfactory.cpp",
diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp
index 8110e1f4b9..c31241a54f 100644
--- a/src/plugins/android/androidbuildapkstep.cpp
+++ b/src/plugins/android/androidbuildapkstep.cpp
@@ -31,7 +31,6 @@
#include "androidconstants.h"
#include "androidmanager.h"
#include "androidsdkmanager.h"
-#include "androidqtsupport.h"
#include "certificatesmodel.h"
#include "javaparser.h"
@@ -43,6 +42,8 @@
#include <projectexplorer/processparameters.h>
#include <projectexplorer/project.h>
#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/projectnodes.h>
+#include <projectexplorer/runconfiguration.h>
#include <projectexplorer/target.h>
#include <qtsupport/qtkitinformation.h>
@@ -182,8 +183,10 @@ bool AndroidBuildApkStep::init(QList<const BuildStep *> &earlierSteps)
parser->setProjectFileList(Utils::transform(target()->project()->files(ProjectExplorer::Project::AllFiles),
&Utils::FileName::toString));
- AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(target());
- QFileInfo sourceDirInfo(qtSupport->targetData(Constants::AndroidPackageSourceDir, target()).toString());
+ RunConfiguration *rc = target()->activeRunConfiguration();
+ const ProjectNode *node = rc ? target()->project()->findNodeForBuildKey(rc->buildKey()) : nullptr;
+
+ QFileInfo sourceDirInfo(node ? node->targetData(Constants::AndroidPackageSourceDir, target()).toString() : QString());
parser->setSourceDirectory(Utils::FileName::fromString(sourceDirInfo.canonicalFilePath()));
parser->setBuildDirectory(Utils::FileName::fromString(bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString()));
setOutputParser(parser);
@@ -204,8 +207,10 @@ bool AndroidBuildApkStep::init(QList<const BuildStep *> &earlierSteps)
QString outputDir = bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString();
- QString inputFile = AndroidManager::androidQtSupport(target())
- ->targetData(Constants::AndroidDeploySettingsFile, target()).toString();
+ QString inputFile;
+ if (node)
+ inputFile = node->targetData(Constants::AndroidDeploySettingsFile, target()).toString();
+
if (inputFile.isEmpty()) {
m_skipBuilding = true;
return true;
diff --git a/src/plugins/android/androidbuildapkwidget.h b/src/plugins/android/androidbuildapkwidget.h
index db935ecc35..03dcf21ec2 100644
--- a/src/plugins/android/androidbuildapkwidget.h
+++ b/src/plugins/android/androidbuildapkwidget.h
@@ -30,7 +30,6 @@
#include "androidbuildapkstep.h"
#include "androidextralibrarylistmodel.h"
-#include "androidqtsupport.h"
#include <projectexplorer/buildstep.h>
diff --git a/src/plugins/android/androidconstants.h b/src/plugins/android/androidconstants.h
index 2ff36be77e..38d6291ae9 100644
--- a/src/plugins/android/androidconstants.h
+++ b/src/plugins/android/androidconstants.h
@@ -74,5 +74,11 @@ const char ANDROID_EXTRA_LIBS[] = "AndroidExtraLibs";
const char ANDROID_PACKAGENAME[] = "Android.PackageName";
const char ANDROID_PACKAGE_INSTALLATION_STEP_ID[] = "Qt4ProjectManager.AndroidPackageInstallationStep";
+const char AndroidPackageSourceDir[] = "AndroidPackageSourceDir"; // QString
+const char AndroidDeploySettingsFile[] = "AndroidDeploySettingsFile"; // QString
+const char AndroidExtraLibs[] = "AndroidExtraLibs"; // QStringList
+const char AndroidArch[] = "AndroidArch"; // QString
+const char AndroidSoLibPath[] = "AndroidSoLibPath"; // QStringList
+
} // namespace Constants;
} // namespace Android
diff --git a/src/plugins/android/androiddebugsupport.cpp b/src/plugins/android/androiddebugsupport.cpp
index 03f322ba78..7f1b8651dd 100644
--- a/src/plugins/android/androiddebugsupport.cpp
+++ b/src/plugins/android/androiddebugsupport.cpp
@@ -25,10 +25,10 @@
#include "androiddebugsupport.h"
+#include "androidconstants.h"
#include "androidglobal.h"
#include "androidrunner.h"
#include "androidmanager.h"
-#include "androidqtsupport.h"
#include <debugger/debuggerkitinformation.h>
#include <debugger/debuggerrunconfigurationaspect.h>
@@ -36,6 +36,7 @@
#include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/project.h>
+#include <projectexplorer/projectnodes.h>
#include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h>
@@ -44,8 +45,9 @@
#include <utils/hostosinfo.h>
#include <QDirIterator>
-#include <QLoggingCategory>
#include <QHostAddress>
+#include <QJsonDocument>
+#include <QLoggingCategory>
namespace {
Q_LOGGING_CATEGORY(androidDebugSupportLog, "qtc.android.run.androiddebugsupport", QtWarningMsg)
@@ -90,6 +92,44 @@ static QStringList uniquePaths(const QStringList &files)
return paths.toList();
}
+static QStringList getSoLibSearchPath(const RunConfiguration *rc)
+{
+ Target *target = rc->target();
+ const ProjectNode *node = target->project()->findNodeForBuildKey(rc->buildKey());
+ if (!node)
+ return {};
+
+ QStringList res;
+ node->forEachProjectNode([&res, target](const ProjectNode *node) {
+ res.append(node->targetData(Constants::AndroidSoLibPath, target).toStringList());
+ });
+
+ const QString jsonFile = node->targetData(Android::Constants::AndroidDeploySettingsFile, target).toString();
+ QFile deploymentSettings(jsonFile);
+ if (deploymentSettings.open(QIODevice::ReadOnly)) {
+ QJsonParseError error;
+ QJsonDocument doc = QJsonDocument::fromJson(deploymentSettings.readAll(), &error);
+ if (error.error == QJsonParseError::NoError) {
+ auto rootObj = doc.object();
+ auto it = rootObj.find("stdcpp-path");
+ if (it != rootObj.constEnd())
+ res.append(QFileInfo(it.value().toString()).absolutePath());
+ }
+ }
+
+ res.removeDuplicates();
+ return res;
+}
+
+static QStringList getExtraLibs(const RunConfiguration *rc)
+{
+ const ProjectNode *node = rc->target()->project()->findNodeForBuildKey(rc->buildKey());
+ if (!node)
+ return {};
+
+ return node->targetData(Android::Constants::AndroidExtraLibs, rc->target()).toStringList();
+}
+
static QString toNdkArch(const QString &arch)
{
if (arch == QLatin1String("armeabi-v7a") || arch == QLatin1String("armeabi"))
@@ -131,9 +171,8 @@ void AndroidDebugSupport::start()
if (isCppDebugging()) {
qCDebug(androidDebugSupportLog) << "C++ debugging enabled";
- AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(target);
- QStringList solibSearchPath = qtSupport->soLibSearchPath(target);
- QStringList extraLibs = qtSupport->targetData(Android::Constants::AndroidExtraLibs, target).toStringList();
+ QStringList solibSearchPath = getSoLibSearchPath(runConfig);
+ QStringList extraLibs = getExtraLibs(runConfig);
solibSearchPath.append(qtSoPaths(qtVersion));
solibSearchPath.append(uniquePaths(extraLibs));
setSolibSearchPath(solibSearchPath);
diff --git a/src/plugins/android/androiddeployconfiguration.cpp b/src/plugins/android/androiddeployconfiguration.cpp
index bb0169db0e..7c8b9a3671 100644
--- a/src/plugins/android/androiddeployconfiguration.cpp
+++ b/src/plugins/android/androiddeployconfiguration.cpp
@@ -28,7 +28,6 @@
#include "androidconstants.h"
#include "androiddeployqtstep.h"
#include "androidmanager.h"
-#include "androidqtsupport.h"
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/project.h>
diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp
index dea4742e71..63df1abdb3 100644
--- a/src/plugins/android/androiddeployqtstep.cpp
+++ b/src/plugins/android/androiddeployqtstep.cpp
@@ -26,7 +26,6 @@
#include "androiddeployqtstep.h"
#include "androiddeployqtwidget.h"
-#include "androidqtsupport.h"
#include "certificatesmodel.h"
#include "javaparser.h"
@@ -43,6 +42,7 @@
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/project.h>
+#include <projectexplorer/projectnodes.h>
#include <projectexplorer/runconfiguration.h>
#include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h>
@@ -170,8 +170,7 @@ bool AndroidDeployQtStep::init(QList<const BuildStep *> &earlierSteps)
if (m_uninstallPreviousPackageRun)
m_manifestName = AndroidManager::manifestPath(target());
- AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(target());
- m_useAndroiddeployqt = !deployQtLive && qtSupport &&
+ m_useAndroiddeployqt = !deployQtLive &&
version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0);
if (m_useAndroiddeployqt) {
@@ -192,11 +191,15 @@ bool AndroidDeployQtStep::init(QList<const BuildStep *> &earlierSteps)
Utils::QtcProcess::addArg(&m_androiddeployqtArgs, m_workingDirectory);
Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--no-build"));
Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--input"));
- const QString jsonFile = qtSupport->targetData(Constants::AndroidDeploySettingsFile, target()).toString();
+
+ QString jsonFile;
+ if (const ProjectNode *node = target()->project()->findNodeForBuildKey(rc->buildKey()))
+ jsonFile = node->targetData(Constants::AndroidDeploySettingsFile, target()).toString();
if (jsonFile.isEmpty()) {
emit addOutput(tr("Cannot find the androiddeploy Json file."), OutputFormat::Stderr);
return false;
}
+
Utils::QtcProcess::addArg(&m_androiddeployqtArgs, jsonFile);
if (androidBuildApkStep && androidBuildApkStep->useMinistro()) {
qCDebug(deployStepLog) << "Using ministro";
diff --git a/src/plugins/android/androidextralibrarylistmodel.cpp b/src/plugins/android/androidextralibrarylistmodel.cpp
index a0dc80e46a..bea58d0604 100644
--- a/src/plugins/android/androidextralibrarylistmodel.cpp
+++ b/src/plugins/android/androidextralibrarylistmodel.cpp
@@ -26,7 +26,7 @@
#include "androidextralibrarylistmodel.h"
-#include <android/androidqtsupport.h>
+#include <android/androidconstants.h>
#include <android/androidmanager.h>
#include <projectexplorer/project.h>
@@ -91,9 +91,6 @@ void AndroidExtraLibraryListModel::updateModel()
const ProjectNode *node = m_target->project()->findNodeForBuildKey(rc->buildKey());
QTC_ASSERT(node, return);
- AndroidQtSupport *qtSupport = Android::AndroidManager::androidQtSupport(m_target);
- QTC_ASSERT(qtSupport, return);
-
if (node->parseInProgress()) {
emit enabledChanged(false);
return;
@@ -102,7 +99,7 @@ void AndroidExtraLibraryListModel::updateModel()
bool enabled;
beginResetModel();
if (node->validParse()) {
- m_entries = qtSupport->targetData(Constants::AndroidExtraLibs, m_target).toStringList();
+ m_entries = node->targetData(Constants::AndroidExtraLibs, m_target).toStringList();
enabled = true;
} else {
// parsing error
@@ -116,9 +113,6 @@ void AndroidExtraLibraryListModel::updateModel()
void AndroidExtraLibraryListModel::addEntries(const QStringList &list)
{
- AndroidQtSupport *qtSupport = Android::AndroidManager::androidQtSupport(m_target);
- QTC_ASSERT(qtSupport, return);
-
RunConfiguration *rc = m_target->activeRunConfiguration();
QTC_ASSERT(rc, return);
@@ -131,7 +125,7 @@ void AndroidExtraLibraryListModel::addEntries(const QStringList &list)
for (const QString &path : list)
m_entries += "$$PWD/" + dir.relativeFilePath(path);
- qtSupport->setTargetData(Constants::AndroidExtraLibs, m_entries, m_target);
+ node->setTargetData(Constants::AndroidExtraLibs, m_entries, m_target);
endInsertRows();
}
@@ -161,9 +155,11 @@ void AndroidExtraLibraryListModel::removeEntries(QModelIndexList list)
endRemoveRows();
}
- AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_target);
- QTC_ASSERT(qtSupport, return);
- qtSupport->setTargetData(Constants::AndroidExtraLibs, m_entries, m_target);
+ RunConfiguration *rc = m_target->activeRunConfiguration();
+ QTC_ASSERT(rc, return);
+ const ProjectNode *node = m_target->project()->findNodeForBuildKey(rc->buildKey());
+ QTC_ASSERT(node, return);
+ node->setTargetData(Constants::AndroidExtraLibs, m_entries, m_target);
}
} // Android
diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp
index 59ef8d110b..2f2f436819 100644
--- a/src/plugins/android/androidmanager.cpp
+++ b/src/plugins/android/androidmanager.cpp
@@ -31,7 +31,6 @@
#include "androidglobal.h"
#include "androidtoolchain.h"
#include "androiddeployqtstep.h"
-#include "androidqtsupport.h"
#include "androidqtversion.h"
#include "androidavdmanager.h"
#include "androidsdkmanager.h"
@@ -42,6 +41,7 @@
#include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/project.h>
+#include <projectexplorer/projectnodes.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/session.h>
#include <projectexplorer/target.h>
@@ -89,6 +89,7 @@ namespace {
} // anonymous namespace
+using namespace ProjectExplorer;
using namespace Utils;
namespace Android {
@@ -111,16 +112,11 @@ static bool openXmlFile(QDomDocument &doc, const Utils::FileName &fileName);
static bool openManifest(ProjectExplorer::Target *target, QDomDocument &doc);
static int parseMinSdk(const QDomElement &manifestElem);
-static QList<AndroidQtSupport *> g_androidQtSupportProviders;
-
-AndroidQtSupport::AndroidQtSupport()
+static const ProjectNode *currentProjectNode(Target *target)
{
- g_androidQtSupportProviders.append(this);
-}
-
-AndroidQtSupport::~AndroidQtSupport()
-{
- g_androidQtSupportProviders.removeOne(this);
+ if (RunConfiguration *rc = target->activeRunConfiguration())
+ return target->project()->findNodeForBuildKey(rc->buildKey());
+ return nullptr;
}
QString AndroidManager::packageName(ProjectExplorer::Target *target)
@@ -306,9 +302,9 @@ Utils::FileName AndroidManager::apkPath(const ProjectExplorer::Target *target)
Utils::FileName AndroidManager::manifestSourcePath(ProjectExplorer::Target *target)
{
- if (AndroidQtSupport *androidQtSupport = AndroidManager::androidQtSupport(target)) {
+ if (const ProjectNode *node = currentProjectNode(target)) {
const QString packageSource
- = androidQtSupport->targetData(Android::Constants::AndroidPackageSourceDir, target).toString();
+ = node->targetData(Android::Constants::AndroidPackageSourceDir, target).toString();
if (!packageSource.isEmpty()) {
const FileName manifest = FileName::fromUserInput(packageSource + "/AndroidManifest.xml");
if (manifest.exists())
@@ -559,15 +555,6 @@ bool AndroidManager::checkCertificateExists(const QString &keystorePath,
return response.result == Utils::SynchronousProcessResponse::Finished && response.exitCode == 0;
}
-AndroidQtSupport *AndroidManager::androidQtSupport(ProjectExplorer::Target *target)
-{
- for (AndroidQtSupport *provider : g_androidQtSupportProviders) {
- if (provider->canHandle(target))
- return provider;
- }
- return nullptr;
-}
-
using GradleProperties = QMap<QByteArray, QByteArray>;
static GradleProperties readGradleProperties(const QString &path)
@@ -636,11 +623,11 @@ bool AndroidManager::updateGradleProperties(ProjectExplorer::Target *target)
if (!version)
return false;
- AndroidQtSupport *qtSupport = androidQtSupport(target);
- if (!qtSupport)
+ const ProjectNode *node = currentProjectNode(target);
+ if (!node)
return false;
- QFileInfo sourceDirInfo(qtSupport->targetData(Constants::AndroidPackageSourceDir, target).toString());
+ QFileInfo sourceDirInfo(node->targetData(Constants::AndroidPackageSourceDir, target).toString());
FileName packageSourceDir = FileName::fromString(sourceDirInfo.canonicalFilePath());
if (!packageSourceDir.appendPath("gradlew").exists())
return false;
diff --git a/src/plugins/android/androidmanager.h b/src/plugins/android/androidmanager.h
index 6ddd63f7fd..e43d48fde3 100644
--- a/src/plugins/android/androidmanager.h
+++ b/src/plugins/android/androidmanager.h
@@ -44,8 +44,6 @@ namespace Utils { class FileName; }
namespace Android {
-class AndroidQtSupport;
-
class SdkToolResult {
public:
SdkToolResult() = default;
@@ -110,7 +108,6 @@ public:
static bool checkCertificatePassword(const QString &keystorePath, const QString &keystorePasswd, const QString &alias, const QString &certificatePasswd);
static bool checkCertificateExists(const QString &keystorePath, const QString &keystorePasswd,
const QString &alias);
- static AndroidQtSupport *androidQtSupport(ProjectExplorer::Target *target);
static bool updateGradleProperties(ProjectExplorer::Target *target);
static int findApiLevel(const Utils::FileName &platformPath);
diff --git a/src/plugins/android/androidmanifesteditorwidget.cpp b/src/plugins/android/androidmanifesteditorwidget.cpp
index 99fe319a8d..bcaa0490e3 100644
--- a/src/plugins/android/androidmanifesteditorwidget.cpp
+++ b/src/plugins/android/androidmanifesteditorwidget.cpp
@@ -29,7 +29,6 @@
#include "androidconstants.h"
#include "androidmanifestdocument.h"
#include "androidmanager.h"
-#include "androidqtsupport.h"
#include <coreplugin/icore.h>
#include <coreplugin/infobar.h>
diff --git a/src/plugins/android/androidqtsupport.h b/src/plugins/android/androidqtsupport.h
deleted file mode 100644
index bfd551c6c3..0000000000
--- a/src/plugins/android/androidqtsupport.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 BogDan Vatra <bog_dan_ro@yahoo.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qt Creator.
-**
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-****************************************************************************/
-
-#pragma once
-
-#include "android_global.h"
-
-#include <coreplugin/id.h>
-
-#include <QObject>
-
-namespace ProjectExplorer { class Target; }
-
-namespace Utils { class FileName; }
-
-namespace Android {
-namespace Constants {
-
-const char AndroidPackageSourceDir[] = "AndroidPackageSourceDir"; // QString
-const char AndroidDeploySettingsFile[] = "AndroidDeploySettingsFile"; // QString
-const char AndroidExtraLibs[] = "AndroidExtraLibs"; // QStringList
-const char AndroidArch[] = "AndroidArch"; // QString
-
-} // namespace Constants
-
-class ANDROID_EXPORT AndroidQtSupport : public QObject
-{
- Q_OBJECT
-
-protected:
- AndroidQtSupport();
- ~AndroidQtSupport() override;
-
-public:
- enum BuildType {
- DebugBuild,
- ReleaseBuildUnsigned,
- ReleaseBuildSigned
- };
-
- virtual bool canHandle(const ProjectExplorer::Target *target) const = 0;
- virtual QStringList soLibSearchPath(const ProjectExplorer::Target *target) const = 0;
-
- virtual QVariant targetData(Core::Id role, const ProjectExplorer::Target *target) const = 0;
- virtual bool setTargetData(Core::Id role, const QVariant &value,
- const ProjectExplorer::Target *target) const = 0;
-
- virtual void addFiles(const ProjectExplorer::Target *target, const QString &buildKey,
- const QStringList &addedFiles) const = 0;
-};
-
-} // namespace Android
diff --git a/src/plugins/android/createandroidmanifestwizard.cpp b/src/plugins/android/createandroidmanifestwizard.cpp
index 01b167342b..1bb52a9e54 100644
--- a/src/plugins/android/createandroidmanifestwizard.cpp
+++ b/src/plugins/android/createandroidmanifestwizard.cpp
@@ -26,11 +26,13 @@
#include "createandroidmanifestwizard.h"
#include <android/androidconfigurations.h>
+#include <android/androidconstants.h>
#include <android/androidmanager.h>
-#include <android/androidqtsupport.h>
#include <coreplugin/editormanager/editormanager.h>
+#include <projectexplorer/project.h>
+#include <projectexplorer/projectnodes.h>
#include <projectexplorer/runconfiguration.h>
#include <projectexplorer/target.h>
@@ -177,13 +179,14 @@ bool ChooseDirectoryPage::isComplete() const
void ChooseDirectoryPage::initializePage()
{
+ const Target *target = m_wizard->target();
const QString buildKey = m_wizard->buildKey();
- const BuildTargetInfo bti = m_wizard->target()->applicationTargets().buildTargetInfo(buildKey);
+ const BuildTargetInfo bti = target->applicationTargets().buildTargetInfo(buildKey);
const QString projectDir = bti.projectFilePath.toFileInfo().absolutePath();
- AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_wizard->target());
- const QString androidPackageDir
- = qtSupport->targetData(Android::Constants::AndroidPackageSourceDir, m_wizard->target()).toString();
+ QString androidPackageDir;
+ if (const ProjectNode *node = target->project()->findNodeForBuildKey(buildKey))
+ androidPackageDir = node->targetData(Android::Constants::AndroidPackageSourceDir, target).toString();
if (androidPackageDir.isEmpty()) {
m_label->setText(tr("Select the Android package source directory.\n\n"
@@ -344,17 +347,19 @@ void CreateAndroidManifestWizard::createAndroidTemplateFiles()
AndroidManager::updateGradleProperties(m_target);
}
- AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_target);
- qtSupport->addFiles(m_target, m_buildKey, addedFiles);
- const QString androidPackageDir
- = qtSupport->targetData(Android::Constants::AndroidPackageSourceDir, m_target).toString();
+ QString androidPackageDir;
+ ProjectNode *node = m_target->project()->findNodeForBuildKey(m_buildKey);
+ if (node) {
+ node->addFiles(addedFiles);
+ androidPackageDir = node->targetData(Android::Constants::AndroidPackageSourceDir, m_target).toString();
+ }
if (androidPackageDir.isEmpty()) {
// and now time for some magic
const BuildTargetInfo bti = m_target->applicationTargets().buildTargetInfo(m_buildKey);
const QString value = "$$PWD/" + bti.projectFilePath.toFileInfo().absoluteDir().relativeFilePath(m_directory);
- bool result = qtSupport->setTargetData(Android::Constants::AndroidPackageSourceDir, value, m_target);
+ bool result = node->setTargetData(Android::Constants::AndroidPackageSourceDir, value, m_target);
if (!result) {
QMessageBox::warning(this, tr("Project File not Updated"),
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index f0fdc443fa..34680411b7 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -883,7 +883,7 @@ bool Project::hasParsingData() const
return d->m_hasParsingData;
}
-const ProjectNode *Project::findNodeForBuildKey(const QString &buildKey) const
+ProjectNode *Project::findNodeForBuildKey(const QString &buildKey) const
{
if (!d->m_rootProjectNode)
return nullptr;
diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h
index 563328bf07..73be1c2f35 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -171,7 +171,7 @@ public:
bool isParsing() const;
bool hasParsingData() const;
- const ProjectNode *findNodeForBuildKey(const QString &buildKey) const;
+ ProjectNode *findNodeForBuildKey(const QString &buildKey) const;
template<typename S, typename R, typename T, typename ...Args1, typename ...Args2>
void subscribeSignal(void (S::*sig)(Args1...), R*recv, T (R::*sl)(Args2...)) {
diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp
index 1c443dd9e8..46d5d083dc 100644
--- a/src/plugins/projectexplorer/projectnodes.cpp
+++ b/src/plugins/projectexplorer/projectnodes.cpp
@@ -525,16 +525,16 @@ void FolderNode::forEachProjectNode(const std::function<void(const ProjectNode *
}
}
-const ProjectNode *FolderNode::findProjectNode(const std::function<bool(const ProjectNode *)> &predicate) const
+ProjectNode *FolderNode::findProjectNode(const std::function<bool(const ProjectNode *)> &predicate)
{
- if (const ProjectNode *projectNode = asProjectNode()) {
+ if (ProjectNode *projectNode = asProjectNode()) {
if (predicate(projectNode))
return projectNode;
}
for (const std::unique_ptr<Node> &n : m_nodes) {
if (FolderNode *fn = n->asFolderNode()) {
- if (const ProjectNode *pn = fn->findProjectNode(predicate))
+ if (ProjectNode *pn = fn->findProjectNode(predicate))
return pn;
}
}
@@ -883,6 +883,21 @@ ProjectNode *ProjectNode::projectNode(const Utils::FileName &file) const
return nullptr;
}
+QVariant ProjectNode::targetData(Core::Id role, const Target *target) const
+{
+ Q_UNUSED(role);
+ Q_UNUSED(target);
+ return QVariant();
+}
+
+bool ProjectNode::setTargetData(Core::Id role, const QVariant &value, const Target *target) const
+{
+ Q_UNUSED(role);
+ Q_UNUSED(target);
+ Q_UNUSED(value);
+ return false;
+}
+
bool FolderNode::isEmpty() const
{
return m_nodes.size() == 0;
diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h
index 850c0082ec..e51d30b0f3 100644
--- a/src/plugins/projectexplorer/projectnodes.h
+++ b/src/plugins/projectexplorer/projectnodes.h
@@ -31,8 +31,11 @@
#include <QIcon>
#include <QStringList>
+#include <coreplugin/id.h>
+
#include <utils/fileutils.h>
#include <utils/optional.h>
+
#include <functional>
namespace Utils { class MimeType; }
@@ -40,6 +43,7 @@ namespace Utils { class MimeType; }
namespace ProjectExplorer {
class Project;
+class Target;
enum class NodeType : quint16 {
File = 1,
@@ -219,7 +223,7 @@ public:
const std::function<bool(const FolderNode *)> &folderFilterTask = {}) const;
void forEachGenericNode(const std::function<void(Node *)> &genericTask) const;
void forEachProjectNode(const std::function<void(const ProjectNode *)> &genericTask) const;
- const ProjectNode *findProjectNode(const std::function<bool(const ProjectNode *)> &predicate) const;
+ ProjectNode *findProjectNode(const std::function<bool(const ProjectNode *)> &predicate);
const QList<Node *> nodes() const;
QList<FileNode *> fileNodes() const;
FileNode *fileNode(const Utils::FileName &file) const;
@@ -344,7 +348,10 @@ public:
virtual QStringList targetApplications() const { return {}; }
virtual bool parseInProgress() const { return false; }
+
virtual bool validParse() const { return false; }
+ virtual QVariant targetData(Core::Id role, const Target *target) const;
+ virtual bool setTargetData(Core::Id role, const QVariant &value, const Target *target) const;
protected:
explicit ProjectNode(const Utils::FileName &projectFilePath, const QByteArray &id = {});
diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp
deleted file mode 100644
index f83f024cfe..0000000000
--- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 BogDan Vatra <bog_dan_ro@yahoo.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qt Creator.
-**
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-****************************************************************************/
-
-#include "qmakeandroidsupport.h"
-#include "androidqmakebuildconfigurationfactory.h"
-
-#include <android/androidbuildapkstep.h>
-#include <android/androidconstants.h>
-#include <android/androidglobal.h>
-
-#include <projectexplorer/runconfiguration.h>
-#include <projectexplorer/target.h>
-
-#include <qtsupport/qtkitinformation.h>
-#include <qmakeprojectmanager/qmakeproject.h>
-
-#include <utils/qtcassert.h>
-
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QRegularExpression>
-
-using namespace ProjectExplorer;
-using namespace QmakeProjectManager;
-using namespace Utils;
-
-namespace QmakeAndroidSupport {
-namespace Internal {
-
-bool QmakeAndroidSupport::canHandle(const ProjectExplorer::Target *target) const
-{
- return qobject_cast<QmakeProject*>(target->project());
-}
-
-QVariant QmakeAndroidSupport::targetData(Core::Id role, const Target *target) const
-{
- RunConfiguration *rc = target->activeRunConfiguration();
- if (!rc)
- return {};
-
- const FileName projectFilePath = FileName::fromString(rc->buildKey());
- const ProjectNode *projectNode = target->project()->findNodeForBuildKey(rc->buildKey());
- auto profileNode = dynamic_cast<const QmakeProFileNode *>(projectNode);
- QTC_ASSERT(profileNode, return {});
-
- if (role == Android::Constants::AndroidPackageSourceDir)
- return profileNode->singleVariableValue(Variable::AndroidPackageSourceDir);
- if (role == Android::Constants::AndroidDeploySettingsFile)
- return profileNode->singleVariableValue(Variable::AndroidDeploySettingsFile);
- if (role == Android::Constants::AndroidExtraLibs)
- return profileNode->variableValue(Variable::AndroidExtraLibs);
- if (role == Android::Constants::AndroidArch)
- return profileNode->singleVariableValue(Variable::AndroidArch);
-
- QTC_CHECK(false);
- return {};
-}
-
-static QmakeProFile *applicationProFile(const Target *target)
-{
- ProjectExplorer::RunConfiguration *rc = target->activeRunConfiguration();
- if (!rc)
- return nullptr;
- auto project = static_cast<QmakeProject *>(target->project());
- return project->rootProFile()->findProFile(FileName::fromString(rc->buildKey()));
-}
-
-bool QmakeAndroidSupport::setTargetData(Core::Id role, const QVariant &value, const Target *target) const
-{
- QmakeProFile *pro = applicationProFile(target);
- if (!pro)
- return false;
-
- const QString arch = pro->singleVariableValue(Variable::AndroidArch);
- const QString scope = "contains(ANDROID_TARGET_ARCH," + arch + ')';
- auto flags = QmakeProjectManager::Internal::ProWriter::ReplaceValues
- | QmakeProjectManager::Internal::ProWriter::MultiLine;
-
- if (role == Android::Constants::AndroidExtraLibs)
- return pro->setProVariable("ANDROID_EXTRA_LIBS", value.toStringList(), scope, flags);
- if (role == Android::Constants::AndroidPackageSourceDir)
- return pro->setProVariable("ANDROID_PACKAGE_SOURCE_DIR", {value.toString()}, scope, flags);
-
- return false;
-}
-
-QStringList QmakeAndroidSupport::soLibSearchPath(const ProjectExplorer::Target *target) const
-{
- QSet<QString> res;
-
- ProjectNode *root = target->project()->rootProjectNode();
- root->forEachProjectNode([&res](const ProjectNode *node) {
- auto qmakeNode = dynamic_cast<const QmakeProFileNode *>(node);
- if (!qmakeNode)
- return;
- TargetInformation info = qmakeNode->targetInformation();
- res.insert(info.buildDir.toString());
- Utils::FileName destDir = info.destDir;
- if (!destDir.isEmpty()) {
- if (destDir.toFileInfo().isRelative())
- destDir = Utils::FileName::fromString(QDir::cleanPath(info.buildDir.toString()
- + '/' + destDir.toString()));
- res.insert(destDir.toString());
- }
- });
-
- const QString jsonFile = targetData(Android::Constants::AndroidDeploySettingsFile, target).toString();
- QFile deploymentSettings(jsonFile);
- if (deploymentSettings.open(QIODevice::ReadOnly)) {
- QJsonParseError error;
- QJsonDocument doc = QJsonDocument::fromJson(deploymentSettings.readAll(), &error);
- if (error.error == QJsonParseError::NoError) {
- auto rootObj = doc.object();
- auto it = rootObj.find("stdcpp-path");
- if (it != rootObj.constEnd())
- res.insert(QFileInfo(it.value().toString()).absolutePath());
- }
- }
-
- return res.toList();
-}
-
-void QmakeAndroidSupport::addFiles(const ProjectExplorer::Target *target,
- const QString &buildKey,
- const QStringList &addedFiles) const
-{
- auto project = static_cast<QmakeProject *>(target->project());
- QmakeProFile *currentRunNode = project->rootProFile()->findProFile(FileName::fromString(buildKey));
- QTC_ASSERT(currentRunNode, return);
- currentRunNode->addFiles(addedFiles);
-}
-
-} // namespace Internal
-} // namespace QmakeAndroidSupport
diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h
deleted file mode 100644
index 69f4db5022..0000000000
--- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 BogDan Vatra <bog_dan_ro@yahoo.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qt Creator.
-**
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-****************************************************************************/
-
-#pragma once
-
-#include <android/androidqtsupport.h>
-
-namespace QmakeAndroidSupport {
-namespace Internal {
-
-class QmakeAndroidSupport : public Android::AndroidQtSupport
-{
- Q_OBJECT
-
-public:
- bool canHandle(const ProjectExplorer::Target *target) const override;
- QStringList soLibSearchPath(const ProjectExplorer::Target *target) const override;
-
- QVariant targetData(Core::Id role, const ProjectExplorer::Target *target) const override;
- bool setTargetData(Core::Id role, const QVariant &value,
- const ProjectExplorer::Target *target) const override;
-
- void addFiles(const ProjectExplorer::Target *target, const QString &buildKey,
- const QStringList &addedFiles) const override;
-};
-
-} // namespace Internal
-} // namespace QmakeAndroidSupport
diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro
index a98219e66e..88731ade87 100644
--- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro
+++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro
@@ -5,11 +5,9 @@ DEFINES += \
QMAKEANDROID_LIBRARY
HEADERS += \
- qmakeandroidsupport.h \
androidqmakebuildconfigurationfactory.h \
qmakeandroidsupportplugin.h
SOURCES += \
- qmakeandroidsupport.cpp \
androidqmakebuildconfigurationfactory.cpp \
qmakeandroidsupportplugin.cpp
diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs
index 8a0af145d1..81f06b20cc 100644
--- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs
+++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs
@@ -18,8 +18,6 @@ QtcPlugin {
files: [
"androidqmakebuildconfigurationfactory.cpp",
"androidqmakebuildconfigurationfactory.h",
- "qmakeandroidsupport.cpp",
- "qmakeandroidsupport.h",
"qmakeandroidsupportplugin.h",
"qmakeandroidsupportplugin.cpp",
]
diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupportplugin.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidsupportplugin.cpp
index 28d486dda3..1959bae698 100644
--- a/src/plugins/qmakeandroidsupport/qmakeandroidsupportplugin.cpp
+++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupportplugin.cpp
@@ -26,7 +26,6 @@
#include "qmakeandroidsupportplugin.h"
#include "androidqmakebuildconfigurationfactory.h"
-#include "qmakeandroidsupport.h"
using namespace ProjectExplorer;
@@ -37,7 +36,6 @@ class QmakeAndroidSupportPluginPrivate
{
public:
AndroidQmakeBuildConfigurationFactory buildConfigFactory;
- QmakeAndroidSupport androidSupport;
};
QmakeAndroidSupportPlugin::~QmakeAndroidSupportPlugin()
diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
index b9d380b3e2..56971842d2 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
@@ -35,6 +35,12 @@
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
+#include <android/androidconstants.h>
+
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonParseError>
+
using namespace ProjectExplorer;
using namespace Utils;
@@ -241,6 +247,70 @@ QStringList QmakeProFileNode::targetApplications() const
return apps;
}
+QVariant QmakeProFileNode::targetData(Core::Id role, const Target *target) const
+{
+ RunConfiguration *rc = target->activeRunConfiguration();
+ if (!rc)
+ return {};
+
+ const FileName projectFilePath = FileName::fromString(rc->buildKey());
+ const ProjectNode *projectNode = target->project()->findNodeForBuildKey(rc->buildKey());
+ auto profileNode = dynamic_cast<const QmakeProFileNode *>(projectNode);
+ QTC_ASSERT(profileNode, return {});
+
+ if (role == Android::Constants::AndroidPackageSourceDir)
+ return profileNode->singleVariableValue(Variable::AndroidPackageSourceDir);
+ if (role == Android::Constants::AndroidDeploySettingsFile)
+ return profileNode->singleVariableValue(Variable::AndroidDeploySettingsFile);
+ if (role == Android::Constants::AndroidExtraLibs)
+ return profileNode->variableValue(Variable::AndroidExtraLibs);
+ if (role == Android::Constants::AndroidArch)
+ return profileNode->singleVariableValue(Variable::AndroidArch);
+ if (role == Android::Constants::AndroidSoLibPath) {
+ TargetInformation info = profileNode->targetInformation();
+ QStringList res = {info.buildDir.toString()};
+ Utils::FileName destDir = info.destDir;
+ if (!destDir.isEmpty()) {
+ if (destDir.toFileInfo().isRelative())
+ destDir = Utils::FileName::fromString(QDir::cleanPath(info.buildDir.toString()
+ + '/' + destDir.toString()));
+ res.append(destDir.toString());
+ }
+ res.removeDuplicates();
+ return res;
+ }
+ QTC_CHECK(false);
+ return {};
+}
+
+static QmakeProFile *applicationProFile(const Target *target)
+{
+ ProjectExplorer::RunConfiguration *rc = target->activeRunConfiguration();
+ if (!rc)
+ return nullptr;
+ auto project = static_cast<QmakeProject *>(target->project());
+ return project->rootProFile()->findProFile(FileName::fromString(rc->buildKey()));
+}
+
+bool QmakeProFileNode::setTargetData(Core::Id role, const QVariant &value, const Target *target) const
+{
+ QmakeProFile *pro = applicationProFile(target);
+ if (!pro)
+ return false;
+
+ const QString arch = pro->singleVariableValue(Variable::AndroidArch);
+ const QString scope = "contains(ANDROID_TARGET_ARCH," + arch + ')';
+ auto flags = QmakeProjectManager::Internal::ProWriter::ReplaceValues
+ | QmakeProjectManager::Internal::ProWriter::MultiLine;
+
+ if (role == Android::Constants::AndroidExtraLibs)
+ return pro->setProVariable("ANDROID_EXTRA_LIBS", value.toStringList(), scope, flags);
+ if (role == Android::Constants::AndroidPackageSourceDir)
+ return pro->setProVariable("ANDROID_PACKAGE_SOURCE_DIR", {value.toString()}, scope, flags);
+
+ return false;
+}
+
QmakeProFile *QmakeProFileNode::proFile() const
{
return static_cast<QmakeProFile*>(QmakePriFileNode::priFile());
diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.h b/src/plugins/qmakeprojectmanager/qmakenodes.h
index 636be3775a..8f17761bbe 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodes.h
+++ b/src/plugins/qmakeprojectmanager/qmakenodes.h
@@ -98,6 +98,10 @@ public:
QStringList targetApplications() const override;
AddNewInformation addNewInformation(const QStringList &files, Node *context) const override;
+ QVariant targetData(Core::Id role,
+ const ProjectExplorer::Target *target) const override;
+ bool setTargetData(Core::Id role, const QVariant &value,
+ const ProjectExplorer::Target *target) const override;
QmakeProjectManager::ProjectType projectType() const;
QString buildDir() const;