diff options
Diffstat (limited to 'src/plugins/projectexplorer/buildconfiguration.cpp')
-rw-r--r-- | src/plugins/projectexplorer/buildconfiguration.cpp | 137 |
1 files changed, 115 insertions, 22 deletions
diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index c7269480ce..0e3a30427c 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -26,22 +26,23 @@ #include "buildconfiguration.h" #include "buildaspects.h" -#include "buildenvironmentwidget.h" #include "buildinfo.h" #include "buildsteplist.h" #include "buildstepspage.h" #include "buildsystem.h" -#include "namedwidget.h" +#include "customparser.h" +#include "environmentwidget.h" #include "kit.h" #include "kitinformation.h" #include "kitmanager.h" -#include "project.h" -#include "projectexplorer.h" +#include "namedwidget.h" #include "projectexplorerconstants.h" +#include "projectexplorer.h" +#include "project.h" #include "projectmacroexpander.h" #include "projecttree.h" -#include "target.h" #include "session.h" +#include "target.h" #include "toolchain.h" #include <coreplugin/idocument.h> @@ -54,8 +55,10 @@ #include <utils/mimetypes/mimetype.h> #include <utils/qtcassert.h> +#include <QCheckBox> #include <QDebug> #include <QFormLayout> +#include <QVBoxLayout> using namespace Utils; @@ -63,10 +66,69 @@ const char BUILD_STEP_LIST_COUNT[] = "ProjectExplorer.BuildConfiguration.BuildSt const char BUILD_STEP_LIST_PREFIX[] = "ProjectExplorer.BuildConfiguration.BuildStepList."; const char CLEAR_SYSTEM_ENVIRONMENT_KEY[] = "ProjectExplorer.BuildConfiguration.ClearSystemEnvironment"; const char USER_ENVIRONMENT_CHANGES_KEY[] = "ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"; +const char CUSTOM_PARSERS_KEY[] = "ProjectExplorer.BuildConfiguration.CustomParsers"; namespace ProjectExplorer { namespace Internal { +class BuildEnvironmentWidget : public NamedWidget +{ + Q_DECLARE_TR_FUNCTIONS(ProjectExplorer::Internal::BuildEnvironmentWidget) + +public: + explicit BuildEnvironmentWidget(BuildConfiguration *bc) + : NamedWidget(tr("Build Environment")) + { + auto clearBox = new QCheckBox(tr("Clear system environment"), this); + clearBox->setChecked(!bc->useSystemEnvironment()); + + auto envWidget = new EnvironmentWidget(this, EnvironmentWidget::TypeLocal, clearBox); + envWidget->setBaseEnvironment(bc->baseEnvironment()); + envWidget->setBaseEnvironmentText(bc->baseEnvironmentText()); + envWidget->setUserChanges(bc->userEnvironmentChanges()); + + connect(envWidget, &EnvironmentWidget::userChangesChanged, this, [bc, envWidget] { + bc->setUserEnvironmentChanges(envWidget->userChanges()); + }); + + connect(clearBox, &QAbstractButton::toggled, this, [bc, envWidget](bool checked) { + bc->setUseSystemEnvironment(!checked); + envWidget->setBaseEnvironment(bc->baseEnvironment()); + envWidget->setBaseEnvironmentText(bc->baseEnvironmentText()); + }); + + connect(bc, &BuildConfiguration::environmentChanged, this, [bc, envWidget] { + envWidget->setBaseEnvironment(bc->baseEnvironment()); + envWidget->setBaseEnvironmentText(bc->baseEnvironmentText()); + }); + + auto vbox = new QVBoxLayout(this); + vbox->setContentsMargins(0, 0, 0, 0); + vbox->addWidget(clearBox); + vbox->addWidget(envWidget); + } +}; + +class CustomParsersBuildWidget : public NamedWidget +{ + Q_DECLARE_TR_FUNCTIONS(ProjectExplorer::Internal::CustomParsersBuildWidget) +public: + CustomParsersBuildWidget(BuildConfiguration *bc) : NamedWidget(tr("Custom Output Parsers")) + { + const auto selectionWidget = new CustomParsersSelectionWidget(this); + const auto layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(selectionWidget); + + connect(selectionWidget, &CustomParsersSelectionWidget::selectionChanged, + [selectionWidget, bc] { + bc->setCustomParsers(selectionWidget->selectedParsers()); + }); + selectionWidget->setSelectedParsers(bc->customParsers()); + } +}; + + class BuildConfigurationPrivate { public: @@ -84,8 +146,10 @@ public: mutable Environment m_cachedEnvironment; QString m_configWidgetDisplayName; bool m_configWidgetHasFrame = false; - QList<Core::Id> m_initialBuildSteps; - QList<Core::Id> m_initialCleanSteps; + QList<Utils::Id> m_initialBuildSteps; + QList<Utils::Id> m_initialCleanSteps; + Utils::MacroExpander m_macroExpander; + QList<Utils::Id> m_customParsers; // FIXME: Remove. BuildConfiguration::BuildType m_initialBuildType = BuildConfiguration::Unknown; @@ -94,7 +158,7 @@ public: } // Internal -BuildConfiguration::BuildConfiguration(Target *target, Core::Id id) +BuildConfiguration::BuildConfiguration(Target *target, Utils::Id id) : ProjectConfiguration(target, id), d(new Internal::BuildConfigurationPrivate(this)) { QTC_CHECK(target && target == this->target()); @@ -130,7 +194,7 @@ BuildConfiguration::BuildConfiguration(Target *target, Core::Id id) d->m_buildDirectoryAspect->setEnvironment(environment()); d->m_buildDirectoryAspect->setMacroExpanderProvider([this] { return macroExpander(); }); connect(d->m_buildDirectoryAspect, &BaseStringAspect::changed, - this, &BuildConfiguration::buildDirectoryChanged); + this, &BuildConfiguration::emitBuildDirectoryChanged); connect(this, &BuildConfiguration::environmentChanged, this, [this] { d->m_buildDirectoryAspect->setEnvironment(environment()); this->target()->buildEnvironmentChanged(this); @@ -192,10 +256,10 @@ void BuildConfiguration::doInitialize(const BuildInfo &info) d->m_initialBuildType = info.buildType; - for (Core::Id id : qAsConst(d->m_initialBuildSteps)) + for (Utils::Id id : qAsConst(d->m_initialBuildSteps)) d->m_buildSteps.appendStep(id); - for (Core::Id id : qAsConst(d->m_initialCleanSteps)) + for (Utils::Id id : qAsConst(d->m_initialCleanSteps)) d->m_cleanSteps.appendStep(id); acquaintAspects(); @@ -204,6 +268,19 @@ void BuildConfiguration::doInitialize(const BuildInfo &info) d->m_initializer(info); } +MacroExpander *BuildConfiguration::macroExpander() const +{ + return &d->m_macroExpander; +} + +bool BuildConfiguration::createBuildDirectory() +{ + QDir dir; + const auto result = dir.mkpath(buildDirectory().toString()); + buildDirectoryAspect()->validateInput(); + return result; +} + void BuildConfiguration::setInitializer(const std::function<void(const BuildInfo &)> &initializer) { d->m_initializer = initializer; @@ -239,7 +316,10 @@ NamedWidget *BuildConfiguration::createConfigWidget() QList<NamedWidget *> BuildConfiguration::createSubConfigWidgets() { - return {new BuildEnvironmentWidget(this)}; + return { + new Internal::BuildEnvironmentWidget(this), + new Internal::CustomParsersBuildWidget(this) + }; } BuildSystem *BuildConfiguration::buildSystem() const @@ -258,12 +338,12 @@ BuildStepList *BuildConfiguration::cleanSteps() const return &d->m_cleanSteps; } -void BuildConfiguration::appendInitialBuildStep(Core::Id id) +void BuildConfiguration::appendInitialBuildStep(Utils::Id id) { d->m_initialBuildSteps.append(id); } -void BuildConfiguration::appendInitialCleanStep(Core::Id id) +void BuildConfiguration::appendInitialCleanStep(Utils::Id id) { d->m_initialCleanSteps.append(id); } @@ -279,6 +359,8 @@ QVariantMap BuildConfiguration::toMap() const map.insert(QLatin1String(BUILD_STEP_LIST_PREFIX) + QString::number(0), d->m_buildSteps.toMap()); map.insert(QLatin1String(BUILD_STEP_LIST_PREFIX) + QString::number(1), d->m_cleanSteps.toMap()); + map.insert(CUSTOM_PARSERS_KEY, transform(d->m_customParsers,&Utils::Id::toSetting)); + return map; } @@ -299,7 +381,7 @@ bool BuildConfiguration::fromMap(const QVariantMap &map) qWarning() << "No data for build step list" << i << "found!"; continue; } - Core::Id id = idFromMap(data); + Utils::Id id = idFromMap(data); if (id == Constants::BUILDSTEPS_BUILD) { if (!d->m_buildSteps.fromMap(data)) qWarning() << "Failed to restore build step list"; @@ -311,6 +393,8 @@ bool BuildConfiguration::fromMap(const QVariantMap &map) } } + d->m_customParsers = transform(map.value(CUSTOM_PARSERS_KEY).toList(), &Utils::Id::fromSetting); + return ProjectConfiguration::fromMap(map); } @@ -394,6 +478,16 @@ void BuildConfiguration::addToEnvironment(Environment &env) const Q_UNUSED(env) } +const QList<Utils::Id> BuildConfiguration::customParsers() const +{ + return d->m_customParsers; +} + +void BuildConfiguration::setCustomParsers(const QList<Utils::Id> &parsers) +{ + d->m_customParsers = parsers; +} + bool BuildConfiguration::useSystemEnvironment() const { return !d->m_clearSystemEnvironment; @@ -470,8 +564,7 @@ bool BuildConfiguration::isActive() const void BuildConfiguration::prependCompilerPathToEnvironment(Kit *k, Environment &env) { - const ToolChain *tc - = ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID); + const ToolChain *tc = ToolChainKitAspect::cxxToolChain(k); if (!tc) return; @@ -529,7 +622,7 @@ const QList<BuildInfo> return list; } -bool BuildConfigurationFactory::supportsTargetDeviceType(Core::Id id) const +bool BuildConfigurationFactory::supportsTargetDeviceType(Utils::Id id) const { if (m_supportedTargetDeviceTypes.isEmpty()) return true; @@ -540,7 +633,7 @@ bool BuildConfigurationFactory::supportsTargetDeviceType(Core::Id id) const BuildConfigurationFactory *BuildConfigurationFactory::find(const Kit *k, const FilePath &projectPath) { QTC_ASSERT(k, return nullptr); - const Core::Id deviceType = DeviceTypeKitAspect::deviceTypeId(k); + const Utils::Id deviceType = DeviceTypeKitAspect::deviceTypeId(k); for (BuildConfigurationFactory *factory : g_buildConfigurationFactories) { if (Utils::mimeTypeForFile(projectPath.toString()) .matchesName(factory->m_supportedProjectMimeTypeName) @@ -560,7 +653,7 @@ BuildConfigurationFactory * BuildConfigurationFactory::find(Target *parent) return nullptr; } -void BuildConfigurationFactory::setSupportedProjectType(Core::Id id) +void BuildConfigurationFactory::setSupportedProjectType(Utils::Id id) { m_supportedProjectType = id; } @@ -570,7 +663,7 @@ void BuildConfigurationFactory::setSupportedProjectMimeTypeName(const QString &m m_supportedProjectMimeTypeName = mimeTypeName; } -void BuildConfigurationFactory::addSupportedTargetDeviceType(Core::Id id) +void BuildConfigurationFactory::addSupportedTargetDeviceType(Utils::Id id) { m_supportedTargetDeviceTypes.append(id); } @@ -614,7 +707,7 @@ BuildConfiguration *BuildConfigurationFactory::create(Target *parent, const Buil BuildConfiguration *BuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) { - const Core::Id id = idFromMap(map); + const Utils::Id id = idFromMap(map); for (BuildConfigurationFactory *factory : g_buildConfigurationFactories) { QTC_ASSERT(factory->m_creator, return nullptr); if (!factory->canHandle(parent)) |