aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/projectexplorer/buildconfiguration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/projectexplorer/buildconfiguration.cpp')
-rw-r--r--src/plugins/projectexplorer/buildconfiguration.cpp137
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))