diff options
author | BogDan Vatra <bogdan@kde.org> | 2019-04-03 18:10:35 +0200 |
---|---|---|
committer | BogDan Vatra <bogdan@kdab.com> | 2019-04-26 06:37:00 +0000 |
commit | 57c48630a8c54792937530571765aeee76061998 (patch) | |
tree | 0444c327b38d9751ea6a640e0edb87264051782d | |
parent | f8202239d6c43f7904b0fd1505006fc767c92f9a (diff) | |
download | qt-creator-57c48630a8c54792937530571765aeee76061998.tar.gz |
Android: Add proper QBS support
Now we can use QtCreator to build, deploy, run & debug QBS projects.
[ChangeLog][Android][QBS] Add Android support for QBS projects.
Fixes: QTCREATORBUG-15573
Fixes: QTCREATORBUG-19880
Fixes: QTCREATORBUG-22182
Change-Id: I08b153a44dcf7ca178689c1c30fa2201c4cc0dbb
Reviewed-by: hjk <hjk@qt.io>
-rw-r--r-- | src/plugins/android/androidconfigurations.cpp | 14 | ||||
-rw-r--r-- | src/plugins/android/androidconstants.h | 7 | ||||
-rw-r--r-- | src/plugins/android/androiddebugsupport.cpp | 2 | ||||
-rw-r--r-- | src/plugins/android/androiddeployqtstep.cpp | 95 | ||||
-rw-r--r-- | src/plugins/android/androidmanager.cpp | 8 | ||||
-rw-r--r-- | src/plugins/android/androidmanager.h | 1 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp | 214 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsnodes.cpp | 49 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsnodes.h | 1 | ||||
m--------- | src/shared/qbs | 0 |
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 |