diff options
Diffstat (limited to 'src/plugins/qbsprojectmanager')
30 files changed, 508 insertions, 818 deletions
diff --git a/src/plugins/qbsprojectmanager/CMakeLists.txt b/src/plugins/qbsprojectmanager/CMakeLists.txt new file mode 100644 index 00000000000..e02a516f1a9 --- /dev/null +++ b/src/plugins/qbsprojectmanager/CMakeLists.txt @@ -0,0 +1,38 @@ +find_package(Qbs) + +add_qtc_plugin(QbsProjectManager + CONDITION TARGET Qbs::QbsCore + DEPENDS Qbs::QbsCore Qt5::Widgets qmljs + DEFINES + QBS_INSTALL_DIR="${QBS_INSTALL_DIR}" + IDE_LIBRARY_BASENAME="${IDE_LIBRARY_BASE_PATH}" + PLUGIN_DEPENDS Core ProjectExplorer CppTools QtSupport QmlJSTools + SOURCES + customqbspropertiesdialog.cpp customqbspropertiesdialog.h customqbspropertiesdialog.ui + defaultpropertyprovider.cpp defaultpropertyprovider.h + propertyprovider.h + qbsbuildconfiguration.cpp qbsbuildconfiguration.h + qbsbuildstep.cpp qbsbuildstep.h + qbsbuildstepconfigwidget.ui + qbscleanstep.cpp qbscleanstep.h + qbscleanstepconfigwidget.ui + qbsinstallstep.cpp qbsinstallstep.h + qbsinstallstepconfigwidget.ui + qbskitinformation.cpp qbskitinformation.h + qbslogsink.cpp qbslogsink.h + qbsnodes.cpp qbsnodes.h + qbsnodetreebuilder.cpp qbsnodetreebuilder.h + qbsparser.cpp qbsparser.h + qbspmlogging.cpp qbspmlogging.h + qbsprofilessettingspage.cpp qbsprofilessettingspage.h + qbsprofilessettingswidget.ui + qbsproject.cpp qbsproject.h + qbsprojectimporter.cpp qbsprojectimporter.h + qbsprojectmanager.cpp qbsprojectmanager.h qbsprojectmanager.qrc + qbsprojectmanager_global.h + qbsprojectmanagerconstants.h + qbsprojectmanagerplugin.cpp qbsprojectmanagerplugin.h + qbsprojectmanagersettings.cpp qbsprojectmanagersettings.h + qbsprojectparser.cpp qbsprojectparser.h + qbsrunconfiguration.cpp qbsrunconfiguration.h +) diff --git a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp index a014d7a758b..1444c3d98f7 100644 --- a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp +++ b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp @@ -29,18 +29,21 @@ #include "qbsprojectmanagerconstants.h" #include <coreplugin/messagemanager.h> +#include <baremetal/baremetalconstants.h> #include <projectexplorer/abi.h> #include <projectexplorer/gcctoolchain.h> #include <projectexplorer/kit.h> #include <projectexplorer/kitinformation.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/msvctoolchain.h> #include <utils/hostosinfo.h> #include <utils/qtcassert.h> #include <qbs.h> +#include <android/androidconstants.h> #include <ios/iosconstants.h> #include <winrt/winrtconstants.h> @@ -76,7 +79,7 @@ static QString extractToolchainPrefix(QString *compilerName) static QString targetPlatform(const ProjectExplorer::Abi &abi, const ProjectExplorer::Kit *k) { - const Core::Id device = ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(k); + const Core::Id device = ProjectExplorer::DeviceTypeKitAspect::deviceTypeId(k); switch (abi.os()) { case ProjectExplorer::Abi::WindowsOS: return QLatin1String("windows"); @@ -122,14 +125,26 @@ 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::CLANG_CL_TOOLCHAIN_TYPEID) { + list << QLatin1String("clang-cl") << QLatin1String("msvc"); + } else if (tc->typeId() == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) { list << QLatin1String("msvc"); + } else if (tc->typeId() == BareMetal::Constants::IAREW_TOOLCHAIN_TYPEID) { + list << QLatin1String("iar"); + } else if (tc->typeId() == BareMetal::Constants::KEIL_TOOLCHAIN_TYPEID) { + list << QLatin1String("keil"); + } else if (tc->typeId() == BareMetal::Constants::SDCC_TOOLCHAIN_TYPEID) { + list << QLatin1String("sdcc"); + } return list; } @@ -138,6 +153,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) { @@ -195,7 +226,7 @@ QVariantMap DefaultPropertyProvider::properties(const ProjectExplorer::Kit *k, { QTC_ASSERT(k, return defaultData); QVariantMap data = autoGeneratedProperties(k, defaultData); - const QVariantMap customProperties = QbsKitInformation::properties(k); + const QVariantMap customProperties = QbsKitAspect::properties(k); for (QVariantMap::ConstIterator it = customProperties.constBegin(); it != customProperties.constEnd(); ++it) { data.insert(it.key(), it.value()); @@ -222,14 +253,14 @@ QVariantMap DefaultPropertyProvider::autoGeneratedProperties(const ProjectExplor { QVariantMap data = defaultData; - const QString sysroot = ProjectExplorer::SysRootKitInformation::sysRoot(k).toUserOutput(); + const QString sysroot = ProjectExplorer::SysRootKitAspect::sysRoot(k).toUserOutput(); if (!sysroot.isEmpty()) data.insert(QLatin1String(QBS_SYSROOT), sysroot); ProjectExplorer::ToolChain *tcC - = ProjectExplorer::ToolChainKitInformation::toolChain(k, ProjectExplorer::Constants::C_LANGUAGE_ID); + = ProjectExplorer::ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::C_LANGUAGE_ID); ProjectExplorer::ToolChain *tcCxx - = ProjectExplorer::ToolChainKitInformation::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID); + = ProjectExplorer::ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID); if (!tcC && !tcCxx) return data; @@ -241,101 +272,119 @@ 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::FilePath cCompilerPath; + if (tcC) + cCompilerPath = tcC->compilerCommand(); + + Utils::FilePath 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("clang-cl"))) { 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()); + const auto clangClToolchain = + static_cast<ProjectExplorer::Internal::ClangClToolChain *>(mainTc); + data.insert(QLatin1String(CPP_VCVARSALLPATH), clangClToolchain->varsBat()); + } else if (toolchain.contains(QLatin1String("msvc"))) { + data.insert(QLatin1String(CPP_COMPILERNAME), mainCompilerName); + } 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/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index 43ac1608f6e..f3fd3d9f569 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -25,7 +25,6 @@ #include "qbsbuildconfiguration.h" -#include "qbsbuildconfigurationwidget.h" #include "qbsbuildstep.h" #include "qbscleanstep.h" #include "qbsinstallstep.h" @@ -34,7 +33,6 @@ #include "qbsprojectmanagersettings.h" #include <coreplugin/documentmanager.h> -#include <coreplugin/icore.h> #include <projectexplorer/buildinfo.h> #include <projectexplorer/buildsteplist.h> @@ -54,7 +52,6 @@ #include <utils/qtcprocess.h> #include <QCoreApplication> -#include <QInputDialog> using namespace ProjectExplorer; using namespace Utils; @@ -62,17 +59,15 @@ using namespace Utils; namespace QbsProjectManager { namespace Internal { -static QString configNameKey() { return QStringLiteral("Qbs.configName"); } - -static FileName defaultBuildDirectory(const QString &projectFilePath, const Kit *k, +static FilePath defaultBuildDirectory(const QString &projectFilePath, const Kit *k, const QString &bcName, BuildConfiguration::BuildType buildType) { const QString projectName = QFileInfo(projectFilePath).completeBaseName(); ProjectMacroExpander expander(projectFilePath, projectName, k, bcName, buildType); - QString projectDir = Project::projectDirectory(FileName::fromString(projectFilePath)).toString(); + QString projectDir = Project::projectDirectory(FilePath::fromString(projectFilePath)).toString(); QString buildPath = expander.expand(ProjectExplorerPlugin::buildDirectoryTemplate()); - return FileName::fromString(FileUtils::resolvePath(projectDir, buildPath)); + return FilePath::fromString(FileUtils::resolvePath(projectDir, buildPath)); } // --------------------------------------------------------------------------- @@ -82,6 +77,15 @@ static FileName defaultBuildDirectory(const QString &projectFilePath, const Kit QbsBuildConfiguration::QbsBuildConfiguration(Target *target, Core::Id id) : BuildConfiguration(target, id) { + setConfigWidgetHasFrame(true); + + m_configurationName = addAspect<BaseStringAspect>(); + m_configurationName->setLabelText(tr("Configuration name:")); + m_configurationName->setSettingsKey("Qbs.configName"); + m_configurationName->setDisplayStyle(BaseStringAspect::LineEditDisplay); + connect(m_configurationName, &BaseStringAspect::changed, + this, &BuildConfiguration::buildDirectoryChanged); + connect(project(), &Project::parsingStarted, this, &BuildConfiguration::enabledChanged); connect(project(), &Project::parsingFinished, this, &BuildConfiguration::enabledChanged); } @@ -96,7 +100,7 @@ void QbsBuildConfiguration::initialize(const BuildInfo &info) ? QLatin1String(Constants::QBS_VARIANT_DEBUG) : QLatin1String(Constants::QBS_VARIANT_RELEASE)); - Utils::FileName buildDir = info.buildDirectory; + Utils::FilePath buildDir = info.buildDirectory; if (buildDir.isEmpty()) buildDir = defaultBuildDirectory(target()->project()->projectFilePath().toString(), target()->kit(), info.displayName, info.buildType); @@ -109,7 +113,8 @@ void QbsBuildConfiguration::initialize(const BuildInfo &info) configName = "qtc_" + target()->kit()->fileSystemFriendlyName() + '_' + Utils::FileUtils::fileSystemFriendlyName(info.displayName); } - setConfigurationName(configName); + + m_configurationName->setValue(configName); BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); auto bs = new QbsBuildStep(buildSteps); @@ -121,7 +126,6 @@ void QbsBuildConfiguration::initialize(const BuildInfo &info) BuildStepList *cleanSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); cleanSteps->appendStep(new QbsCleanStep(cleanSteps)); - connect(bs, &QbsBuildStep::qbsConfigurationChanged, this, &QbsBuildConfiguration::qbsConfigurationChanged); emit qbsConfigurationChanged(); } @@ -130,36 +134,16 @@ bool QbsBuildConfiguration::fromMap(const QVariantMap &map) if (!BuildConfiguration::fromMap(map)) return false; - m_configurationName = map.value(configNameKey()).toString(); - if (m_configurationName.isEmpty()) { // pre-4.4 backwards compatibility + if (m_configurationName->value().isEmpty()) { // pre-4.4 backwards compatibility const QString profileName = QbsManager::profileForKit(target()->kit()); const QString buildVariant = qbsConfiguration() .value(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY)).toString(); - m_configurationName = profileName + QLatin1Char('-') + buildVariant; - } - BuildStepList *bsl = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - // Fix up the existing build steps: - for (int i = 0; i < bsl->count(); ++i) { - auto bs = qobject_cast<QbsBuildStep *>(bsl->at(i)); - if (bs) - connect(bs, &QbsBuildStep::qbsConfigurationChanged, this, &QbsBuildConfiguration::qbsConfigurationChanged); + m_configurationName->setValue(profileName + '-' + buildVariant); } return true; } -QVariantMap QbsBuildConfiguration::toMap() const -{ - QVariantMap map = BuildConfiguration::toMap(); - map.insert(configNameKey(), m_configurationName); - return map; -} - -NamedWidget *QbsBuildConfiguration::createConfigWidget() -{ - return new QbsBuildConfigurationWidget(this); -} - QbsBuildStep *QbsBuildConfiguration::qbsStep() const { return stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD)->firstOfType<QbsBuildStep>(); @@ -236,22 +220,9 @@ QStringList QbsBuildConfiguration::products() const return m_products; } -void QbsBuildConfiguration::emitBuildTypeChanged() -{ - emit buildTypeChanged(); -} - -void QbsBuildConfiguration::setConfigurationName(const QString &configName) -{ - if (m_configurationName == configName) - return; - m_configurationName = configName; - emit buildDirectoryChanged(); -} - QString QbsBuildConfiguration::configurationName() const { - return m_configurationName; + return m_configurationName->value(); } class StepProxy @@ -312,7 +283,7 @@ public: return m_qbsBuildStep ? m_qbsBuildStep->maxJobs() : 0; } - Utils::FileName installRoot() const { + Utils::FilePath installRoot() const { const QbsBuildStep *bs = nullptr; if (m_qbsBuildStep) { bs = m_qbsBuildStep; @@ -322,7 +293,7 @@ public: } if (bs && bs->hasCustomInstallRoot()) return bs->installRoot(); - return Utils::FileName(); + return Utils::FilePath(); } private: @@ -333,60 +304,53 @@ private: QString QbsBuildConfiguration::equivalentCommandLine(const BuildStep *buildStep) const { - QString commandLine; + CommandLine commandLine; const QString qbsInstallDir = QString::fromLocal8Bit(qgetenv("QBS_INSTALL_DIR")); - const QString qbsFilePath = Utils::HostOsInfo::withExecutableSuffix(!qbsInstallDir.isEmpty() + const QString qbsFilePath = HostOsInfo::withExecutableSuffix(!qbsInstallDir.isEmpty() ? qbsInstallDir + QLatin1String("/bin/qbs") : QCoreApplication::applicationDirPath() + QLatin1String("/qbs")); - Utils::QtcProcess::addArg(&commandLine, QDir::toNativeSeparators(qbsFilePath)); + commandLine.addArg(QDir::toNativeSeparators(qbsFilePath)); const StepProxy stepProxy(buildStep); - Utils::QtcProcess::addArg(&commandLine, stepProxy.command()); + commandLine.addArg(stepProxy.command()); const QString buildDir = buildDirectory().toUserOutput(); - Utils::QtcProcess::addArgs(&commandLine, QStringList({"-d", buildDir})); - Utils::QtcProcess::addArgs(&commandLine, QStringList("-f") - << buildStep->project()->projectFilePath().toUserOutput()); + commandLine.addArgs({"-d", buildDir}); + commandLine.addArgs({"-f", buildStep->project()->projectFilePath().toUserOutput()}); if (QbsProjectManagerSettings::useCreatorSettingsDirForQbs()) { - Utils::QtcProcess::addArgs(&commandLine, QStringList({"--settings-dir", - QDir::toNativeSeparators(QbsProjectManagerSettings::qbsSettingsBaseDir())})); + commandLine.addArgs({"--settings-dir", + QDir::toNativeSeparators(QbsProjectManagerSettings::qbsSettingsBaseDir())}); } if (stepProxy.dryRun()) - Utils::QtcProcess::addArg(&commandLine, QLatin1String("--dry-run")); + commandLine.addArg("--dry-run"); if (stepProxy.keepGoing()) - Utils::QtcProcess::addArg(&commandLine, QLatin1String("--keep-going")); + commandLine.addArg("--keep-going"); if (stepProxy.forceProbeExecution()) - Utils::QtcProcess::addArg(&commandLine, QLatin1String("--force-probe-execution")); + commandLine.addArg("--force-probe-execution"); if (stepProxy.showCommandLines()) - Utils::QtcProcess::addArgs(&commandLine, QStringList({"--command-echo-mode", - "command-line"})); + commandLine.addArgs({"--command-echo-mode", "command-line"}); if (stepProxy.noInstall()) - Utils::QtcProcess::addArg(&commandLine, QLatin1String("--no-install")); + commandLine.addArg("--no-install"); if (stepProxy.noBuild()) - Utils::QtcProcess::addArg(&commandLine, QLatin1String("--no-build")); + commandLine.addArg("--no-build"); if (stepProxy.cleanInstallRoot()) - Utils::QtcProcess::addArg(&commandLine, QLatin1String("--clean-install-root")); + commandLine.addArg("--clean-install-root"); const int jobCount = stepProxy.jobCount(); - if (jobCount > 0) { - Utils::QtcProcess::addArgs(&commandLine, QStringList({"--jobs", - QString::number(jobCount)})); - } + if (jobCount > 0) + commandLine.addArgs({"--jobs", QString::number(jobCount)}); + const QString profileName = QbsManager::profileForKit(buildStep->target()->kit()); const QString buildVariant = qbsConfiguration() .value(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY)).toString(); - Utils::QtcProcess::addArg(&commandLine, QLatin1String("config:") + configurationName()); - Utils::QtcProcess::addArg(&commandLine, QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY) - + QLatin1Char(':') + buildVariant); - const Utils::FileName installRoot = stepProxy.installRoot(); + commandLine.addArg("config:" + configurationName()); + commandLine.addArg(QString(Constants::QBS_CONFIG_VARIANT_KEY) + ':' + buildVariant); + const FilePath installRoot = stepProxy.installRoot(); if (!installRoot.isEmpty()) { - Utils::QtcProcess::addArg(&commandLine, QLatin1String(Constants::QBS_INSTALL_ROOT_KEY) - + QLatin1Char(':') + installRoot.toUserOutput()); - if (qobject_cast<const QbsInstallStep *>(buildStep)) { - Utils::QtcProcess::addArgs(&commandLine, QStringList({ QLatin1String("--installRoot"), - installRoot.toUserOutput() } )); - } + commandLine.addArg(QString(Constants::QBS_INSTALL_ROOT_KEY) + ':' + installRoot.toUserOutput()); + if (qobject_cast<const QbsInstallStep *>(buildStep)) + commandLine.addArgs({"--installRoot", installRoot.toUserOutput()}); } - Utils::QtcProcess::addArg(&commandLine, QLatin1String("profile:") + profileName); + commandLine.addArg("profile:" + profileName); - return commandLine; + return commandLine.arguments(); } // --------------------------------------------------------------------------- @@ -398,10 +362,10 @@ QbsBuildConfigurationFactory::QbsBuildConfigurationFactory() registerBuildConfiguration<QbsBuildConfiguration>(Constants::QBS_BC_ID); setSupportedProjectType(Constants::PROJECT_ID); setSupportedProjectMimeTypeName(Constants::MIME_TYPE); - setIssueReporter([](Kit *k, const QString &projectPath, const QString &buildDir) -> QList<Task> { - const QtSupport::BaseQtVersion * const version = QtSupport::QtKitInformation::qtVersion(k); + setIssueReporter([](Kit *k, const QString &projectPath, const QString &buildDir) -> Tasks { + const QtSupport::BaseQtVersion * const version = QtSupport::QtKitAspect::qtVersion(k); return version ? version->reportIssues(projectPath, buildDir) - : QList<ProjectExplorer::Task>(); + : Tasks(); }); } diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h index 1db60592522..f34e552a40b 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h @@ -37,7 +37,6 @@ namespace ProjectExplorer { class BuildStep; } namespace QbsProjectManager { namespace Internal { -class QbsBuildConfigurationWidget; class QbsBuildStep; class QbsProject; @@ -50,7 +49,6 @@ class QbsBuildConfiguration : public ProjectExplorer::BuildConfiguration public: void initialize(const ProjectExplorer::BuildInfo &info) override; - ProjectExplorer::NamedWidget *createConfigWidget() override; QbsBuildStep *qbsStep() const; QVariantMap qbsConfiguration() const; @@ -71,9 +69,6 @@ public: void setProducts(const QStringList &products); QStringList products() const; - void emitBuildTypeChanged(); - - void setConfigurationName(const QString &configName); QString configurationName() const; QString equivalentCommandLine(const ProjectExplorer::BuildStep *buildStep) const; @@ -83,16 +78,11 @@ signals: private: bool fromMap(const QVariantMap &map) override; - QVariantMap toMap() const override; - bool m_isParsing = true; - bool m_parsingError = false; QStringList m_changedFiles; QStringList m_activeFileTags; QStringList m_products; - QString m_configurationName; - - friend class QbsBuildConfigurationWidget; + ProjectExplorer::BaseStringAspect *m_configurationName; }; class QbsBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationFactory diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.cpp deleted file mode 100644 index 057280a21a8..00000000000 --- a/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** 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 "qbsbuildconfigurationwidget.h" - -#include "qbsbuildconfiguration.h" - -#include <projectexplorer/target.h> -#include <projectexplorer/project.h> -#include <utils/detailswidget.h> -#include <utils/pathchooser.h> - -#include <QGridLayout> -#include <QLabel> -#include <QLineEdit> -#include <QWidget> - -namespace QbsProjectManager { -namespace Internal { - -QbsBuildConfigurationWidget::QbsBuildConfigurationWidget(QbsProjectManager::Internal::QbsBuildConfiguration *bc) : - m_buildConfiguration(bc), - m_ignoreChange(false) -{ - connect(bc, &ProjectExplorer::BuildConfiguration::buildDirectoryChanged, - this, &QbsBuildConfigurationWidget::buildDirectoryChanged); - connect(bc, &ProjectExplorer::BuildConfiguration::environmentChanged, - this, &QbsBuildConfigurationWidget::environmentHasChanged); - - auto vbox = new QVBoxLayout(this); - vbox->setMargin(0); - auto container = new Utils::DetailsWidget(this); - container->setState(Utils::DetailsWidget::NoSummary); - vbox->addWidget(container); - - QWidget *details = new QWidget(container); - container->setWidget(details); - - auto layout = new QGridLayout(details); - layout->setMargin(0); - layout->addWidget(new QLabel(tr("Build directory:")), 0, 0); - - m_buildDirChooser = new Utils::PathChooser; - m_buildDirChooser->setExpectedKind(Utils::PathChooser::Directory); - m_buildDirChooser->setBaseFileName(bc->target()->project()->projectDirectory()); - m_buildDirChooser->setEnvironment(bc->environment()); - layout->addWidget(m_buildDirChooser, 0, 1); - layout->addWidget(new QLabel(tr("Configuration name:")), 1, 0); - m_configNameEdit = new QLineEdit; - m_configNameEdit->setText(m_buildConfiguration->configurationName()); - layout->addWidget(m_configNameEdit, 1, 1); - - connect(m_buildDirChooser, &Utils::PathChooser::rawPathChanged, - this, &QbsBuildConfigurationWidget::buildDirEdited); - connect(m_configNameEdit, &QLineEdit::textEdited, - this, &QbsBuildConfigurationWidget::configNameEdited); - - buildDirectoryChanged(); -} - -void QbsBuildConfigurationWidget::buildDirEdited() -{ - m_ignoreChange = true; - m_buildConfiguration->setBuildDirectory(m_buildDirChooser->fileName()); -} - -void QbsBuildConfigurationWidget::configNameEdited() -{ - m_ignoreChange = true; - m_buildConfiguration->setConfigurationName(m_configNameEdit->text()); -} - -void QbsBuildConfigurationWidget::buildDirectoryChanged() -{ - if (m_ignoreChange) - return; - - m_buildDirChooser->setPath(m_buildConfiguration->rawBuildDirectory().toString()); -} - -void QbsBuildConfigurationWidget::environmentHasChanged() -{ - m_buildDirChooser->setEnvironment(m_buildConfiguration->environment()); -} - -} // namespace Internal -} // namespace QbsProjectManager diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.h b/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.h deleted file mode 100644 index 48ffaa5fcc1..00000000000 --- a/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.h +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** 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 <projectexplorer/namedwidget.h> - -namespace Utils { -class DetailsWidget; -class PathChooser; -} // namespace Utils - -QT_BEGIN_NAMESPACE -class QLineEdit; -QT_END_NAMESPACE - -namespace QbsProjectManager { -namespace Internal { -class QbsBuildConfiguration; - -class QbsBuildConfigurationWidget : public ProjectExplorer::NamedWidget -{ - Q_OBJECT - -public: - QbsBuildConfigurationWidget(Internal::QbsBuildConfiguration *bc); - -private: - void buildDirEdited(); - void configNameEdited(); - - // Changes triggered from creator - void buildDirectoryChanged(); - void environmentHasChanged(); - -private: - Internal::QbsBuildConfiguration *m_buildConfiguration; - Utils::PathChooser *m_buildDirChooser; - QLineEdit *m_configNameEdit; - bool m_ignoreChange; -}; - -} // namespace Internal -} // namespace QbsProjectManager diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 45eb7535ce4..da09f51c050 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -128,6 +128,11 @@ QbsBuildStep::QbsBuildStep(ProjectExplorer::BuildStepList *bsl) : setDisplayName(tr("Qbs Build")); setQbsConfiguration(QVariantMap()); + auto qbsBuildConfig = qobject_cast<QbsBuildConfiguration *>(buildConfiguration()); + QTC_CHECK(qbsBuildConfig); + connect(this, &QbsBuildStep::qbsConfigurationChanged, + qbsBuildConfig, &QbsBuildConfiguration::qbsConfigurationChanged); + // setQbsConfiguration(other->qbsConfiguration(PreserveVariables)); } @@ -222,9 +227,8 @@ void QbsBuildStep::setQbsConfiguration(const QVariantMap &config) if (tmp == m_qbsConfiguration) return; m_qbsConfiguration = tmp; - auto bc = static_cast<QbsBuildConfiguration *>(buildConfiguration()); - if (bc) - bc->emitBuildTypeChanged(); + if (ProjectExplorer::BuildConfiguration *bc = buildConfiguration()) + emit bc->buildTypeChanged(); emit qbsConfigurationChanged(); } @@ -253,17 +257,17 @@ bool QbsBuildStep::hasCustomInstallRoot() const return m_qbsConfiguration.contains(Constants::QBS_INSTALL_ROOT_KEY); } -Utils::FileName QbsBuildStep::installRoot(VariableHandling variableHandling) const +Utils::FilePath QbsBuildStep::installRoot(VariableHandling variableHandling) const { - Utils::FileName root = Utils::FileName::fromString(qbsConfiguration(variableHandling) - .value(Constants::QBS_INSTALL_ROOT_KEY).toString()); - if (root.isNull()) { - const QbsBuildConfiguration * const bc - = static_cast<QbsBuildConfiguration *>(buildConfiguration()); - root = bc->buildDirectory().appendPath(bc->configurationName()) - .appendPath(qbs::InstallOptions::defaultInstallRoot()); - } - return root; + const QString root = + qbsConfiguration(variableHandling).value(Constants::QBS_INSTALL_ROOT_KEY).toString(); + if (!root.isNull()) + return Utils::FilePath::fromString(root); + + const QbsBuildConfiguration * const bc + = static_cast<QbsBuildConfiguration *>(buildConfiguration()); + return bc->buildDirectory().pathAppended(bc->configurationName()) + .pathAppended(qbs::InstallOptions::defaultInstallRoot()); } int QbsBuildStep::maxJobs() const @@ -395,7 +399,7 @@ void QbsBuildStep::createTaskAndOutput(ProjectExplorer::Task::TaskType type, con const QString &file, int line) { ProjectExplorer::Task task = ProjectExplorer::Task(type, message, - Utils::FileName::fromString(file), line, + Utils::FilePath::fromString(file), line, ProjectExplorer::Constants::TASK_CATEGORY_COMPILE); emit addTask(task, 1); emit addOutput(message, OutputFormat::Stdout); @@ -412,9 +416,8 @@ void QbsBuildStep::setBuildVariant(const QString &variant) return; m_qbsConfiguration.insert(Constants::QBS_CONFIG_VARIANT_KEY, variant); emit qbsConfigurationChanged(); - auto bc = static_cast<QbsBuildConfiguration *>(buildConfiguration()); - if (bc) - bc->emitBuildTypeChanged(); + if (ProjectExplorer::BuildConfiguration *bc = buildConfiguration()) + emit bc->buildTypeChanged(); } QString QbsBuildStep::profile() const @@ -553,11 +556,11 @@ QbsBuildStepConfigWidget::QbsBuildStepConfigWidget(QbsBuildStep *step) : m_ui->qmlDebuggingWarningIcon->setPixmap(Utils::Icons::WARNING.pixmap()); connect(m_ui->buildVariantComboBox, - static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), + QOverload<int>::of(&QComboBox::currentIndexChanged), this, &QbsBuildStepConfigWidget::changeBuildVariant); connect(m_ui->keepGoingCheckBox, &QAbstractButton::toggled, this, &QbsBuildStepConfigWidget::changeKeepGoing); - connect(m_ui->jobSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), + connect(m_ui->jobSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &QbsBuildStepConfigWidget::changeJobCount); connect(m_ui->showCommandLinesCheckBox, &QCheckBox::toggled, this, &QbsBuildStepConfigWidget::changeShowCommandLines); @@ -573,8 +576,6 @@ QbsBuildStepConfigWidget::QbsBuildStepConfigWidget(QbsBuildStep *step) : &QbsBuildStepConfigWidget::changeForceProbes); connect(m_ui->qmlDebuggingLibraryCheckBox, &QAbstractButton::toggled, this, &QbsBuildStepConfigWidget::linkQmlDebuggingLibraryChecked); - connect(QtSupport::QtVersionManager::instance(), &QtSupport::QtVersionManager::dumpUpdatedFor, - this, &QbsBuildStepConfigWidget::updateQmlDebuggingOption); updateState(); } diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.h b/src/plugins/qbsprojectmanager/qbsbuildstep.h index 8c3622385d1..913bf61268e 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.h +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.h @@ -66,7 +66,7 @@ public: bool install() const; bool cleanInstallRoot() const; bool hasCustomInstallRoot() const; - Utils::FileName installRoot(VariableHandling variableHandling = ExpandVariables) const; + Utils::FilePath installRoot(VariableHandling variableHandling = ExpandVariables) const; int maxJobs() const; QString buildVariant() const; diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.cpp b/src/plugins/qbsprojectmanager/qbscleanstep.cpp index f648e14aee1..167299a0bb7 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.cpp +++ b/src/plugins/qbsprojectmanager/qbscleanstep.cpp @@ -170,7 +170,7 @@ void QbsCleanStep::updateState() void QbsCleanStep::createTaskAndOutput(ProjectExplorer::Task::TaskType type, const QString &message, const QString &file, int line) { ProjectExplorer::Task task = ProjectExplorer::Task(type, message, - Utils::FileName::fromString(file), line, + Utils::FilePath::fromString(file), line, ProjectExplorer::Constants::TASK_CATEGORY_COMPILE); emit addTask(task, 1); emit addOutput(message, OutputFormat::Stdout); diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp index c375c87cacd..ddfaadf8df2 100644 --- a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp @@ -198,7 +198,7 @@ void QbsInstallStep::createTaskAndOutput(ProjectExplorer::Task::TaskType type, const QString &message, const QString &file, int line) { ProjectExplorer::Task task = ProjectExplorer::Task(type, message, - Utils::FileName::fromString(file), line, + Utils::FilePath::fromString(file), line, ProjectExplorer::Constants::TASK_CATEGORY_COMPILE); emit addTask(task, 1); emit addOutput(message, OutputFormat::Stdout); diff --git a/src/plugins/qbsprojectmanager/qbskitinformation.cpp b/src/plugins/qbsprojectmanager/qbskitinformation.cpp index 95242e5e37a..53f3b9a1429 100644 --- a/src/plugins/qbsprojectmanager/qbskitinformation.cpp +++ b/src/plugins/qbsprojectmanager/qbskitinformation.cpp @@ -27,7 +27,6 @@ #include "customqbspropertiesdialog.h" -#include <projectexplorer/kitconfigwidget.h> #include <projectexplorer/kitmanager.h> #include <utils/elidinglabel.h> @@ -42,49 +41,44 @@ using namespace ProjectExplorer; namespace QbsProjectManager { namespace Internal { -class ConfigWidget final : public KitConfigWidget +class AspectWidget final : public KitAspectWidget { - Q_OBJECT + Q_DECLARE_TR_FUNCTIONS(QbsProjectManager::Internal::AspectWidget) public: - ConfigWidget(Kit *kit, const KitInformation *kitInfo) - : KitConfigWidget(kit, kitInfo), + AspectWidget(Kit *kit, const KitAspect *kitInfo) + : KitAspectWidget(kit, kitInfo), m_contentLabel(new Utils::ElidingLabel), m_changeButton(new QPushButton(tr("Change..."))) { - connect(m_changeButton, &QPushButton::clicked, this, &ConfigWidget::changeProperties); + connect(m_changeButton, &QPushButton::clicked, this, &AspectWidget::changeProperties); } private: - QString displayName() const override { return QbsKitInformation::displayName(); } void makeReadOnly() override { m_changeButton->setEnabled(false); } - void refresh() override { m_contentLabel->setText(QbsKitInformation::representation(kit())); } + void refresh() override { m_contentLabel->setText(QbsKitAspect::representation(kit())); } QWidget *mainWidget() const override { return m_contentLabel; } QWidget *buttonWidget() const override { return m_changeButton; } void changeProperties() { - CustomQbsPropertiesDialog dlg(QbsKitInformation::properties(kit())); + CustomQbsPropertiesDialog dlg(QbsKitAspect::properties(kit())); if (dlg.exec() == QDialog::Accepted) - QbsKitInformation::setProperties(kit(), dlg.properties()); + QbsKitAspect::setProperties(kit(), dlg.properties()); } QLabel * const m_contentLabel; QPushButton * const m_changeButton; }; -QbsKitInformation::QbsKitInformation() +QbsKitAspect::QbsKitAspect() { - setObjectName(QLatin1String("QbsKitInformation")); - setId(QbsKitInformation::id()); + setObjectName(QLatin1String("QbsKitAspect")); + setId(QbsKitAspect::id()); + setDisplayName(tr("Additional Qbs Profile Settings")); setPriority(22000); } -QString QbsKitInformation::displayName() -{ - return tr("Additional Qbs Profile Settings"); -} - -QString QbsKitInformation::representation(const Kit *kit) +QString QbsKitAspect::representation(const Kit *kit) { const QVariantMap props = properties(kit); QString repr; @@ -96,37 +90,34 @@ QString QbsKitInformation::representation(const Kit *kit) return repr; } -QVariantMap QbsKitInformation::properties(const Kit *kit) +QVariantMap QbsKitAspect::properties(const Kit *kit) { QTC_ASSERT(kit, return QVariantMap()); return kit->value(id()).toMap(); } -void QbsKitInformation::setProperties(Kit *kit, const QVariantMap &properties) +void QbsKitAspect::setProperties(Kit *kit, const QVariantMap &properties) { QTC_ASSERT(kit, return); kit->setValue(id(), properties); } -Core::Id QbsKitInformation::id() +Core::Id QbsKitAspect::id() { return "Qbs.KitInformation"; } -QVariant QbsKitInformation::defaultValue(const Kit *) const { return QString(); } -QList<Task> QbsKitInformation::validate(const Kit *) const { return QList<Task>(); } +Tasks QbsKitAspect::validate(const Kit *) const { return {}; } -KitInformation::ItemList QbsKitInformation::toUserOutput(const Kit *k) const +KitAspect::ItemList QbsKitAspect::toUserOutput(const Kit *k) const { return ItemList({qMakePair(displayName(), representation(k))}); } -KitConfigWidget *QbsKitInformation::createConfigWidget(Kit *k) const +KitAspectWidget *QbsKitAspect::createConfigWidget(Kit *k) const { - return new ConfigWidget(k, this); + return new AspectWidget(k, this); } } // namespace Internal } // namespace QbsProjectManager - -#include <qbskitinformation.moc> diff --git a/src/plugins/qbsprojectmanager/qbskitinformation.h b/src/plugins/qbsprojectmanager/qbskitinformation.h index ef5a5b93512..1113f2ce01d 100644 --- a/src/plugins/qbsprojectmanager/qbskitinformation.h +++ b/src/plugins/qbsprojectmanager/qbskitinformation.h @@ -30,14 +30,13 @@ namespace QbsProjectManager { namespace Internal { -class QbsKitInformation final : public ProjectExplorer::KitInformation +class QbsKitAspect final : public ProjectExplorer::KitAspect { Q_OBJECT public: - QbsKitInformation(); + QbsKitAspect(); - static QString displayName(); static QString representation(const ProjectExplorer::Kit *kit); static QVariantMap properties(const ProjectExplorer::Kit *kit); static void setProperties(ProjectExplorer::Kit *kit, const QVariantMap &properties); @@ -45,10 +44,9 @@ public: private: static Core::Id id(); - QVariant defaultValue(const ProjectExplorer::Kit *) const override; - QList<ProjectExplorer::Task> validate(const ProjectExplorer::Kit *) const override; + ProjectExplorer::Tasks validate(const ProjectExplorer::Kit *) const override; ItemList toUserOutput(const ProjectExplorer::Kit *) const override; - ProjectExplorer::KitConfigWidget *createConfigWidget(ProjectExplorer::Kit *) const override; + ProjectExplorer::KitAspectWidget *createConfigWidget(ProjectExplorer::Kit *) const override; }; } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbslogsink.cpp b/src/plugins/qbsprojectmanager/qbslogsink.cpp index c9a2f28d641..9e635c2958c 100644 --- a/src/plugins/qbsprojectmanager/qbslogsink.cpp +++ b/src/plugins/qbsprojectmanager/qbslogsink.cpp @@ -70,7 +70,7 @@ void QbsLogSink::doPrintWarning(const qbs::ErrorInfo &warning) foreach (const qbs::ErrorItem &item, warning.items()) emit newTask(Task(Task::Warning, item.description(), - Utils::FileName::fromString(item.codeLocation().filePath()), + Utils::FilePath::fromString(item.codeLocation().filePath()), item.codeLocation().line(), Constants::TASK_CATEGORY_BUILDSYSTEM)); } diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index 50b3957eca1..cbc6e597401 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> @@ -223,63 +224,19 @@ static bool supportsNodeAction(ProjectAction action, const Node *node) }; if (action == RemoveFile || action == Rename) { - if (node->nodeType() == ProjectExplorer::NodeType::File) + if (node->asFileNode()) return !Utils::contains(project->qbsProject().buildSystemFiles(), equalsNodeFilePath); } return false; } -// ---------------------------------------------------------------------- -// QbsFileNode: -// ---------------------------------------------------------------------- - -QbsFileNode::QbsFileNode(const Utils::FileName &filePath, - const ProjectExplorer::FileType fileType, - bool generated, - int line) : - ProjectExplorer::FileNode(filePath, fileType, generated, line) -{ } - -QString QbsFileNode::displayName() const -{ - int l = line(); - if (l < 0) - return ProjectExplorer::FileNode::displayName(); - return ProjectExplorer::FileNode::displayName() + QLatin1Char(':') + QString::number(l); -} - - -QbsFolderNode::QbsFolderNode(const Utils::FileName &folderPath, ProjectExplorer::NodeType nodeType, - const QString &displayName) - : ProjectExplorer::FolderNode(folderPath, nodeType, displayName) -{ -} - -bool QbsFolderNode::supportsAction(ProjectAction action, const Node *node) const -{ - return supportsNodeAction(action, node); -} - -// --------------------------------------------------------------------------- -// QbsBaseProjectNode: -// --------------------------------------------------------------------------- - -QbsBaseProjectNode::QbsBaseProjectNode(const Utils::FileName &path) : - ProjectExplorer::ProjectNode(path) -{ } - -bool QbsBaseProjectNode::showInSimpleTree() const -{ - return false; -} - // -------------------------------------------------------------------- // QbsGroupNode: // -------------------------------------------------------------------- QbsGroupNode::QbsGroupNode(const qbs::GroupData &grp, const QString &productPath) : - QbsBaseProjectNode(Utils::FileName()) + ProjectNode(Utils::FilePath()) { static QIcon groupIcon = QIcon(QString(Constants::QBS_GROUP_ICON)); setIcon(groupIcon); @@ -356,7 +313,7 @@ bool QbsGroupNode::renameFile(const QString &filePath, const QString &newFilePat FolderNode::AddNewInformation QbsGroupNode::addNewInformation(const QStringList &files, Node *context) const { - AddNewInformation info = QbsBaseProjectNode::addNewInformation(files, context); + AddNewInformation info = ProjectNode::addNewInformation(files, context); if (context != this) --info.priority; return info; @@ -367,16 +324,12 @@ FolderNode::AddNewInformation QbsGroupNode::addNewInformation(const QStringList // -------------------------------------------------------------------- QbsProductNode::QbsProductNode(const qbs::ProductData &prd) : - QbsBaseProjectNode(Utils::FileName::fromString(prd.location().filePath())), + ProjectNode(Utils::FilePath::fromString(prd.location().filePath())), m_qbsProductData(prd) { static QIcon productIcon = Core::FileIconProvider::directoryIcon(Constants::QBS_PRODUCT_OVERLAY_ICON); setIcon(productIcon); -} - -bool QbsProductNode::showInSimpleTree() const -{ - return true; + setIsProduct(); } bool QbsProductNode::supportsAction(ProjectAction action, const Node *node) const @@ -448,12 +401,47 @@ QString QbsProductNode::buildKey() const return QbsProject::uniqueProductName(m_qbsProductData); } +QVariant QbsProductNode::data(Core::Id role) const +{ + 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(); + } + } + ret.removeDuplicates(); + 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) + return m_qbsProductData.targetExecutable(); + + return {}; +} + // -------------------------------------------------------------------- // QbsProjectNode: // -------------------------------------------------------------------- -QbsProjectNode::QbsProjectNode(const Utils::FileName &projectDirectory) : - QbsBaseProjectNode(projectDirectory) +QbsProjectNode::QbsProjectNode(const Utils::FilePath &projectDirectory) : + ProjectNode(projectDirectory) { static QIcon projectIcon = Core::FileIconProvider::directoryIcon(ProjectExplorer::Constants::FILEOVERLAY_QT); setIcon(projectIcon); @@ -469,11 +457,6 @@ const qbs::Project QbsProjectNode::qbsProject() const return project()->qbsProject(); } -bool QbsProjectNode::showInSimpleTree() const -{ - return true; -} - void QbsProjectNode::setProjectData(const qbs::ProjectData &data) { m_projectData = data; diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h index cdf85b39ed4..3d8f90c3df4 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.h +++ b/src/plugins/qbsprojectmanager/qbsnodes.h @@ -35,59 +35,21 @@ namespace Internal { class QbsNodeTreeBuilder; class QbsProject; -// ---------------------------------------------------------------------- -// QbsFileNode: -// ---------------------------------------------------------------------- - -class QbsFileNode : public ProjectExplorer::FileNode -{ -public: - QbsFileNode(const Utils::FileName &filePath, const ProjectExplorer::FileType fileType, bool generated, - int line); - - QString displayName() const override; -}; - -class QbsFolderNode : public ProjectExplorer::FolderNode -{ -public: - QbsFolderNode(const Utils::FileName &folderPath, ProjectExplorer::NodeType nodeType, - const QString &displayName); - -private: - bool supportsAction(ProjectExplorer::ProjectAction action, const Node *node) const final; -}; - -// --------------------------------------------------------------------------- -// QbsBaseProjectNode: -// --------------------------------------------------------------------------- - -class QbsGroupNode; - -class QbsBaseProjectNode : public ProjectExplorer::ProjectNode -{ -public: - explicit QbsBaseProjectNode(const Utils::FileName &absoluteFilePath); - - bool showInSimpleTree() const override; -}; - // -------------------------------------------------------------------- // QbsGroupNode: // -------------------------------------------------------------------- -class QbsGroupNode : public QbsBaseProjectNode +class QbsGroupNode : public ProjectExplorer::ProjectNode { public: QbsGroupNode(const qbs::GroupData &grp, const QString &productPath); + bool showInSimpleTree() const final { return false; } bool supportsAction(ProjectExplorer::ProjectAction action, const Node *node) const final; bool addFiles(const QStringList &filePaths, QStringList *notAdded = nullptr) override; bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = nullptr) override; bool renameFile(const QString &filePath, const QString &newFilePath) override; - qbs::GroupData qbsGroupData() const { return m_qbsGroupData; } - private: AddNewInformation addNewInformation(const QStringList &files, Node *context) const override; @@ -99,12 +61,11 @@ private: // QbsProductNode: // -------------------------------------------------------------------- -class QbsProductNode : public QbsBaseProjectNode +class QbsProductNode : public ProjectExplorer::ProjectNode { public: explicit QbsProductNode(const qbs::ProductData &prd); - bool showInSimpleTree() const override; bool supportsAction(ProjectExplorer::ProjectAction action, const Node *node) const final; bool addFiles(const QStringList &filePaths, QStringList *notAdded = nullptr) override; bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = nullptr) override; @@ -114,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; @@ -123,16 +85,15 @@ private: // QbsProjectNode: // --------------------------------------------------------------------------- -class QbsProjectNode : public QbsBaseProjectNode +class QbsProjectNode : public ProjectExplorer::ProjectNode { public: - explicit QbsProjectNode(const Utils::FileName &projectDirectory); + explicit QbsProjectNode(const Utils::FilePath &projectDirectory); virtual QbsProject *project() const; const qbs::Project qbsProject() const; const qbs::ProjectData qbsProjectData() const { return m_projectData; } - bool showInSimpleTree() const override; void setProjectData(const qbs::ProjectData &data); // FIXME: Needed? private: diff --git a/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp b/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp index 022d1191905..f7f143b0253 100644 --- a/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp @@ -30,36 +30,43 @@ #include <utils/algorithm.h> #include <utils/qtcassert.h> -namespace { +using namespace ProjectExplorer; +using namespace Utils; -ProjectExplorer::FileType fileType(const qbs::ArtifactData &artifact) -{ - QTC_ASSERT(artifact.isValid(), return ProjectExplorer::FileType::Unknown); +namespace QbsProjectManager { +namespace Internal { + +namespace { - if (artifact.fileTags().contains("c") - || artifact.fileTags().contains("cpp") - || artifact.fileTags().contains("objc") - || artifact.fileTags().contains("objcpp")) { - return ProjectExplorer::FileType::Source; +FileType fileType(const qbs::ArtifactData &artifact) +{ + QTC_ASSERT(artifact.isValid(), return FileType::Unknown); + + const QStringList fileTags = artifact.fileTags(); + if (fileTags.contains("c") + || fileTags.contains("cpp") + || fileTags.contains("objc") + || fileTags.contains("objcpp")) { + return FileType::Source; } - if (artifact.fileTags().contains("hpp")) - return ProjectExplorer::FileType::Header; - if (artifact.fileTags().contains("qrc")) - return ProjectExplorer::FileType::Resource; - if (artifact.fileTags().contains("ui")) - return ProjectExplorer::FileType::Form; - if (artifact.fileTags().contains("scxml")) - return ProjectExplorer::FileType::StateChart; - if (artifact.fileTags().contains("qt.qml.qml")) - return ProjectExplorer::FileType::QML; - return ProjectExplorer::FileType::Unknown; + if (fileTags.contains("hpp")) + return FileType::Header; + if (fileTags.contains("qrc")) + return FileType::Resource; + if (fileTags.contains("ui")) + return FileType::Form; + if (fileTags.contains("scxml")) + return FileType::StateChart; + if (fileTags.contains("qt.qml.qml")) + return FileType::QML; + return FileType::Unknown; } -void setupArtifacts(ProjectExplorer::FolderNode *root, const QList<qbs::ArtifactData> &artifacts) +void setupArtifacts(FolderNode *root, const QList<qbs::ArtifactData> &artifacts) { for (const qbs::ArtifactData &ad : artifacts) { - const Utils::FileName path = Utils::FileName::fromString(ad.filePath()); - const ProjectExplorer::FileType type = fileType(ad); + const FilePath path = FilePath::fromString(ad.filePath()); + const FileType type = fileType(ad); const bool isGenerated = ad.isGenerated(); // A list of human-readable file types that we can reasonably expect @@ -73,51 +80,48 @@ void setupArtifacts(ProjectExplorer::FolderNode *root, const QList<qbs::Artifact QLatin1String("linkerscript"), QLatin1String("qrc"), QLatin1String("java.java") }; - auto node = std::make_unique<ProjectExplorer::FileNode>(path, type, isGenerated); + auto node = std::make_unique<FileNode>(path, type); + node->setIsGenerated(isGenerated); node->setListInProject(!isGenerated || ad.fileTags().toSet().intersects(sourceTags)); root->addNestedNode(std::move(node)); } root->compress(); } -std::unique_ptr<QbsProjectManager::Internal::QbsGroupNode> +std::unique_ptr<QbsGroupNode> buildGroupNodeTree(const qbs::GroupData &grp, const QString &productPath, bool productIsEnabled) { QTC_ASSERT(grp.isValid(), return nullptr); - auto result = std::make_unique<QbsProjectManager::Internal::QbsGroupNode>(grp, productPath); + auto fileNode = std::make_unique<FileNode>(FilePath::fromString(grp.location().filePath()), + FileType::Project); + fileNode->setLine(grp.location().line()); + + auto result = std::make_unique<QbsGroupNode>(grp, productPath); result->setEnabled(productIsEnabled && grp.isEnabled()); result->setAbsoluteFilePathAndLine( - Utils::FileName::fromString(grp.location().filePath()).parentDir(), -1); + FilePath::fromString(grp.location().filePath()).parentDir(), -1); result->setDisplayName(grp.name()); - result->addNode(std::make_unique<QbsProjectManager::Internal::QbsFileNode>( - Utils::FileName::fromString(grp.location().filePath()), - ProjectExplorer::FileType::Project, false, - grp.location().line())); + result->addNode(std::move(fileNode)); - ::setupArtifacts(result.get(), grp.allSourceArtifacts()); + setupArtifacts(result.get(), grp.allSourceArtifacts()); return result; } -void setupQbsProductData(QbsProjectManager::Internal::QbsProductNode *node, - const qbs::ProductData &prd) +void setupQbsProductData(QbsProductNode *node, const qbs::ProductData &prd) { - using namespace QbsProjectManager::Internal; + auto fileNode = std::make_unique<FileNode>(FilePath::fromString(prd.location().filePath()), + FileType::Project); + fileNode->setLine(prd.location().line()); node->setEnabled(prd.isEnabled()); - node->setDisplayName(prd.fullDisplayName()); - node->setAbsoluteFilePathAndLine(Utils::FileName::fromString(prd.location().filePath()).parentDir(), -1); - const QString &productPath = QFileInfo(prd.location().filePath()).absolutePath(); - - // Add QbsFileNode: - node->addNode(std::make_unique<QbsFileNode>(Utils::FileName::fromString(prd.location().filePath()), - ProjectExplorer::FileType::Project, false, - prd.location().line())); - + node->setAbsoluteFilePathAndLine(FilePath::fromString(prd.location().filePath()).parentDir(), -1); + node->addNode(std::move(fileNode)); + const QString &productPath = QFileInfo(prd.location().filePath()).absolutePath(); foreach (const qbs::GroupData &grp, prd.groups()) { if (grp.name() == prd.name() && grp.location() == prd.location()) { // Set implicit product group right onto this node: @@ -128,34 +132,31 @@ void setupQbsProductData(QbsProjectManager::Internal::QbsProductNode *node, } // Add "Generated Files" Node: - auto genFiles - = std::make_unique<ProjectExplorer::VirtualFolderNode>(node->filePath(), - ProjectExplorer::Node::DefaultProjectFilePriority - 10); + auto genFiles = std::make_unique<VirtualFolderNode>(FilePath::fromString(prd.buildDirectory())); genFiles->setDisplayName(QCoreApplication::translate("QbsProductNode", "Generated files")); setupArtifacts(genFiles.get(), prd.generatedArtifacts()); node->addNode(std::move(genFiles)); } -std::unique_ptr<QbsProjectManager::Internal::QbsProductNode> -buildProductNodeTree(const qbs::ProductData &prd) +std::unique_ptr<QbsProductNode> buildProductNodeTree(const qbs::ProductData &prd) { - auto result = std::make_unique<QbsProjectManager::Internal::QbsProductNode>(prd); + auto result = std::make_unique<QbsProductNode>(prd); setupQbsProductData(result.get(), prd); return result; } -void setupProjectNode(QbsProjectManager::Internal::QbsProjectNode *node, const qbs::ProjectData &prjData, +void setupProjectNode(QbsProjectNode *node, const qbs::ProjectData &prjData, const qbs::Project &qbsProject) { - using namespace QbsProjectManager::Internal; - node->addNode(std::make_unique<QbsFileNode>(Utils::FileName::fromString(prjData.location().filePath()), - ProjectExplorer::FileType::Project, false, - prjData.location().line())); + auto fileNode = std::make_unique<FileNode>(FilePath::fromString(prjData.location().filePath()), + FileType::Project); + fileNode->setLine(prjData.location().line()); + + node->addNode(std::move(fileNode)); foreach (const qbs::ProjectData &subData, prjData.subProjects()) { - auto subProject = - std::make_unique<QbsProjectManager::Internal::QbsProjectNode>( - Utils::FileName::fromString(subData.location().filePath()).parentDir()); + auto subProject = std::make_unique<QbsProjectNode>( + FilePath::fromString(subData.location().filePath()).parentDir()); setupProjectNode(subProject.get(), subData, qbsProject); node->addNode(std::move(subProject)); } @@ -202,9 +203,6 @@ QStringList unreferencedBuildSystemFiles(const qbs::Project &p) } // namespace -namespace QbsProjectManager { -namespace Internal { - std::unique_ptr<QbsRootProjectNode> QbsNodeTreeBuilder::buildTree(QbsProject *project) { if (!project->qbsProjectData().isValid()) @@ -212,17 +210,16 @@ std::unique_ptr<QbsRootProjectNode> QbsNodeTreeBuilder::buildTree(QbsProject *pr auto root = std::make_unique<QbsRootProjectNode>(project); setupProjectNode(root.get(), project->qbsProjectData(), project->qbsProject()); - auto buildSystemFiles - = std::make_unique<ProjectExplorer::FolderNode>(project->projectDirectory(), - ProjectExplorer::NodeType::Folder, - QCoreApplication::translate("QbsRootProjectNode", "Qbs files")); - Utils::FileName base = project->projectDirectory(); - const QStringList &files = unreferencedBuildSystemFiles(project->qbsProject()); + auto buildSystemFiles = std::make_unique<FolderNode>(project->projectDirectory()); + buildSystemFiles->setDisplayName(QCoreApplication::translate("QbsRootProjectNode", "Qbs files")); + + const FilePath base = project->projectDirectory(); + const QStringList files = unreferencedBuildSystemFiles(project->qbsProject()); for (const QString &f : files) { - const Utils::FileName filePath = Utils::FileName::fromString(f); + const FilePath filePath = FilePath::fromString(f); if (filePath.isChildOf(base)) - buildSystemFiles->addNestedNode(std::make_unique<ProjectExplorer::FileNode>(filePath, ProjectExplorer::FileType::Project, false)); + buildSystemFiles->addNestedNode(std::make_unique<FileNode>(filePath, FileType::Project)); } buildSystemFiles->compress(); root->addNode(std::move(buildSystemFiles)); diff --git a/src/plugins/qbsprojectmanager/qbsparser.cpp b/src/plugins/qbsprojectmanager/qbsparser.cpp index 8aa0ed7e962..d6b2339dbbf 100644 --- a/src/plugins/qbsprojectmanager/qbsparser.cpp +++ b/src/plugins/qbsprojectmanager/qbsparser.cpp @@ -52,7 +52,7 @@ void QbsParser::taskAdded(const ProjectExplorer::Task &task, int linkedLines, in QString filePath = task.file.toString(); if (!filePath.isEmpty()) - editable.file = Utils::FileName::fromUserInput(m_workingDirectory.absoluteFilePath(filePath)); + editable.file = Utils::FilePath::fromUserInput(m_workingDirectory.absoluteFilePath(filePath)); IOutputParser::taskAdded(editable, linkedLines, skipLines); } diff --git a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp index 418f30e2117..5a79d420624 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp +++ b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp @@ -152,7 +152,7 @@ void QbsProfilesSettingsWidget::refreshKitsList() m_ui.kitsComboBox->setCurrentIndex(0); displayCurrentProfile(); connect(m_ui.kitsComboBox, - static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), + QOverload<int>::of(&QComboBox::currentIndexChanged), this, &QbsProfilesSettingsWidget::displayCurrentProfile); } diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 94bcb5a988c..209e87b4bca 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -121,7 +121,7 @@ private: // QbsProject: // -------------------------------------------------------------------- -QbsProject::QbsProject(const FileName &fileName) : +QbsProject::QbsProject(const FilePath &fileName) : Project(Constants::MIME_TYPE, fileName, [this] { delayParsing(); }), m_cppCodeModelUpdater(new CppTools::CppProjectUpdater) { @@ -201,6 +201,11 @@ QVariant QbsProject::additionalData(Id id, const Target *target) const return Project::additionalData(id, target); } +ProjectExplorer::DeploymentKnowledge QbsProject::deploymentKnowledge() const +{ + return DeploymentKnowledge::Perfect; +} + QStringList QbsProject::filesGeneratedFrom(const QString &sourceFile) const { QStringList generated; @@ -464,6 +469,7 @@ void QbsProject::updateAfterParse() updateCppCodeModel(); updateQmlJsCodeModel(); emit fileListChanged(); + m_envCache.clear(); emit dataChanged(); } @@ -478,16 +484,16 @@ void QbsProject::updateProjectNodes() rebuildProjectTree(); } -FileName QbsProject::installRoot() +FilePath QbsProject::installRoot() { if (!activeTarget()) - return FileName(); + return FilePath(); const auto * const bc = qobject_cast<QbsBuildConfiguration *>(activeTarget()->activeBuildConfiguration()); if (!bc) - return FileName(); + return FilePath(); const QbsBuildStep * const buildStep = bc->qbsStep(); - return buildStep && buildStep->install() ? buildStep->installRoot() : FileName(); + return buildStep && buildStep->install() ? buildStep->installRoot() : FilePath(); } void QbsProject::handleQbsParsingDone(bool success) @@ -647,6 +653,7 @@ void QbsProject::updateAfterBuild() m_extraCompilersPending = false; updateCppCodeModel(); } + m_envCache.clear(); emit dataChanged(); } @@ -674,7 +681,7 @@ void QbsProject::generateErrors(const qbs::ErrorInfo &e) foreach (const qbs::ErrorItem &item, e.items()) TaskHub::addTask(Task::Error, item.description(), ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM, - FileName::fromString(item.codeLocation().filePath()), + FilePath::fromString(item.codeLocation().filePath()), item.codeLocation().line()); } @@ -693,7 +700,7 @@ void QbsProject::configureAsExampleProject(const QSet<Id> &platforms) }; foreach (Kit *k, kits) { const QtSupport::BaseQtVersion * const qtVersion - = QtSupport::QtKitInformation::qtVersion(k); + = QtSupport::QtKitAspect::qtVersion(k); if (!qtVersion || !qtVersionMatchesPlatform(qtVersion)) continue; if (auto factory = BuildConfigurationFactory::find(k, projectFilePath().toString())) @@ -756,11 +763,11 @@ void QbsProject::updateDocuments(const QSet<QString> &files) } } QSet<IDocument *> toAdd; - const FileName buildDir = FileName::fromString(m_projectData.buildDirectory()); + const FilePath buildDir = FilePath::fromString(m_projectData.buildDirectory()); for (const QString &f : qAsConst(filesToAdd)) { // A changed qbs file (project, module etc) should trigger a re-parse, but not if // the file was generated by qbs itself, in which case that might cause an infinite loop. - const FileName fp = FileName::fromString(f); + const FilePath fp = FilePath::fromString(f); static const ProjectDocument::ProjectCallback noOpCallback = []{}; const ProjectDocument::ProjectCallback reparseCallback = [this]() { delayParsing(); }; toAdd.insert(new ProjectDocument(Constants::MIME_TYPE, fp, fp.isChildOf(buildDir) @@ -964,7 +971,7 @@ void QbsProject::updateCppCodeModel() list.removeDuplicates(); ProjectExplorer::HeaderPaths grpHeaderPaths; foreach (const QString &p, list) - grpHeaderPaths += {FileName::fromUserInput(p).toString(), HeaderPathType::User}; + grpHeaderPaths += {FilePath::fromUserInput(p).toString(), HeaderPathType::User}; list = props.getModulePropertiesAsStringList(QLatin1String(CONFIG_CPP_MODULE), QLatin1String(CONFIG_FRAMEWORKPATHS)); @@ -972,7 +979,7 @@ void QbsProject::updateCppCodeModel() QLatin1String(CONFIG_SYSTEM_FRAMEWORKPATHS))); list.removeDuplicates(); foreach (const QString &p, list) - grpHeaderPaths += {FileName::fromUserInput(p).toString(), HeaderPathType::Framework}; + grpHeaderPaths += {FilePath::fromUserInput(p).toString(), HeaderPathType::Framework}; rpp.setHeaderPaths(grpHeaderPaths); @@ -1011,12 +1018,12 @@ void QbsProject::updateCppCodeModel() continue; } - const FileNameList fileNames = Utils::transform(generated, + const FilePathList fileNames = Utils::transform(generated, [](const QString &s) { - return Utils::FileName::fromString(s); + return Utils::FilePath::fromString(s); }); m_extraCompilers.append((*i)->create( - this, FileName::fromString(source.filePath()), fileNames)); + this, FilePath::fromString(source.filePath()), fileNames)); } } } @@ -1072,7 +1079,7 @@ void QbsProject::updateQmlJsCodeModel() foreach (const qbs::ProductData &product, m_projectData.allProducts()) { static const QString propertyName = QLatin1String("qmlImportPaths"); foreach (const QString &path, product.properties().value(propertyName).toStringList()) { - projectInfo.importPaths.maybeInsert(Utils::FileName::fromString(path), + projectInfo.importPaths.maybeInsert(Utils::FilePath::fromString(path), QmlJS::Dialect::Qml); } } @@ -1084,7 +1091,7 @@ void QbsProject::updateQmlJsCodeModel() void QbsProject::updateApplicationTargets() { - BuildTargetInfoList applications; + QList<BuildTargetInfo> applications; foreach (const qbs::ProductData &productData, m_projectData.allProducts()) { if (!productData.isEnabled() || !productData.isRunnable()) continue; @@ -1102,14 +1109,24 @@ void QbsProject::updateApplicationTargets() BuildTargetInfo bti; bti.buildKey = QbsProject::uniqueProductName(productData); - bti.targetFilePath = FileName::fromString(targetFile); - bti.projectFilePath = FileName::fromString(projectFile); + bti.targetFilePath = FilePath::fromString(targetFile); + bti.projectFilePath = FilePath::fromString(projectFile); bti.isQtcRunnable = isQtcRunnable; // Fixed up below. bti.usesTerminal = usesTerminal; bti.displayName = productData.fullDisplayName(); bti.runEnvModifier = [targetFile, productData, this](Utils::Environment &env, bool usingLibraryPaths) { if (!qbsProject().isValid()) return; + + const QString key = env.toStringList().join(QChar()) + + QbsProject::uniqueProductName(productData) + + QString::number(usingLibraryPaths); + const auto it = m_envCache.constFind(key); + if (it != m_envCache.constEnd()) { + env = it.value(); + return; + } + QProcessEnvironment procEnv = env.toProcessEnvironment(); procEnv.insert(QLatin1String("QBS_RUN_FILE_PATH"), targetFile); QStringList setupRunEnvConfig; @@ -1128,9 +1145,11 @@ void QbsProject::updateApplicationTargets() foreach (const QString &key, procEnv.keys()) env.set(key, procEnv.value(key)); } + + m_envCache.insert(key, env); }; - applications.list.append(bti); + applications.append(bti); } if (activeTarget()) activeTarget()->setApplicationTargets(applications); diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index 5a2db0fa659..f186bb2c13f 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -54,7 +54,7 @@ class QbsProject : public ProjectExplorer::Project Q_OBJECT public: - explicit QbsProject(const Utils::FileName &filename); + explicit QbsProject(const Utils::FilePath &filename); ~QbsProject() override; QStringList filesGeneratedFrom(const QString &sourceFile) const override; @@ -128,12 +128,14 @@ private: void updateAfterParse(); void delayedUpdateAfterParse(); void updateProjectNodes(); - Utils::FileName installRoot(); + Utils::FilePath installRoot(); void projectLoaded() override; ProjectExplorer::ProjectImporter *projectImporter() const override; QVariant additionalData(Core::Id id, const ProjectExplorer::Target *target) const final; + ProjectExplorer::DeploymentKnowledge deploymentKnowledge() const override; + static bool ensureWriteableQbsFile(const QString &file); template<typename Options> qbs::AbstractJob *buildOrClean(const Options &opts, @@ -162,6 +164,8 @@ private: QTimer m_parsingDelay; QList<ProjectExplorer::ExtraCompiler *> m_extraCompilers; bool m_extraCompilersPending = false; + + QHash<QString, Utils::Environment> m_envCache; }; } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp b/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp index b1d5adb8494..69c4e5af1d5 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp @@ -54,18 +54,18 @@ namespace Internal { struct BuildGraphData { - FileName bgFilePath; + FilePath bgFilePath; QVariantMap overriddenProperties; - FileName cCompilerPath; - FileName cxxCompilerPath; - FileName qtBinPath; - FileName sysroot; + FilePath cCompilerPath; + FilePath cxxCompilerPath; + FilePath qtBinPath; + FilePath sysroot; QString buildVariant; }; static BuildGraphData extractBgData(const qbs::Project::BuildGraphInfo &bgInfo) { BuildGraphData bgData; - bgData.bgFilePath = FileName::fromString(bgInfo.bgFilePath); + bgData.bgFilePath = FilePath::fromString(bgInfo.bgFilePath); bgData.overriddenProperties = bgInfo.overriddenProperties; const QVariantMap &moduleProps = bgInfo.requestedProperties; const QVariantMap prjCompilerPathByLanguage @@ -73,17 +73,17 @@ static BuildGraphData extractBgData(const qbs::Project::BuildGraphInfo &bgInfo) const QString prjCompilerPath = moduleProps.value("cpp.compilerPath").toString(); const QStringList prjToolchain = moduleProps.value("qbs.toolchain").toStringList(); const bool prjIsMsvc = prjToolchain.contains("msvc"); - bgData.cCompilerPath = FileName::fromString( + bgData.cCompilerPath = FilePath::fromString( prjIsMsvc ? prjCompilerPath : prjCompilerPathByLanguage.value("c").toString()); - bgData.cxxCompilerPath = FileName::fromString( + bgData.cxxCompilerPath = FilePath::fromString( prjIsMsvc ? prjCompilerPath : prjCompilerPathByLanguage.value("cpp").toString()); - bgData.qtBinPath = FileName::fromString(moduleProps.value("Qt.core.binPath").toString()); - bgData.sysroot = FileName::fromString(moduleProps.value("qbs.sysroot").toString()); + bgData.qtBinPath = FilePath::fromString(moduleProps.value("Qt.core.binPath").toString()); + bgData.sysroot = FilePath::fromString(moduleProps.value("qbs.sysroot").toString()); bgData.buildVariant = moduleProps.value("qbs.buildVariant").toString(); return bgData; } -QbsProjectImporter::QbsProjectImporter(const FileName &path) : QtProjectImporter(path) +QbsProjectImporter::QbsProjectImporter(const FilePath &path) : QtProjectImporter(path) { } @@ -93,7 +93,7 @@ static QString buildDir(const QString &projectFilePath, const Kit *k) ProjectMacroExpander expander(projectFilePath, projectName, k, QString(), BuildConfiguration::Unknown); const QString projectDir - = Project::projectDirectory(FileName::fromString(projectFilePath)).toString(); + = Project::projectDirectory(FilePath::fromString(projectFilePath)).toString(); const QString buildPath = expander.expand(ProjectExplorerPlugin::buildDirectoryTemplate()); return FileUtils::resolvePath(projectDir, buildPath); } @@ -136,7 +136,7 @@ QStringList QbsProjectImporter::importCandidates() return candidates; } -QList<void *> QbsProjectImporter::examineDirectory(const FileName &importPath) const +QList<void *> QbsProjectImporter::examineDirectory(const FilePath &importPath) const { qCDebug(qbsPmLog) << "examining build directory" << importPath.toUserOutput(); QList<void *> data; @@ -163,14 +163,14 @@ bool QbsProjectImporter::matchKit(void *directoryData, const Kit *k) const const auto * const bgData = static_cast<BuildGraphData *>(directoryData); qCDebug(qbsPmLog) << "matching kit" << k->displayName() << "against imported build" << bgData->bgFilePath.toUserOutput(); - if (ToolChainKitInformation::toolChains(k).isEmpty() && bgData->cCompilerPath.isEmpty() + if (ToolChainKitAspect::toolChains(k).isEmpty() && bgData->cCompilerPath.isEmpty() && bgData->cxxCompilerPath.isEmpty()) { return true; } const ToolChain * const cToolchain - = ToolChainKitInformation::toolChain(k, Constants::C_LANGUAGE_ID); + = ToolChainKitAspect::toolChain(k, Constants::C_LANGUAGE_ID); const ToolChain * const cxxToolchain - = ToolChainKitInformation::toolChain(k, Constants::CXX_LANGUAGE_ID); + = ToolChainKitAspect::toolChain(k, Constants::CXX_LANGUAGE_ID); if (!bgData->cCompilerPath.isEmpty()) { if (!cToolchain) return false; @@ -183,14 +183,14 @@ bool QbsProjectImporter::matchKit(void *directoryData, const Kit *k) const if (bgData->cxxCompilerPath != cxxToolchain->compilerCommand()) return false; } - const QtSupport::BaseQtVersion * const qtVersion = QtSupport::QtKitInformation::qtVersion(k); + const QtSupport::BaseQtVersion * const qtVersion = QtSupport::QtKitAspect::qtVersion(k); if (!bgData->qtBinPath.isEmpty()) { if (!qtVersion) return false; if (bgData->qtBinPath != qtVersion->binPath()) return false; } - if (bgData->sysroot != SysRootKitInformation::sysRoot(k)) + if (bgData->sysroot != SysRootKitAspect::sysRoot(k)) return false; qCDebug(qbsPmLog) << "Kit matches"; @@ -203,8 +203,7 @@ Kit *QbsProjectImporter::createKit(void *directoryData) const qCDebug(qbsPmLog) << "creating kit for imported build" << bgData->bgFilePath.toUserOutput(); QtVersionData qtVersionData; if (!bgData->qtBinPath.isEmpty()) { - FileName qmakeFilePath = bgData->qtBinPath; - qmakeFilePath.appendPath(HostOsInfo::withExecutableSuffix("qmake")); + const FilePath qmakeFilePath = bgData->qtBinPath.pathAppended(HostOsInfo::withExecutableSuffix("qmake")); qtVersionData = findOrCreateQtVersion(qmakeFilePath); } return createTemporaryKit(qtVersionData,[this, bgData](Kit *k) -> void { @@ -215,9 +214,9 @@ Kit *QbsProjectImporter::createKit(void *directoryData) const tcData << findOrCreateToolChains(bgData->cCompilerPath, Constants::C_LANGUAGE_ID); foreach (const ToolChainData &tc, tcData) { if (!tc.tcs.isEmpty()) - ToolChainKitInformation::setToolChain(k, tc.tcs.first()); + ToolChainKitAspect::setToolChain(k, tc.tcs.first()); } - SysRootKitInformation::setSysRoot(k, bgData->sysroot); + SysRootKitAspect::setSysRoot(k, bgData->sysroot); }); } diff --git a/src/plugins/qbsprojectmanager/qbsprojectimporter.h b/src/plugins/qbsprojectmanager/qbsprojectimporter.h index 4aa3682a384..345e57522bd 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectimporter.h +++ b/src/plugins/qbsprojectmanager/qbsprojectimporter.h @@ -35,11 +35,11 @@ class QbsProjectImporter final : public QtSupport::QtProjectImporter Q_OBJECT public: - QbsProjectImporter(const Utils::FileName &path); + QbsProjectImporter(const Utils::FilePath &path); private: QStringList importCandidates() override; - QList<void *> examineDirectory(const Utils::FileName &importPath) const override; + QList<void *> examineDirectory(const Utils::FilePath &importPath) const override; bool matchKit(void *directoryData, const ProjectExplorer::Kit *k) const override; ProjectExplorer::Kit *createKit(void *directoryData) const override; const QList<ProjectExplorer::BuildInfo> buildInfoListForKit(const ProjectExplorer::Kit *k, diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp index b82a93987f9..41cbe1763bd 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp @@ -165,7 +165,7 @@ void QbsManager::addProfile(const QString &name, const QVariantMap &data) void QbsManager::addQtProfileFromKit(const QString &profileName, const ProjectExplorer::Kit *k) { - if (const QtSupport::BaseQtVersion * const qt = QtSupport::QtKitInformation::qtVersion(k)) { + if (const QtSupport::BaseQtVersion * const qt = QtSupport::QtKitAspect::qtVersion(k)) { qbs::Profile(profileName, settings()).setValue("moduleProviders.Qt.qmakeFilePaths", qt->qmakeCommand().toString()); } diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro index bef7cd2a059..831422f2621 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro @@ -20,7 +20,6 @@ HEADERS = \ defaultpropertyprovider.h \ propertyprovider.h \ qbsbuildconfiguration.h \ - qbsbuildconfigurationwidget.h \ qbsbuildstep.h \ qbscleanstep.h \ qbskitinformation.h \ @@ -45,7 +44,6 @@ SOURCES = \ customqbspropertiesdialog.cpp \ defaultpropertyprovider.cpp \ qbsbuildconfiguration.cpp \ - qbsbuildconfigurationwidget.cpp \ qbsbuildstep.cpp \ qbscleanstep.cpp \ qbsinstallstep.cpp \ diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs index 45e5d1f3a4c..1ef3f1b63bc 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs @@ -66,8 +66,6 @@ QtcPlugin { "propertyprovider.h", "qbsbuildconfiguration.cpp", "qbsbuildconfiguration.h", - "qbsbuildconfigurationwidget.cpp", - "qbsbuildconfigurationwidget.h", "qbsbuildstep.cpp", "qbsbuildstep.h", "qbsbuildstepconfigwidget.ui", diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h index 8fe5f9170e1..43cf1ce722a 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h @@ -88,6 +88,7 @@ const char CPP_CCOMPILERNAME[] = "cpp.cCompilerName"; const char CPP_CXXCOMPILERNAME[] = "cpp.cxxCompilerName"; const char CPP_PLATFORMCOMMONCOMPILERFLAGS[] = "cpp.platformCommonCompilerFlags"; const char CPP_PLATFORMLINKERFLAGS[] = "cpp.platformLinkerFlags"; +const char CPP_VCVARSALLPATH[] = "cpp.vcvarsallPath"; const char XCODE_DEVELOPERPATH[] = "xcode.developerPath"; const char XCODE_SDK[] = "xcode.sdk"; diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp index 3087dfc7a91..f8eb477e649 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp @@ -54,6 +54,7 @@ #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectmanager.h> #include <projectexplorer/projecttree.h> +#include <projectexplorer/runcontrol.h> #include <projectexplorer/session.h> #include <projectexplorer/target.h> @@ -91,7 +92,9 @@ public: QbsCleanStepFactory cleanStepFactory; QbsInstallStepFactory installStepFactory; QbsRunConfigurationFactory runConfigFactory; + SimpleRunWorkerFactory<SimpleTargetRunner, QbsRunConfiguration> runWorkerFactory; QbsProfilesSettingsPage profilesSetttingsPage; + QbsKitAspect qbsKitAspect; }; QbsProjectManagerPlugin::~QbsProjectManagerPlugin() @@ -112,7 +115,6 @@ bool QbsProjectManagerPlugin::initialize(const QStringList &arguments, QString * Core::HelpManager::registerDocumentation({Core::HelpManager::documentationPath() + "/qbs.qch"}); ProjectManager::registerProjectType<QbsProject>(QmlJSTools::Constants::QBS_MIMETYPE); - KitManager::registerKitInformation<QbsKitInformation>(); //menus // Build Menu: @@ -219,16 +221,6 @@ bool QbsProjectManagerPlugin::initialize(const QStringList &arguments, QString * connect(m_buildSubprojectCtx, &QAction::triggered, this, &QbsProjectManagerPlugin::buildSubprojectContextMenu); - m_buildSubproject = new Utils::ParameterAction(tr("Build Subproject"), tr("Build Subproject \"%1\""), - Utils::ParameterAction::AlwaysEnabled, this); - command = Core::ActionManager::registerAction(m_buildSubproject, Constants::ACTION_BUILD_SUBPROJECT); - command->setAttribute(Core::Command::CA_Hide); - command->setAttribute(Core::Command::CA_UpdateText); - command->setDescription(m_buildFile->text()); - command->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+B"))); - mbuild->addAction(command, ProjectExplorer::Constants::G_BUILD_BUILD); - connect(m_buildSubproject, &QAction::triggered, this, &QbsProjectManagerPlugin::buildSubproject); - m_cleanSubprojectCtx = new QAction(tr("Clean"), this); command = Core::ActionManager::registerAction( m_cleanSubprojectCtx, Constants::ACTION_CLEAN_SUBPROJECT_CONTEXT, projectContext); @@ -237,17 +229,6 @@ bool QbsProjectManagerPlugin::initialize(const QStringList &arguments, QString * connect(m_cleanSubprojectCtx, &QAction::triggered, this, &QbsProjectManagerPlugin::cleanSubprojectContextMenu); - m_cleanSubproject = new Utils::ParameterAction( - tr("Clean Subproject"), tr("Clean Subproject \"%1\""), - Utils::ParameterAction::AlwaysEnabled, this); - command = Core::ActionManager::registerAction(m_cleanSubproject, - Constants::ACTION_CLEAN_SUBPROJECT); - command->setAttribute(Core::Command::CA_Hide); - command->setAttribute(Core::Command::CA_UpdateText); - mbuild->addAction(command, ProjectExplorer::Constants::G_BUILD_CLEAN); - connect(m_cleanSubproject, &QAction::triggered, this, - &QbsProjectManagerPlugin::cleanSubproject); - m_rebuildSubprojectCtx = new QAction(tr("Rebuild"), this); command = Core::ActionManager::registerAction( m_rebuildSubprojectCtx, Constants::ACTION_REBUILD_SUBPROJECT_CONTEXT, @@ -257,17 +238,6 @@ bool QbsProjectManagerPlugin::initialize(const QStringList &arguments, QString * connect(m_rebuildSubprojectCtx, &QAction::triggered, this, &QbsProjectManagerPlugin::rebuildSubprojectContextMenu); - m_rebuildSubproject = new Utils::ParameterAction( - tr("Rebuild Subproject"), tr("Rebuild Subproject \"%1\""), - Utils::ParameterAction::AlwaysEnabled, this); - command = Core::ActionManager::registerAction(m_rebuildSubproject, - Constants::ACTION_REBUILD_SUBPROJECT); - command->setAttribute(Core::Command::CA_Hide); - command->setAttribute(Core::Command::CA_UpdateText); - mbuild->addAction(command, ProjectExplorer::Constants::G_BUILD_REBUILD); - connect(m_rebuildSubproject, &QAction::triggered, this, - &QbsProjectManagerPlugin::rebuildSubproject); - // Connect connect(ProjectTree::instance(), &ProjectTree::currentNodeChanged, @@ -313,12 +283,12 @@ void QbsProjectManagerPlugin::projectWasAdded(Project *project) void QbsProjectManagerPlugin::updateContextActions() { auto project = qobject_cast<Internal::QbsProject *>(ProjectTree::currentProject()); - const Node *node = ProjectTree::findCurrentNode(); + const Node *node = ProjectTree::currentNode(); bool isEnabled = !BuildManager::isBuilding(project) && project && !project->isParsing() && node && node->isEnabled(); - bool isFile = project && node && (node->nodeType() == NodeType::File); + const bool isFile = project && node && node->asFileNode(); const bool isProduct = project && node && dynamic_cast<const QbsProductNode *>(node); const auto subproject = dynamic_cast<const QbsProjectNode *>(node); bool isSubproject = project && subproject && subproject != project->rootProjectNode(); @@ -346,32 +316,31 @@ void QbsProjectManagerPlugin::updateBuildActions() bool enabled = false; bool fileVisible = false; bool productVisible = false; - bool subprojectVisible = false; QString fileName; QString productName; - QString subprojectName; if (Node *editorNode = currentEditorNode()) { - QbsProject *editorProject = currentEditorProject(); - enabled = editorProject - && !BuildManager::isBuilding(editorProject) - && !editorProject->isParsing(); - fileName = editorNode->filePath().fileName(); - fileVisible = editorProject && editorNode && dynamic_cast<QbsBaseProjectNode *>(editorNode->parentProjectNode()); - auto productNode = - dynamic_cast<QbsProductNode *>(editorNode ? editorNode->parentProjectNode() : nullptr); + ProjectNode *parentProjectNode = editorNode->parentProjectNode(); + const QbsProductNode *productNode = nullptr; + for (const ProjectNode *potentialProductNode = parentProjectNode; + potentialProductNode && !productNode; + potentialProductNode = potentialProductNode->parentProjectNode()) { + productNode = dynamic_cast<const QbsProductNode *>(potentialProductNode); + } + if (productNode) { productVisible = true; productName = productNode->displayName(); } - auto subprojectNode = - dynamic_cast<QbsProjectNode *>(productNode ? productNode->parentFolderNode() : nullptr); - if (subprojectNode && editorProject && subprojectNode != editorProject->rootProjectNode()) { - subprojectVisible = true; - subprojectName = subprojectNode->displayName(); + + if (QbsProject *editorProject = currentEditorProject()) { + enabled = !BuildManager::isBuilding(editorProject) && !editorProject->isParsing(); + fileVisible = productNode + || dynamic_cast<QbsProjectNode *>(parentProjectNode) + || dynamic_cast<QbsGroupNode *>(parentProjectNode); } } @@ -388,16 +357,6 @@ void QbsProjectManagerPlugin::updateBuildActions() m_rebuildProduct->setEnabled(enabled); m_rebuildProduct->setVisible(productVisible); m_rebuildProduct->setParameter(productName); - - m_buildSubproject->setEnabled(enabled); - m_buildSubproject->setVisible(subprojectVisible); - m_buildSubproject->setParameter(subprojectName); - m_cleanSubproject->setEnabled(enabled); - m_cleanSubproject->setVisible(subprojectVisible); - m_cleanSubproject->setParameter(subprojectName); - m_rebuildSubproject->setEnabled(enabled); - m_rebuildSubproject->setVisible(subprojectVisible); - m_rebuildSubproject->setParameter(subprojectName); } void QbsProjectManagerPlugin::projectChanged() @@ -416,7 +375,7 @@ void QbsProjectManagerPlugin::projectChanged() void QbsProjectManagerPlugin::buildFileContextMenu() { - const Node *node = ProjectTree::findCurrentNode(); + const Node *node = ProjectTree::currentNode(); QTC_ASSERT(node, return); auto project = dynamic_cast<QbsProject *>(ProjectTree::currentProject()); QTC_ASSERT(project, return); @@ -453,7 +412,7 @@ void QbsProjectManagerPlugin::rebuildProductContextMenu() void QbsProjectManagerPlugin::runStepsForProductContextMenu(const QList<Core::Id> &stepTypes) { - const Node *node = ProjectTree::findCurrentNode(); + const Node *node = ProjectTree::currentNode(); QTC_ASSERT(node, return); auto project = dynamic_cast<QbsProject *>(ProjectTree::currentProject()); QTC_ASSERT(project, return); @@ -518,7 +477,7 @@ void QbsProjectManagerPlugin::rebuildSubprojectContextMenu() void QbsProjectManagerPlugin::runStepsForSubprojectContextMenu(const QList<Core::Id> &stepTypes) { - const Node *node = ProjectTree::findCurrentNode(); + const Node *node = ProjectTree::currentNode(); QTC_ASSERT(node, return); auto project = dynamic_cast<QbsProject *>(ProjectTree::currentProject()); QTC_ASSERT(project, return); @@ -533,52 +492,6 @@ void QbsProjectManagerPlugin::runStepsForSubprojectContextMenu(const QList<Core: runStepsForProducts(project, toBuild, {stepTypes}); } -void QbsProjectManagerPlugin::buildSubproject() -{ - runStepsForSubproject({Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)}); -} - -void QbsProjectManagerPlugin::cleanSubproject() -{ - runStepsForSubproject({Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)}); -} - -void QbsProjectManagerPlugin::rebuildSubproject() -{ - runStepsForSubproject({ - Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN), - Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD) - }); -} - -void QbsProjectManagerPlugin::runStepsForSubproject(const QList<Core::Id> &stepTypes) -{ - Node *editorNode = currentEditorNode(); - QbsProject *editorProject = currentEditorProject(); - if (!editorNode || !editorProject) - return; - - QbsProjectNode *subproject = nullptr; - auto start = dynamic_cast<QbsBaseProjectNode *>(editorNode->parentProjectNode()); - while (start && start != editorProject->rootProjectNode()) { - auto tmp = dynamic_cast<QbsProjectNode *>(start); - if (tmp) { - subproject = tmp; - break; - } - start = dynamic_cast<QbsProjectNode *>(start->parentFolderNode()); - } - - if (!subproject) - return; - - QStringList toBuild; - foreach (const qbs::ProductData &data, subproject->qbsProjectData().allProducts()) - toBuild << QbsProject::uniqueProductName(data); - - runStepsForProducts(editorProject, toBuild, {stepTypes}); -} - void QbsProjectManagerPlugin::buildFiles(QbsProject *project, const QStringList &files, const QStringList &activeFileTags) { diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.h b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.h index 99aa566eff6..f7b37e8d809 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.h +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.h @@ -64,10 +64,6 @@ class QbsProjectManagerPlugin : public ExtensionSystem::IPlugin void cleanSubprojectContextMenu(); void rebuildSubprojectContextMenu(); void runStepsForSubprojectContextMenu(const QList<Core::Id> &stepTypes); - void buildSubproject(); - void cleanSubproject(); - void rebuildSubproject(); - void runStepsForSubproject(const QList<Core::Id> &stepTypes); void reparseSelectedProject(); void reparseCurrentProject(); @@ -98,9 +94,6 @@ class QbsProjectManagerPlugin : public ExtensionSystem::IPlugin Utils::ParameterAction *m_buildProduct = nullptr; Utils::ParameterAction *m_cleanProduct = nullptr; Utils::ParameterAction *m_rebuildProduct = nullptr; - Utils::ParameterAction *m_buildSubproject = nullptr; - Utils::ParameterAction *m_cleanSubproject = nullptr; - Utils::ParameterAction *m_rebuildSubproject = nullptr; }; } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index 03cff5f4eb9..d4960b3524e 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -34,6 +34,7 @@ #include <projectexplorer/deploymentdata.h> #include <projectexplorer/localenvironmentaspect.h> #include <projectexplorer/project.h> +#include <projectexplorer/runcontrol.h> #include <projectexplorer/runconfigurationaspects.h> #include <projectexplorer/target.h> @@ -54,12 +55,18 @@ namespace Internal { QbsRunConfiguration::QbsRunConfiguration(Target *target, Core::Id id) : RunConfiguration(target, id) { - auto envAspect = addAspect<LocalEnvironmentAspect>(target, - [this](Environment &env) { addToBaseEnvironment(env); }); + auto envAspect = addAspect<LocalEnvironmentAspect>(target); + envAspect->addModifier([this](Environment &env) { + bool usingLibraryPaths = aspect<UseLibraryPathsAspect>()->value(); + + BuildTargetInfo bti = buildTargetInfo(); + if (bti.runEnvModifier) + bti.runEnvModifier(env, usingLibraryPaths); + }); addAspect<ExecutableAspect>(); addAspect<ArgumentsAspect>(); - addAspect<WorkingDirectoryAspect>(envAspect); + addAspect<WorkingDirectoryAspect>(); addAspect<TerminalAspect>(); setOutputFormatter<QtSupport::QtOutputFormatter>(); @@ -71,6 +78,10 @@ QbsRunConfiguration::QbsRunConfiguration(Target *target, Core::Id id) auto dyldAspect = addAspect<UseDyldSuffixAspect>(); connect(dyldAspect, &UseDyldSuffixAspect::changed, envAspect, &EnvironmentAspect::environmentChanged); + envAspect->addModifier([dyldAspect](Environment &env) { + if (dyldAspect->value()) + env.set("DYLD_IMAGE_SUFFIX", "_debug"); + }); } connect(project(), &Project::parsingFinished, this, @@ -85,7 +96,6 @@ QbsRunConfiguration::QbsRunConfiguration(Target *target, Core::Id id) this, &QbsRunConfiguration::updateTargetInformation); auto qbsProject = static_cast<QbsProject *>(target->project()); - connect(qbsProject, &QbsProject::dataChanged, this, [this] { m_envCache.clear(); }); connect(qbsProject, &Project::parsingFinished, this, &QbsRunConfiguration::updateTargetInformation); } @@ -110,41 +120,16 @@ void QbsRunConfiguration::doAdditionalSetup(const RunConfigurationCreationInfo & updateTargetInformation(); } -void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const +Utils::FilePath QbsRunConfiguration::executableToRun(const BuildTargetInfo &targetInfo) const { - if (auto dyldAspect = aspect<UseDyldSuffixAspect>()) { - if (dyldAspect->value()) - env.set("DYLD_IMAGE_SUFFIX", "_debug"); - } - bool usingLibraryPaths = aspect<UseLibraryPathsAspect>()->value(); - - const auto key = qMakePair(env.toStringList(), usingLibraryPaths); - const auto it = m_envCache.constFind(key); - if (it != m_envCache.constEnd()) { - env = it.value(); - return; - } - BuildTargetInfo bti = buildTargetInfo(); - if (bti.runEnvModifier) { - if (project()->isParsing() || BuildManager::isBuilding(target())) { - qCDebug(qbsPmLog) << "qbs project in flux, cannot modify environment"; - return; // Intentionally skips the cache update below. - } - bti.runEnvModifier(env, usingLibraryPaths); - } - m_envCache.insert(key, env); -} - -Utils::FileName QbsRunConfiguration::executableToRun(const BuildTargetInfo &targetInfo) const -{ - const FileName appInBuildDir = targetInfo.targetFilePath; + const FilePath appInBuildDir = targetInfo.targetFilePath; if (target()->deploymentData().localInstallRoot().isEmpty()) return appInBuildDir; const QString deployedAppFilePath = target()->deploymentData() .deployableForLocalFile(appInBuildDir.toString()).remoteFilePath(); if (deployedAppFilePath.isEmpty()) return appInBuildDir; - const FileName appInLocalInstallDir = target()->deploymentData().localInstallRoot() + const FilePath appInLocalInstallDir = target()->deploymentData().localInstallRoot() + deployedAppFilePath; return appInLocalInstallDir.exists() ? appInLocalInstallDir : appInBuildDir; } @@ -152,10 +137,9 @@ Utils::FileName QbsRunConfiguration::executableToRun(const BuildTargetInfo &targ void QbsRunConfiguration::updateTargetInformation() { BuildTargetInfo bti = buildTargetInfo(); - const FileName executable = executableToRun(bti); + const FilePath executable = executableToRun(bti); auto terminalAspect = aspect<TerminalAspect>(); - if (!terminalAspect->isUserSet()) - terminalAspect->setUseTerminal(bti.usesTerminal); + terminalAspect->setUseTerminalHint(bti.usesTerminal); aspect<ExecutableAspect>()->setExecutable(executable); @@ -163,21 +147,13 @@ void QbsRunConfiguration::updateTargetInformation() QString defaultWorkingDir = QFileInfo(executable.toString()).absolutePath(); if (!defaultWorkingDir.isEmpty()) { auto wdAspect = aspect<WorkingDirectoryAspect>(); - wdAspect->setDefaultWorkingDirectory(FileName::fromString(defaultWorkingDir)); + wdAspect->setDefaultWorkingDirectory(FilePath::fromString(defaultWorkingDir)); } } emit enabledChanged(); } -bool QbsRunConfiguration::canRunForNode(const Node *node) const -{ - if (auto pn = dynamic_cast<const QbsProductNode *>(node)) - return buildKey() == pn->buildKey(); - - return false; -} - // -------------------------------------------------------------------- // QbsRunConfigurationFactory: // -------------------------------------------------------------------- @@ -187,8 +163,6 @@ QbsRunConfigurationFactory::QbsRunConfigurationFactory() registerRunConfiguration<QbsRunConfiguration>("Qbs.RunConfiguration:"); addSupportedProjectType(Constants::PROJECT_ID); addSupportedTargetDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); - - addRunWorkerFactory<SimpleTargetRunner>(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h index 94b3ae65350..934f676624b 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h @@ -41,19 +41,13 @@ class QbsRunConfiguration : public ProjectExplorer::RunConfiguration public: QbsRunConfiguration(ProjectExplorer::Target *target, Core::Id id); - void addToBaseEnvironment(Utils::Environment &env) const; - private: - Utils::FileName executableToRun(const ProjectExplorer::BuildTargetInfo &targetInfo) const; + Utils::FilePath executableToRun(const ProjectExplorer::BuildTargetInfo &targetInfo) const; QVariantMap toMap() const final; bool fromMap(const QVariantMap &map) final; void doAdditionalSetup(const ProjectExplorer::RunConfigurationCreationInfo &rci) final; - bool canRunForNode(const ProjectExplorer::Node *node) const final; void updateTargetInformation(); - - using EnvCache = QHash<QPair<QStringList, bool>, Utils::Environment>; - mutable EnvCache m_envCache; }; class QbsRunConfigurationFactory : public ProjectExplorer::RunConfigurationFactory |