summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/android/androidconfigurations.cpp14
-rw-r--r--src/plugins/android/androidconstants.h7
-rw-r--r--src/plugins/android/androiddebugsupport.cpp2
-rw-r--r--src/plugins/android/androiddeployqtstep.cpp95
-rw-r--r--src/plugins/android/androidmanager.cpp8
-rw-r--r--src/plugins/android/androidmanager.h1
-rw-r--r--src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp214
-rw-r--r--src/plugins/qbsprojectmanager/qbsnodes.cpp49
-rw-r--r--src/plugins/qbsprojectmanager/qbsnodes.h1
m---------src/shared/qbs0
10 files changed, 254 insertions, 137 deletions
diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp
index fd569b7ff4..e04300df2f 100644
--- a/src/plugins/android/androidconfigurations.cpp
+++ b/src/plugins/android/androidconfigurations.cpp
@@ -1015,6 +1015,18 @@ static QVariant findOrRegisterDebugger(ToolChain *tc)
void AndroidConfigurations::updateAutomaticKitList()
{
+ const QList<Kit *> androidKits = Utils::filtered(KitManager::kits(), [](Kit *k) {
+ Core::Id deviceTypeId = DeviceTypeKitAspect::deviceTypeId(k);
+ return deviceTypeId == Core::Id(Constants::ANDROID_DEVICE_TYPE);
+ });
+
+ for (auto k: androidKits) {
+ if (k->value(Constants::ANDROID_KIT_NDK).isNull() || k->value(Constants::ANDROID_KIT_SDK).isNull()) {
+ k->setValueSilently(Constants::ANDROID_KIT_NDK, currentConfig().ndkLocation().toString());
+ k->setValue(Constants::ANDROID_KIT_SDK, currentConfig().sdkLocation().toString());
+ }
+ }
+
const QList<Kit *> existingKits = Utils::filtered(KitManager::kits(), [](Kit *k) {
Core::Id deviceTypeId = DeviceTypeKitAspect::deviceTypeId(k);
if (k->isAutoDetected() && !k->isSdkProvided()
@@ -1090,6 +1102,8 @@ void AndroidConfigurations::updateAutomaticKitList()
k->setUnexpandedDisplayName(tr("Android for %1 (Clang %2)")
.arg(static_cast<const AndroidQtVersion *>(qt)->targetArch())
.arg(qt->displayName()));
+ k->setValueSilently(Constants::ANDROID_KIT_NDK, currentConfig().ndkLocation().toString());
+ k->setValueSilently(Constants::ANDROID_KIT_SDK, currentConfig().sdkLocation().toString());
};
if (existingKit)
diff --git a/src/plugins/android/androidconstants.h b/src/plugins/android/androidconstants.h
index 44d52b1d94..affcd85d57 100644
--- a/src/plugins/android/androidconstants.h
+++ b/src/plugins/android/androidconstants.h
@@ -63,11 +63,13 @@ const char ANDROID_MANIFEST_MIME_TYPE[] = "application/vnd.google.android.androi
const char ANDROID_MANIFEST_EDITOR_ID[] = "Android.AndroidManifestEditor.Id";
const char ANDROID_MANIFEST_EDITOR_CONTEXT[] = "Android.AndroidManifestEditor.Id";
+const char ANDROID_KIT_NDK[] = "Android.NDK";
+const char ANDROID_KIT_SDK[] = "Android.SDK";
+
const char ANDROID_BUILDDIRECTORY[] = "android-build";
const char JAVA_EDITOR_ID[] = "java.editor";
const char JAVA_MIMETYPE[] = "text/x-java";
const char ANDROID_ARCHITECTURE[] = "Android.Architecture";
-const char ANDROID_DEPLOY_SETTINGS_FILE[] = "AndroidDeploySettingsFile";
const char ANDROID_PACKAGE_SOURCE_DIR[] = "AndroidPackageSourceDir";
const char ANDROID_EXTRA_LIBS[] = "AndroidExtraLibs";
@@ -78,9 +80,12 @@ const char ANDROID_BUILD_APK_ID[] = "Android.BuildApkStep";
const char AndroidPackageSourceDir[] = "AndroidPackageSourceDir"; // QString
const char AndroidDeploySettingsFile[] = "AndroidDeploySettingsFile"; // QString
const char AndroidExtraLibs[] = "AndroidExtraLibs"; // QStringList
+// REMOVE ME
const char AndroidArch[] = "AndroidArch"; // QString
const char AndroidSoLibPath[] = "AndroidSoLibPath"; // QStringList
const char AndroidTargets[] = "AndroidTargets"; // QStringList
+const char AndroidApk[] = "Android.APK"; // QStringList
+const char AndroidManifest[] = "Android.Manifest"; // QStringList
const char AndroidNdkPlatform[] = "AndroidNdkPlatform"; //QString
const char NdkLocation[] = "NdkLocation"; // FileName
diff --git a/src/plugins/android/androiddebugsupport.cpp b/src/plugins/android/androiddebugsupport.cpp
index e01dcfaf7d..7c61a37f06 100644
--- a/src/plugins/android/androiddebugsupport.cpp
+++ b/src/plugins/android/androiddebugsupport.cpp
@@ -172,6 +172,8 @@ void AndroidDebugSupport::start()
QStringList extraLibs = getExtraLibs(node);
solibSearchPath.append(qtSoPaths(qtVersion));
solibSearchPath.append(uniquePaths(extraLibs));
+ solibSearchPath.append(target->activeBuildConfiguration()->buildDirectory().toString());
+ solibSearchPath.removeDuplicates();
setSolibSearchPath(solibSearchPath);
qCDebug(androidDebugSupportLog) << "SoLibSearchPath: "<<solibSearchPath;
setSymbolFile(target->activeBuildConfiguration()->buildDirectory().toString()
diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp
index 8ba6012875..6bb49e00dd 100644
--- a/src/plugins/android/androiddeployqtstep.cpp
+++ b/src/plugins/android/androiddeployqtstep.cpp
@@ -186,11 +186,6 @@ bool AndroidDeployQtStep::init()
QTC_ASSERT(deployQtLive || bc, return false);
auto androidBuildApkStep = AndroidBuildApkStep::findInBuild(bc);
- if (!androidBuildApkStep && !deployQtLive) {
- emit addOutput(tr("Cannot find the android build step."), OutputFormat::Stderr);
- return false;
- }
-
int minTargetApi = AndroidManager::minimumSDK(target());
qCDebug(deployStepLog) << "Target architecture:" << m_targetArch
<< "Min target API" << minTargetApi;
@@ -236,49 +231,57 @@ bool AndroidDeployQtStep::init()
version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0);
if (m_useAndroiddeployqt) {
- m_command = version->qmakeProperty("QT_HOST_BINS");
- if (m_command.isEmpty()) {
- emit addOutput(tr("Cannot find the androiddeployqt tool."), OutputFormat::Stderr);
- return false;
- }
- qCDebug(deployStepLog) << "Using androiddeployqt";
- if (!m_command.endsWith(QLatin1Char('/')))
- m_command += QLatin1Char('/');
- m_command += Utils::HostOsInfo::withExecutableSuffix(QLatin1String("androiddeployqt"));
-
- m_workingDirectory = bc->buildDirectory().appendPath(QLatin1String(Constants::ANDROID_BUILDDIRECTORY)).toString();
-
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--verbose"));
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--output"));
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, m_workingDirectory);
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--no-build"));
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--input"));
-
- QString jsonFile;
- if (const ProjectNode *node = target()->project()->findNodeForBuildKey(rc->buildKey()))
- jsonFile = node->data(Constants::AndroidDeploySettingsFile).toString();
- if (jsonFile.isEmpty()) {
- emit addOutput(tr("Cannot find the androiddeploy Json file."), OutputFormat::Stderr);
- return false;
- }
+ const ProjectNode *node = target()->project()->findNodeForBuildKey(rc->buildKey());
+ m_apkPath = Utils::FileName::fromString(node->data(Constants::AndroidApk).toString());
+ if (!m_apkPath.isEmpty()) {
+ m_manifestName = Utils::FileName::fromString(node->data(Constants::AndroidManifest).toString());
+ m_command = AndroidConfigurations::currentConfig().adbToolPath().toString();
+ AndroidManager::setManifestPath(target(), m_manifestName);
+ } else {
+ QString jsonFile;
+ if (node)
+ jsonFile = node->data(Constants::AndroidDeploySettingsFile).toString();
+ if (jsonFile.isEmpty()) {
+ emit addOutput(tr("Cannot find the androiddeploy Json file."), OutputFormat::Stderr);
+ return false;
+ } m_command = version->qmakeProperty("QT_HOST_BINS");
+ if (m_command.isEmpty()) {
+ emit addOutput(tr("Cannot find the androiddeployqt tool."), OutputFormat::Stderr);
+ return false;
+ }
+ qCDebug(deployStepLog) << "Using androiddeployqt";
+ if (!m_command.endsWith(QLatin1Char('/')))
+ m_command += QLatin1Char('/');
+ m_command += Utils::HostOsInfo::withExecutableSuffix(QLatin1String("androiddeployqt"));
+
+ m_workingDirectory = bc->buildDirectory().appendPath(QLatin1String(Constants::ANDROID_BUILDDIRECTORY)).toString();
+
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--verbose"));
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--output"));
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, m_workingDirectory);
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--no-build"));
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--input"));
+
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, jsonFile);
- if (androidBuildApkStep && androidBuildApkStep->useMinistro()) {
- qCDebug(deployStepLog) << "Using ministro";
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--deployment"));
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("ministro"));
- }
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--gradle"));
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, jsonFile);
+ if (androidBuildApkStep && androidBuildApkStep->useMinistro()) {
+ qCDebug(deployStepLog) << "Using ministro";
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--deployment"));
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("ministro"));
+ }
+
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--gradle"));
- if (androidBuildApkStep && androidBuildApkStep->signPackage()) {
- // The androiddeployqt tool is not really written to do stand-alone installations.
- // This hack forces it to use the correct filename for the apk file when installing
- // as a temporary fix until androiddeployqt gets the support. Since the --sign is
- // only used to get the correct file name of the apk, its parameters are ignored.
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--sign"));
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("foo"));
- Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("bar"));
+ if (androidBuildApkStep && androidBuildApkStep->signPackage()) {
+ // The androiddeployqt tool is not really written to do stand-alone installations.
+ // This hack forces it to use the correct filename for the apk file when installing
+ // as a temporary fix until androiddeployqt gets the support. Since the --sign is
+ // only used to get the correct file name of the apk, its parameters are ignored.
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--sign"));
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("foo"));
+ Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("bar"));
+ }
}
} else {
m_uninstallPreviousPackageRun = true;
@@ -301,7 +304,7 @@ bool AndroidDeployQtStep::init()
AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::runDeploy()
{
QString args;
- if (m_useAndroiddeployqt) {
+ if (m_useAndroiddeployqt && m_apkPath.isEmpty()) {
args = m_androiddeployqtArgs;
if (m_uninstallPreviousPackageRun)
Utils::QtcProcess::addArg(&args, QLatin1String("--install"));
diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp
index 18d0ff7a88..6a45bd6d45 100644
--- a/src/plugins/android/androidmanager.cpp
+++ b/src/plugins/android/androidmanager.cpp
@@ -332,9 +332,17 @@ Utils::FileName AndroidManager::manifestSourcePath(ProjectExplorer::Target *targ
Utils::FileName AndroidManager::manifestPath(ProjectExplorer::Target *target)
{
+ QVariant manifest = target->namedSettings(AndroidManifestName);
+ if (manifest.isValid())
+ return manifest.value<FileName>();
return dirPath(target).appendPath(AndroidManifestName);
}
+void AndroidManager::setManifestPath(Target *target, const FileName &path)
+{
+ target->setNamedSettings(AndroidManifestName, QVariant::fromValue(path));
+}
+
Utils::FileName AndroidManager::defaultPropertiesPath(ProjectExplorer::Target *target)
{
return dirPath(target).appendPath(AndroidDefaultPropertiesName);
diff --git a/src/plugins/android/androidmanager.h b/src/plugins/android/androidmanager.h
index 1e7cb516af..329661d965 100644
--- a/src/plugins/android/androidmanager.h
+++ b/src/plugins/android/androidmanager.h
@@ -91,6 +91,7 @@ public:
static Utils::FileName dirPath(const ProjectExplorer::Target *target);
static Utils::FileName manifestPath(ProjectExplorer::Target *target);
+ static void setManifestPath(ProjectExplorer::Target *target, const Utils::FileName &path);
static Utils::FileName manifestSourcePath(ProjectExplorer::Target *target);
static Utils::FileName defaultPropertiesPath(ProjectExplorer::Target *target);
static Utils::FileName apkPath(const ProjectExplorer::Target *target);
diff --git a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp
index 071de5fc22..189125a648 100644
--- a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp
+++ b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp
@@ -42,6 +42,7 @@
#include <qbs.h>
+#include <android/androidconstants.h>
#include <ios/iosconstants.h>
#include <winrt/winrtconstants.h>
@@ -123,20 +124,24 @@ static QString targetPlatform(const ProjectExplorer::Abi &abi, const ProjectExpl
static QStringList toolchainList(const ProjectExplorer::ToolChain *tc)
{
QStringList list;
- if (tc->typeId() == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID)
+ if (tc->typeId() == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID
+ || (tc->typeId() == Android::Constants::ANDROID_TOOLCHAIN_ID
+ && tc->compilerCommand().toString().contains("clang"))) {
list << QLatin1String("clang") << QLatin1String("llvm") << QLatin1String("gcc");
- else if (tc->typeId() == ProjectExplorer::Constants::GCC_TOOLCHAIN_TYPEID)
+ } else if (tc->typeId() == ProjectExplorer::Constants::GCC_TOOLCHAIN_TYPEID
+ || tc->typeId() == Android::Constants::ANDROID_TOOLCHAIN_ID) {
list << QLatin1String("gcc"); // TODO: Detect llvm-gcc
- else if (tc->typeId() == ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID)
+ } else if (tc->typeId() == ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID) {
list << QLatin1String("mingw") << QLatin1String("gcc");
- else if (tc->typeId() == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID)
+ } else if (tc->typeId() == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) {
list << QLatin1String("msvc");
- else if (tc->typeId() == BareMetal::Constants::IAREW_TOOLCHAIN_TYPEID)
+ } else if (tc->typeId() == BareMetal::Constants::IAREW_TOOLCHAIN_TYPEID) {
list << QLatin1String("iar");
- else if (tc->typeId() == BareMetal::Constants::KEIL_TOOLCHAIN_TYPEID)
+ } else if (tc->typeId() == BareMetal::Constants::KEIL_TOOLCHAIN_TYPEID) {
list << QLatin1String("keil");
- else if (tc->typeId() == BareMetal::Constants::SDCC_TOOLCHAIN_TYPEID)
+ } else if (tc->typeId() == BareMetal::Constants::SDCC_TOOLCHAIN_TYPEID) {
list << QLatin1String("sdcc");
+ }
return list;
}
@@ -145,6 +150,22 @@ static QString architecture(const ProjectExplorer::Abi &targetAbi)
if (targetAbi.architecture() != ProjectExplorer::Abi::UnknownArchitecture) {
QString architecture = ProjectExplorer::Abi::toString(targetAbi.architecture());
+ if (targetAbi.osFlavor() == ProjectExplorer::Abi::AndroidLinuxFlavor) {
+ switch (targetAbi.architecture()) {
+ case ProjectExplorer::Abi::X86Architecture:
+ if (targetAbi.wordWidth() == 64)
+ architecture += "_64";
+ return architecture;
+ case ProjectExplorer::Abi::ArmArchitecture:
+ if (targetAbi.wordWidth() == 64)
+ architecture += "64";
+ else
+ architecture += "v7a";
+ return architecture;
+ default:
+ break;
+ }
+ }
// We have to be conservative tacking on suffixes to arch names because an arch that is
// already 64-bit may get an incorrect name as a result (i.e. Itanium)
if (targetAbi.wordWidth() == 64) {
@@ -248,101 +269,114 @@ QVariantMap DefaultPropertyProvider::autoGeneratedProperties(const ProjectExplor
if (!archs.isEmpty())
data.insert(QLatin1String(QBS_ARCHITECTURES), archs);
if (mainTc->targetAbi() !=
- ProjectExplorer::Abi::abiFromTargetTriplet(mainTc->originalTargetTriple())) {
+ ProjectExplorer::Abi::abiFromTargetTriplet(mainTc->originalTargetTriple())
+ || targetAbi.osFlavor() == ProjectExplorer::Abi::AndroidLinuxFlavor) {
data.insert(QLatin1String(QBS_ARCHITECTURE), architecture(mainTc->targetAbi()));
}
data.insert(QLatin1String(QBS_TARGETPLATFORM), targetPlatform(targetAbi, k));
QStringList toolchain = toolchainList(mainTc);
-
- Utils::FileName cCompilerPath;
- if (tcC)
- cCompilerPath = tcC->compilerCommand();
-
- Utils::FileName cxxCompilerPath;
- if (tcCxx)
- cxxCompilerPath = tcCxx->compilerCommand();
-
- const QFileInfo cFileInfo = cCompilerPath.toFileInfo();
- const QFileInfo cxxFileInfo = cxxCompilerPath.toFileInfo();
- QString cCompilerName = cFileInfo.fileName();
- QString cxxCompilerName = cxxFileInfo.fileName();
- const QString cToolchainPrefix = extractToolchainPrefix(&cCompilerName);
- const QString cxxToolchainPrefix = extractToolchainPrefix(&cxxCompilerName);
-
- QFileInfo mainFileInfo;
- QString mainCompilerName;
- QString mainToolchainPrefix;
- if (tcCxx) {
- mainFileInfo = cxxFileInfo;
- mainCompilerName = cxxCompilerName;
- mainToolchainPrefix = cxxToolchainPrefix;
+ if (targetAbi.osFlavor() == ProjectExplorer::Abi::AndroidLinuxFlavor) {
+ const ProjectExplorer::IDevice::ConstPtr dev = ProjectExplorer::DeviceKitAspect::device(k);
+ if (dev) {
+ const QString sdkDir = k->value(Android::Constants::ANDROID_KIT_SDK).toString();
+ if (!sdkDir.isEmpty())
+ data.insert("Android.sdk.sdkDir", sdkDir);
+ const QString ndkDir = k->value(Android::Constants::ANDROID_KIT_NDK).toString();
+ if (!ndkDir.isEmpty()) {
+ data.insert("Android.sdk.ndkDir", ndkDir);
+ data.insert("Android.ndk.ndkDir", ndkDir);
+ }
+ }
} else {
- mainFileInfo = cFileInfo;
- mainCompilerName = cCompilerName;
- mainToolchainPrefix = cToolchainPrefix;
- }
+ Utils::FileName cCompilerPath;
+ if (tcC)
+ cCompilerPath = tcC->compilerCommand();
+
+ Utils::FileName cxxCompilerPath;
+ if (tcCxx)
+ cxxCompilerPath = tcCxx->compilerCommand();
+
+ const QFileInfo cFileInfo = cCompilerPath.toFileInfo();
+ const QFileInfo cxxFileInfo = cxxCompilerPath.toFileInfo();
+ QString cCompilerName = cFileInfo.fileName();
+ QString cxxCompilerName = cxxFileInfo.fileName();
+ const QString cToolchainPrefix = extractToolchainPrefix(&cCompilerName);
+ const QString cxxToolchainPrefix = extractToolchainPrefix(&cxxCompilerName);
+
+ QFileInfo mainFileInfo;
+ QString mainCompilerName;
+ QString mainToolchainPrefix;
+ if (tcCxx) {
+ mainFileInfo = cxxFileInfo;
+ mainCompilerName = cxxCompilerName;
+ mainToolchainPrefix = cxxToolchainPrefix;
+ } else {
+ mainFileInfo = cFileInfo;
+ mainCompilerName = cCompilerName;
+ mainToolchainPrefix = cToolchainPrefix;
+ }
- if (!mainToolchainPrefix.isEmpty())
- data.insert(QLatin1String(CPP_TOOLCHAINPREFIX), mainToolchainPrefix);
+ if (!mainToolchainPrefix.isEmpty())
+ data.insert(QLatin1String(CPP_TOOLCHAINPREFIX), mainToolchainPrefix);
- if (toolchain.contains(QLatin1String("msvc"))) {
- data.insert(QLatin1String(CPP_COMPILERNAME), mainCompilerName);
- } else {
- if (!mainCompilerName.isEmpty())
+ if (toolchain.contains(QLatin1String("msvc"))) {
data.insert(QLatin1String(CPP_COMPILERNAME), mainCompilerName);
- if (!cCompilerName.isEmpty())
- data.insert(QLatin1String(CPP_CCOMPILERNAME), cCompilerName);
- if (!cxxCompilerName.isEmpty())
- data.insert(QLatin1String(CPP_CXXCOMPILERNAME), cxxCompilerName);
- }
-
- if (tcC && tcCxx && cFileInfo.absolutePath() != cxxFileInfo.absolutePath()) {
- Core::MessageManager::write(tr("C and C++ compiler paths differ. C compiler may not work."),
- Core::MessageManager::ModeSwitch);
- }
- data.insert(QLatin1String(CPP_TOOLCHAINPATH), mainFileInfo.absolutePath());
+ } else {
+ if (!mainCompilerName.isEmpty())
+ data.insert(QLatin1String(CPP_COMPILERNAME), mainCompilerName);
+ if (!cCompilerName.isEmpty())
+ data.insert(QLatin1String(CPP_CCOMPILERNAME), cCompilerName);
+ if (!cxxCompilerName.isEmpty())
+ data.insert(QLatin1String(CPP_CXXCOMPILERNAME), cxxCompilerName);
+ }
- if (auto gcc = dynamic_cast<ProjectExplorer::GccToolChain *>(mainTc)) {
- QStringList compilerFlags = gcc->platformCodeGenFlags();
- filterCompilerLinkerFlags(targetAbi, compilerFlags);
- data.insert(QLatin1String(CPP_PLATFORMCOMMONCOMPILERFLAGS), compilerFlags);
+ if (tcC && tcCxx && cFileInfo.absolutePath() != cxxFileInfo.absolutePath()) {
+ Core::MessageManager::write(tr("C and C++ compiler paths differ. C compiler may not work."),
+ Core::MessageManager::ModeSwitch);
+ }
+ data.insert(QLatin1String(CPP_TOOLCHAINPATH), mainFileInfo.absolutePath());
- QStringList linkerFlags = gcc->platformLinkerFlags();
- filterCompilerLinkerFlags(targetAbi, linkerFlags);
- data.insert(QLatin1String(CPP_PLATFORMLINKERFLAGS), linkerFlags);
- }
+ if (auto gcc = dynamic_cast<ProjectExplorer::GccToolChain *>(mainTc)) {
+ QStringList compilerFlags = gcc->platformCodeGenFlags();
+ filterCompilerLinkerFlags(targetAbi, compilerFlags);
+ data.insert(QLatin1String(CPP_PLATFORMCOMMONCOMPILERFLAGS), compilerFlags);
- if (targetAbi.os() == ProjectExplorer::Abi::DarwinOS) {
- // Reverse engineer the Xcode developer path from the compiler path
- const QRegularExpression compilerRe(
- QStringLiteral("^(?<developerpath>.*)/Toolchains/(?:.+)\\.xctoolchain/usr/bin$"));
- const QRegularExpressionMatch compilerReMatch = compilerRe.match(cxxFileInfo.absolutePath());
- if (compilerReMatch.hasMatch()) {
- const QString developerPath = compilerReMatch.captured(QStringLiteral("developerpath"));
- data.insert(QLatin1String(XCODE_DEVELOPERPATH), developerPath);
- toolchain.insert(0, QStringLiteral("xcode"));
-
- // If the sysroot is part of this developer path, set the canonical SDK name
- const QDir sysrootdir(QDir::cleanPath(sysroot));
- const QString sysrootAbs = sysrootdir.absolutePath();
- const QSettings sdkSettings(
- sysrootdir.absoluteFilePath(QStringLiteral("SDKSettings.plist")),
- QSettings::NativeFormat);
- const QString version(
- sdkSettings.value(QStringLiteral("Version")).toString());
- QString canonicalName(
- sdkSettings.value(QStringLiteral("CanonicalName")).toString());
- canonicalName.chop(version.size());
- if (!canonicalName.isEmpty() && !version.isEmpty()
- && sysrootAbs.startsWith(developerPath)) {
- if (sysrootAbs.endsWith(QStringLiteral("/%1.sdk").arg(canonicalName + version),
- Qt::CaseInsensitive)) {
- data.insert(QLatin1String(XCODE_SDK), QString(canonicalName + version));
- }
- if (sysrootAbs.endsWith(QStringLiteral("/%1.sdk").arg(canonicalName),
- Qt::CaseInsensitive)) {
- data.insert(QLatin1String(XCODE_SDK), canonicalName);
+ QStringList linkerFlags = gcc->platformLinkerFlags();
+ filterCompilerLinkerFlags(targetAbi, linkerFlags);
+ data.insert(QLatin1String(CPP_PLATFORMLINKERFLAGS), linkerFlags);
+ }
+ if (targetAbi.os() == ProjectExplorer::Abi::DarwinOS) {
+ // Reverse engineer the Xcode developer path from the compiler path
+ const QRegularExpression compilerRe(
+ QStringLiteral("^(?<developerpath>.*)/Toolchains/(?:.+)\\.xctoolchain/usr/bin$"));
+ const QRegularExpressionMatch compilerReMatch = compilerRe.match(cxxFileInfo.absolutePath());
+ if (compilerReMatch.hasMatch()) {
+ const QString developerPath = compilerReMatch.captured(QStringLiteral("developerpath"));
+ data.insert(QLatin1String(XCODE_DEVELOPERPATH), developerPath);
+ toolchain.insert(0, QStringLiteral("xcode"));
+
+ // If the sysroot is part of this developer path, set the canonical SDK name
+ const QDir sysrootdir(QDir::cleanPath(sysroot));
+ const QString sysrootAbs = sysrootdir.absolutePath();
+ const QSettings sdkSettings(
+ sysrootdir.absoluteFilePath(QStringLiteral("SDKSettings.plist")),
+ QSettings::NativeFormat);
+ const QString version(
+ sdkSettings.value(QStringLiteral("Version")).toString());
+ QString canonicalName(
+ sdkSettings.value(QStringLiteral("CanonicalName")).toString());
+ canonicalName.chop(version.size());
+ if (!canonicalName.isEmpty() && !version.isEmpty()
+ && sysrootAbs.startsWith(developerPath)) {
+ if (sysrootAbs.endsWith(QStringLiteral("/%1.sdk").arg(canonicalName + version),
+ Qt::CaseInsensitive)) {
+ data.insert(QLatin1String(XCODE_SDK), QString(canonicalName + version));
+ }
+ if (sysrootAbs.endsWith(QStringLiteral("/%1.sdk").arg(canonicalName),
+ Qt::CaseInsensitive)) {
+ data.insert(QLatin1String(XCODE_SDK), canonicalName);
+ }
}
}
}
diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp
index 9ceb32c033..a0c25b6182 100644
--- a/src/plugins/qbsprojectmanager/qbsnodes.cpp
+++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp
@@ -30,6 +30,7 @@
#include "qbsprojectmanagerconstants.h"
#include "qbsrunconfiguration.h"
+#include <android/androidconstants.h>
#include <coreplugin/fileiconprovider.h>
#include <coreplugin/idocument.h>
#include <projectexplorer/projectexplorerconstants.h>
@@ -399,6 +400,54 @@ QString QbsProductNode::buildKey() const
return QbsProject::uniqueProductName(m_qbsProductData);
}
+QVariant QbsProductNode::data(Core::Id role) const
+{
+// if (role == Android::Constants::AndroidExtraLibs)
+// return value("ANDROID_EXTRA_LIBS");
+
+ if (role == Android::Constants::AndroidDeploySettingsFile) {
+ for (const auto &artifact : m_qbsProductData.generatedArtifacts()) {
+ if (artifact.fileTags().contains("qt_androiddeployqt_input"))
+ return artifact.filePath();
+ }
+ return {};
+ }
+
+ if (role == Android::Constants::AndroidSoLibPath) {
+ QStringList ret{m_qbsProductData.buildDirectory()};
+ for (const auto &artifact : m_qbsProductData.generatedArtifacts()) {
+ if (artifact.fileTags().contains("dynamiclibrary")) {
+ ret << QFileInfo(artifact.filePath()).path();
+ qDebug() << artifact.properties().toString();
+ }
+ }
+ ret.removeDuplicates();
+ qDebug() << ret;
+ return ret;
+ }
+
+ if (role == Android::Constants::AndroidManifest) {
+ for (const auto &artifact : m_qbsProductData.generatedArtifacts()) {
+ if (artifact.fileTags().contains("android.manifest_final"))
+ return artifact.filePath();
+ }
+ return {};
+ }
+
+ if (role == Android::Constants::AndroidApk) {
+// qDebug() << m_qbsProductData.name() << m_qbsProductData.targetExecutable() << m_qbsProductData.properties();
+// for (const auto &artifact : m_qbsProductData.installableArtifacts()) {
+// qDebug() << artifact.fileTags() << artifact.filePath();
+// }
+// for (const auto &artifact : m_qbsProductData.generatedArtifacts()) {
+// qDebug() << artifact.fileTags() << artifact.filePath();
+// }
+ return m_qbsProductData.targetExecutable();
+ }
+
+ return {};
+}
+
// --------------------------------------------------------------------
// QbsProjectNode:
// --------------------------------------------------------------------
diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h
index db1a7b0ef1..622829c976 100644
--- a/src/plugins/qbsprojectmanager/qbsnodes.h
+++ b/src/plugins/qbsprojectmanager/qbsnodes.h
@@ -75,6 +75,7 @@ public:
QString buildKey() const override;
const qbs::ProductData qbsProductData() const { return m_qbsProductData; }
+ QVariant data(Core::Id role) const override;
private:
const qbs::ProductData m_qbsProductData;
diff --git a/src/shared/qbs b/src/shared/qbs
-Subproject 1301eb87fd40d200310365f7553ab4b901a855d
+Subproject 5d1e992f95208831ccbdf01055f19537fb1f8ba