CMakeProjectManager: Use aspects more directly in build configuration

Change-Id: I35b9a31c158cac8eccb44ffb3f4e2d21d8183b8b
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
hjk
2023-07-07 15:46:17 +02:00
parent afe8b19996
commit b9cf021b8e
3 changed files with 98 additions and 161 deletions

View File

@@ -174,7 +174,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildSystem *bs) :
m_configTextFilterModel(new CategorySortFilterModel(this)) m_configTextFilterModel(new CategorySortFilterModel(this))
{ {
QTC_ASSERT(bs, return); QTC_ASSERT(bs, return);
BuildConfiguration *bc = bs->buildConfiguration(); CMakeBuildConfiguration *bc = bs->cmakeBuildConfiguration();
m_configureDetailsWidget = new DetailsWidget; m_configureDetailsWidget = new DetailsWidget;
@@ -189,11 +189,10 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildSystem *bs) :
m_configModel->flush(); // clear out config cache...; m_configModel->flush(); // clear out config cache...;
}); });
auto buildTypeAspect = bc->aspect<BuildTypeAspect>(); connect(&bc->buildTypeAspect, &BaseAspect::changed, this, [this, bc] {
connect(buildTypeAspect, &BaseAspect::changed, this, [this, buildTypeAspect] {
if (!m_buildSystem->isMultiConfig()) { if (!m_buildSystem->isMultiConfig()) {
CMakeConfig config; CMakeConfig config;
config << CMakeConfigItem("CMAKE_BUILD_TYPE", buildTypeAspect->value().toUtf8()); config << CMakeConfigItem("CMAKE_BUILD_TYPE", bc->buildTypeAspect().toUtf8());
m_configModel->setBatchEditConfiguration(config); m_configModel->setBatchEditConfiguration(config);
} }
@@ -326,15 +325,14 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildSystem *bs) :
} }
}; };
auto configureEnvironmentAspectWidget auto configureEnvironmentAspectWidget = bc->configureEnv.createConfigWidget();
= bc->aspect<ConfigureEnvironmentAspect>()->createConfigWidget();
configureEnvironmentAspectWidget->setContentsMargins(0, 0, 0, 0); configureEnvironmentAspectWidget->setContentsMargins(0, 0, 0, 0);
configureEnvironmentAspectWidget->layout()->setContentsMargins(0, 0, 0, 0); configureEnvironmentAspectWidget->layout()->setContentsMargins(0, 0, 0, 0);
Column { Column {
Form { Form {
buildDirAspect, br, buildDirAspect, br,
bc->aspect<BuildTypeAspect>(), br, bc->buildTypeAspect, br,
qmlDebugAspect qmlDebugAspect
}, },
m_warningMessageLabel, m_warningMessageLabel,
@@ -345,8 +343,8 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildSystem *bs) :
Column { Column {
cmakeConfiguration, cmakeConfiguration,
Row { Row {
bc->aspect<InitialCMakeArgumentsAspect>(), br, bc->initialCMakeArguments, br,
bc->aspect<AdditionalCMakeOptionsAspect>() bc->additionalCMakeOptions
}, },
m_reconfigureButton, m_reconfigureButton,
} }
@@ -506,14 +504,14 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildSystem *bs) :
updateInitialCMakeArguments(); updateInitialCMakeArguments();
}); });
connect(bc->aspect<InitialCMakeArgumentsAspect>(), connect(&bc->initialCMakeArguments,
&Utils::BaseAspect::labelLinkActivated, &Utils::BaseAspect::labelLinkActivated,
this, this,
[this](const QString &) { [this](const QString &) {
const CMakeTool *tool = CMakeKitAspect::cmakeTool(m_buildSystem->kit()); const CMakeTool *tool = CMakeKitAspect::cmakeTool(m_buildSystem->kit());
CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake.1.html#options"); CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake.1.html#options");
}); });
connect(bc->aspect<AdditionalCMakeOptionsAspect>(), connect(&bc->additionalCMakeOptions,
&Utils::BaseAspect::labelLinkActivated, this, [this](const QString &) { &Utils::BaseAspect::labelLinkActivated, this, [this](const QString &) {
const CMakeTool *tool = CMakeKitAspect::cmakeTool(m_buildSystem->kit()); const CMakeTool *tool = CMakeKitAspect::cmakeTool(m_buildSystem->kit());
CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake.1.html#options"); CMakeTool::openCMakeHelpUrl(tool, "%1/manual/cmake.1.html#options");
@@ -629,14 +627,14 @@ void CMakeBuildSettingsWidget::updateInitialCMakeArguments()
} }
} }
auto bc = m_buildSystem->buildConfiguration(); auto bc = m_buildSystem->cmakeBuildConfiguration();
bc->aspect<InitialCMakeArgumentsAspect>()->setCMakeConfiguration(initialList); bc->initialCMakeArguments.setCMakeConfiguration(initialList);
// value() will contain only the unknown arguments (the non -D/-U arguments) // value() will contain only the unknown arguments (the non -D/-U arguments)
// As the user would expect to have e.g. "--preset" from "Initial Configuration" // As the user would expect to have e.g. "--preset" from "Initial Configuration"
// to "Current Configuration" as additional parameters // to "Current Configuration" as additional parameters
m_buildSystem->setAdditionalCMakeArguments(ProcessArgs::splitArgs( m_buildSystem->setAdditionalCMakeArguments(ProcessArgs::splitArgs(
bc->aspect<InitialCMakeArgumentsAspect>()->value(), HostOsInfo::hostOs())); bc->initialCMakeArguments(), HostOsInfo::hostOs()));
} }
void CMakeBuildSettingsWidget::kitCMakeConfiguration() void CMakeBuildSettingsWidget::kitCMakeConfiguration()
@@ -759,12 +757,12 @@ void CMakeBuildSettingsWidget::updateButtonState()
const bool isInitial = isInitialConfiguration(); const bool isInitial = isInitialConfiguration();
m_resetButton->setEnabled(m_configModel->hasChanges(isInitial) && !isParsing); m_resetButton->setEnabled(m_configModel->hasChanges(isInitial) && !isParsing);
BuildConfiguration *bc = m_buildSystem->buildConfiguration(); CMakeBuildConfiguration *bc = m_buildSystem->cmakeBuildConfiguration();
bc->aspect<InitialCMakeArgumentsAspect>()->setVisible(isInitialConfiguration()); bc->initialCMakeArguments.setVisible(isInitialConfiguration());
bc->aspect<AdditionalCMakeOptionsAspect>()->setVisible(!isInitialConfiguration()); bc->additionalCMakeOptions.setVisible(!isInitialConfiguration());
bc->aspect<InitialCMakeArgumentsAspect>()->setEnabled(!isParsing); bc->initialCMakeArguments.setEnabled(!isParsing);
bc->aspect<AdditionalCMakeOptionsAspect>()->setEnabled(!isParsing); bc->additionalCMakeOptions.setEnabled(!isParsing);
// Update label and text boldness of the reconfigure button // Update label and text boldness of the reconfigure button
QFont reconfigureButtonFont = m_reconfigureButton->font(); QFont reconfigureButtonFont = m_reconfigureButton->font();
@@ -823,7 +821,7 @@ void CMakeBuildSettingsWidget::updateFromKit()
const QStringList additionalKitCMake = ProcessArgs::splitArgs( const QStringList additionalKitCMake = ProcessArgs::splitArgs(
CMakeConfigurationKitAspect::additionalConfiguration(k), HostOsInfo::hostOs()); CMakeConfigurationKitAspect::additionalConfiguration(k), HostOsInfo::hostOs());
const QStringList additionalInitialCMake = ProcessArgs::splitArgs( const QStringList additionalInitialCMake = ProcessArgs::splitArgs(
m_buildSystem->buildConfiguration()->aspect<InitialCMakeArgumentsAspect>()->value(), m_buildSystem->cmakeBuildConfiguration()->initialCMakeArguments(),
HostOsInfo::hostOs()); HostOsInfo::hostOs());
QStringList mergedArgumentList; QStringList mergedArgumentList;
@@ -832,8 +830,8 @@ void CMakeBuildSettingsWidget::updateFromKit()
additionalKitCMake.begin(), additionalKitCMake.begin(),
additionalKitCMake.end(), additionalKitCMake.end(),
std::back_inserter(mergedArgumentList)); std::back_inserter(mergedArgumentList));
m_buildSystem->buildConfiguration()->aspect<InitialCMakeArgumentsAspect>()->setValue( m_buildSystem->cmakeBuildConfiguration()->initialCMakeArguments
ProcessArgs::joinArgs(mergedArgumentList)); .setValue(ProcessArgs::joinArgs(mergedArgumentList));
} }
void CMakeBuildSettingsWidget::updateConfigurationStateIndex(int index) void CMakeBuildSettingsWidget::updateConfigurationStateIndex(int index)
@@ -1362,8 +1360,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id)
{ {
m_buildSystem = new CMakeBuildSystem(this); m_buildSystem = new CMakeBuildSystem(this);
const auto buildDirAspect = aspect<BuildDirectoryAspect>(); buildDir.setValueAcceptor(
buildDirAspect->setValueAcceptor(
[](const QString &oldDir, const QString &newDir) -> std::optional<QString> { [](const QString &oldDir, const QString &newDir) -> std::optional<QString> {
if (oldDir.isEmpty()) if (oldDir.isEmpty())
return newDir; return newDir;
@@ -1385,11 +1382,20 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id)
return newDir; return newDir;
}); });
auto initialCMakeArgumentsAspect = addAspect<InitialCMakeArgumentsAspect>(); // Will not be displayed, only persisted
initialCMakeArgumentsAspect->setMacroExpanderProvider([this] { return macroExpander(); }); sourceDirectory.setSettingsKey("CMake.Source.Directory");
auto additionalCMakeArgumentsAspect = addAspect<AdditionalCMakeOptionsAspect>(); buildTypeAspect.setSettingsKey(CMAKE_BUILD_TYPE);
additionalCMakeArgumentsAspect->setMacroExpanderProvider([this] { return macroExpander(); }); buildTypeAspect.setLabelText(Tr::tr("Build type:"));
buildTypeAspect.setDisplayStyle(StringAspect::LineEditDisplay);
buildTypeAspect.setDefaultValue("Unknown");
initialCMakeArguments.setMacroExpanderProvider([this] { return macroExpander(); });
additionalCMakeOptions.setSettingsKey("CMake.Additional.Options");
additionalCMakeOptions.setLabelText(Tr::tr("Additional CMake <a href=\"options\">options</a>:"));
additionalCMakeOptions.setDisplayStyle(StringAspect::LineEditDisplay);
additionalCMakeOptions.setMacroExpanderProvider([this] { return macroExpander(); });
macroExpander()->registerVariable(DEVELOPMENT_TEAM_FLAG, macroExpander()->registerVariable(DEVELOPMENT_TEAM_FLAG,
Tr::tr("The CMake flag for the development team"), Tr::tr("The CMake flag for the development team"),
@@ -1433,13 +1439,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id)
return QLatin1String(); return QLatin1String();
}); });
addAspect<SourceDirectoryAspect>(); qmlDebugging.setBuildConfiguration(this);
addAspect<BuildTypeAspect>();
auto qmlDebuggingAspect = addAspect<QtSupport::QmlDebuggingAspect>();
qmlDebuggingAspect->setBuildConfiguration(this);
addAspect<ConfigureEnvironmentAspect>(this);
setInitialBuildAndCleanSteps(target); setInitialBuildAndCleanSteps(target);
@@ -1450,10 +1450,6 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id)
const QString buildType = extraInfoMap.contains(CMAKE_BUILD_TYPE) const QString buildType = extraInfoMap.contains(CMAKE_BUILD_TYPE)
? extraInfoMap.value(CMAKE_BUILD_TYPE).toString() ? extraInfoMap.value(CMAKE_BUILD_TYPE).toString()
: info.typeName; : info.typeName;
const TriState qmlDebugging = extraInfoMap.contains(Constants::QML_DEBUG_SETTING)
? TriState::fromVariant(
extraInfoMap.value(Constants::QML_DEBUG_SETTING))
: TriState::Default;
CommandLine cmd = defaultInitialCMakeCommand(k, buildType); CommandLine cmd = defaultInitialCMakeCommand(k, buildType);
m_buildSystem->setIsMultiConfig(CMakeGeneratorKitAspect::isMultiConfigGenerator(k)); m_buildSystem->setIsMultiConfig(CMakeGeneratorKitAspect::isMultiConfigGenerator(k));
@@ -1545,15 +1541,17 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id)
} }
if (extraInfoMap.contains(Constants::CMAKE_HOME_DIR)) if (extraInfoMap.contains(Constants::CMAKE_HOME_DIR))
setSourceDirectory(FilePath::fromVariant(extraInfoMap.value(Constants::CMAKE_HOME_DIR))); sourceDirectory.setValue(FilePath::fromVariant(extraInfoMap.value(Constants::CMAKE_HOME_DIR)));
aspect<QtSupport::QmlDebuggingAspect>()->setValue(qmlDebugging); qmlDebugging.setValue(extraInfoMap.contains(Constants::QML_DEBUG_SETTING)
? TriState::fromVariant(extraInfoMap.value(Constants::QML_DEBUG_SETTING))
: TriState::Default);
if (qt && qt->isQmlDebuggingSupported()) if (qt && qt->isQmlDebuggingSupported())
cmd.addArg("-DCMAKE_CXX_FLAGS_INIT:STRING=%{" + QLatin1String(QT_QML_DEBUG_FLAG) + "}"); cmd.addArg("-DCMAKE_CXX_FLAGS_INIT:STRING=%{" + QLatin1String(QT_QML_DEBUG_FLAG) + "}");
CMakeProject *cmakeProject = static_cast<CMakeProject *>(target->project()); CMakeProject *cmakeProject = static_cast<CMakeProject *>(target->project());
aspect<ConfigureEnvironmentAspect>()->setUserEnvironmentChanges( configureEnv.setUserEnvironmentChanges(
getEnvironmentItemsFromCMakeConfigurePreset(cmakeProject, k)); getEnvironmentItemsFromCMakeConfigurePreset(cmakeProject, k));
QStringList initialCMakeArguments = cmd.splitArguments(); QStringList initialCMakeArguments = cmd.splitArguments();
@@ -1664,12 +1662,12 @@ QStringList CMakeBuildSystem::configurationChangesArguments(bool initialParamete
QStringList CMakeBuildSystem::initialCMakeArguments() const QStringList CMakeBuildSystem::initialCMakeArguments() const
{ {
return buildConfiguration()->aspect<InitialCMakeArgumentsAspect>()->allValues(); return cmakeBuildConfiguration()->initialCMakeArguments.allValues();
} }
CMakeConfig CMakeBuildSystem::initialCMakeConfiguration() const CMakeConfig CMakeBuildSystem::initialCMakeConfiguration() const
{ {
return buildConfiguration()->aspect<InitialCMakeArgumentsAspect>()->cmakeConfiguration(); return cmakeBuildConfiguration()->initialCMakeArguments.cmakeConfiguration();
} }
void CMakeBuildSystem::setConfigurationFromCMake(const CMakeConfig &config) void CMakeBuildSystem::setConfigurationFromCMake(const CMakeConfig &config)
@@ -1706,7 +1704,7 @@ void CMakeBuildSystem::clearError(ForceEnabledChanged fec)
void CMakeBuildSystem::setInitialCMakeArguments(const QStringList &args) void CMakeBuildSystem::setInitialCMakeArguments(const QStringList &args)
{ {
QStringList additionalArguments; QStringList additionalArguments;
buildConfiguration()->aspect<InitialCMakeArgumentsAspect>()->setAllValues(args.join('\n'), additionalArguments); cmakeBuildConfiguration()->initialCMakeArguments.setAllValues(args.join('\n'), additionalArguments);
// Set the unknown additional arguments also for the "Current Configuration" // Set the unknown additional arguments also for the "Current Configuration"
setAdditionalCMakeArguments(additionalArguments); setAdditionalCMakeArguments(additionalArguments);
@@ -1714,7 +1712,7 @@ void CMakeBuildSystem::setInitialCMakeArguments(const QStringList &args)
QStringList CMakeBuildSystem::additionalCMakeArguments() const QStringList CMakeBuildSystem::additionalCMakeArguments() const
{ {
return ProcessArgs::splitArgs(buildConfiguration()->aspect<AdditionalCMakeOptionsAspect>()->value(), return ProcessArgs::splitArgs(cmakeBuildConfiguration()->additionalCMakeOptions(),
HostOsInfo::hostOs()); HostOsInfo::hostOs());
} }
@@ -1727,8 +1725,8 @@ void CMakeBuildSystem::setAdditionalCMakeArguments(const QStringList &args)
[](const QString &s) { [](const QString &s) {
return !s.isEmpty(); return !s.isEmpty();
}); });
buildConfiguration()->aspect<AdditionalCMakeOptionsAspect>()->setValue( cmakeBuildConfiguration()->additionalCMakeOptions
ProcessArgs::joinArgs(nonEmptyAdditionalArguments)); .setValue(ProcessArgs::joinArgs(nonEmptyAdditionalArguments));
} }
void CMakeBuildSystem::filterConfigArgumentsFromAdditionalCMakeArguments() void CMakeBuildSystem::filterConfigArgumentsFromAdditionalCMakeArguments()
@@ -1738,12 +1736,12 @@ void CMakeBuildSystem::filterConfigArgumentsFromAdditionalCMakeArguments()
// which is already part of the CMake variables and should not be also // which is already part of the CMake variables and should not be also
// in the addtional CMake options // in the addtional CMake options
const QStringList arguments = ProcessArgs::splitArgs( const QStringList arguments = ProcessArgs::splitArgs(
buildConfiguration()->aspect<AdditionalCMakeOptionsAspect>()->value(), cmakeBuildConfiguration()->additionalCMakeOptions(),
HostOsInfo::hostOs()); HostOsInfo::hostOs());
QStringList unknownOptions; QStringList unknownOptions;
const CMakeConfig config = CMakeConfig::fromArguments(arguments, unknownOptions); const CMakeConfig config = CMakeConfig::fromArguments(arguments, unknownOptions);
buildConfiguration()->aspect<AdditionalCMakeOptionsAspect>()->setValue(ProcessArgs::joinArgs(unknownOptions)); cmakeBuildConfiguration()->additionalCMakeOptions.setValue(ProcessArgs::joinArgs(unknownOptions));
} }
void CMakeBuildSystem::setError(const QString &message) void CMakeBuildSystem::setError(const QString &message)
@@ -2038,16 +2036,6 @@ BuildSystem *CMakeBuildConfiguration::buildSystem() const
return m_buildSystem; return m_buildSystem;
} }
void CMakeBuildConfiguration::setSourceDirectory(const FilePath &path)
{
aspect<SourceDirectoryAspect>()->setValue(path);
}
FilePath CMakeBuildConfiguration::sourceDirectory() const
{
return aspect<SourceDirectoryAspect>()->filePath();
}
void CMakeBuildConfiguration::addToEnvironment(Utils::Environment &env) const void CMakeBuildConfiguration::addToEnvironment(Utils::Environment &env) const
{ {
const CMakeTool *tool = CMakeKitAspect::cmakeTool(kit()); const CMakeTool *tool = CMakeKitAspect::cmakeTool(kit());
@@ -2062,7 +2050,7 @@ void CMakeBuildConfiguration::addToEnvironment(Utils::Environment &env) const
Environment CMakeBuildConfiguration::configureEnvironment() const Environment CMakeBuildConfiguration::configureEnvironment() const
{ {
Environment env = aspect<ConfigureEnvironmentAspect>()->environment(); Environment env = configureEnv.environment();
addToEnvironment(env); addToEnvironment(env);
return env; return env;
@@ -2082,7 +2070,7 @@ QString CMakeBuildSystem::cmakeBuildType() const
if (!isMultiConfig()) if (!isMultiConfig())
setBuildTypeFromConfig(configurationChanges()); setBuildTypeFromConfig(configurationChanges());
QString cmakeBuildType = buildConfiguration()->aspect<BuildTypeAspect>()->value(); QString cmakeBuildType = cmakeBuildConfiguration()->buildTypeAspect();
const Utils::FilePath cmakeCacheTxt = buildConfiguration()->buildDirectory().pathAppended("CMakeCache.txt"); const Utils::FilePath cmakeCacheTxt = buildConfiguration()->buildDirectory().pathAppended("CMakeCache.txt");
const bool hasCMakeCache = cmakeCacheTxt.exists(); const bool hasCMakeCache = cmakeCacheTxt.exists();
@@ -2109,7 +2097,7 @@ QString CMakeBuildSystem::cmakeBuildType() const
void CMakeBuildSystem::setCMakeBuildType(const QString &cmakeBuildType, bool quiet) void CMakeBuildSystem::setCMakeBuildType(const QString &cmakeBuildType, bool quiet)
{ {
auto aspect = buildConfiguration()->aspect<BuildTypeAspect>(); auto aspect = &cmakeBuildConfiguration()->buildTypeAspect;
if (quiet) if (quiet)
aspect->setValueQuietly(cmakeBuildType); aspect->setValueQuietly(cmakeBuildType);
else else
@@ -2195,52 +2183,21 @@ void InitialCMakeArgumentsAspect::toMap(QVariantMap &map) const
saveToMap(map, allValues().join('\n'), defaultValue(), settingsKey()); saveToMap(map, allValues().join('\n'), defaultValue(), settingsKey());
} }
InitialCMakeArgumentsAspect::InitialCMakeArgumentsAspect() InitialCMakeArgumentsAspect::InitialCMakeArgumentsAspect(AspectContainer *container)
: StringAspect(container)
{ {
setSettingsKey("CMake.Initial.Parameters"); setSettingsKey("CMake.Initial.Parameters");
setLabelText(Tr::tr("Additional CMake <a href=\"options\">options</a>:")); setLabelText(Tr::tr("Additional CMake <a href=\"options\">options</a>:"));
setDisplayStyle(LineEditDisplay); setDisplayStyle(LineEditDisplay);
} }
// ----------------------------------------------------------------------
// - AdditionalCMakeOptionsAspect:
// ----------------------------------------------------------------------
AdditionalCMakeOptionsAspect::AdditionalCMakeOptionsAspect()
{
setSettingsKey("CMake.Additional.Options");
setLabelText(Tr::tr("Additional CMake <a href=\"options\">options</a>:"));
setDisplayStyle(LineEditDisplay);
}
// -----------------------------------------------------------------------------
// SourceDirectoryAspect:
// -----------------------------------------------------------------------------
SourceDirectoryAspect::SourceDirectoryAspect()
{
// Will not be displayed, only persisted
setSettingsKey("CMake.Source.Directory");
}
// -----------------------------------------------------------------------------
// BuildTypeAspect:
// -----------------------------------------------------------------------------
BuildTypeAspect::BuildTypeAspect()
{
setSettingsKey(CMAKE_BUILD_TYPE);
setLabelText(Tr::tr("Build type:"));
setDisplayStyle(LineEditDisplay);
setDefaultValue("Unknown");
}
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// ConfigureEnvironmentAspect: // ConfigureEnvironmentAspect:
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
class ConfigureEnvironmentAspectWidget final : public ProjectExplorer::EnvironmentAspectWidget class ConfigureEnvironmentAspectWidget final : public EnvironmentAspectWidget
{ {
public: public:
ConfigureEnvironmentAspectWidget(ConfigureEnvironmentAspect *aspect, ConfigureEnvironmentAspectWidget(ConfigureEnvironmentAspect *aspect, Target *target)
ProjectExplorer::Target *target)
: EnvironmentAspectWidget(aspect) : EnvironmentAspectWidget(aspect)
{ {
envWidget()->setOpenTerminalFunc([target](const Environment &env) { envWidget()->setOpenTerminalFunc([target](const Environment &env) {
@@ -2250,7 +2207,9 @@ public:
} }
}; };
ConfigureEnvironmentAspect::ConfigureEnvironmentAspect(BuildConfiguration *bc) ConfigureEnvironmentAspect::ConfigureEnvironmentAspect(AspectContainer *container,
BuildConfiguration *bc)
: EnvironmentAspect(container)
{ {
Target *target = bc->target(); Target *target = bc->target();
setIsLocal(true); setIsLocal(true);

View File

@@ -10,6 +10,8 @@
#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/environmentaspect.h> #include <projectexplorer/environmentaspect.h>
#include <qtsupport/qtbuildaspects.h>
namespace CMakeProjectManager { namespace CMakeProjectManager {
class CMakeProject; class CMakeProject;
@@ -19,6 +21,33 @@ class CMakeBuildSystem;
class CMakeBuildSettingsWidget; class CMakeBuildSettingsWidget;
class CMakeProjectImporter; class CMakeProjectImporter;
class InitialCMakeArgumentsAspect final : public Utils::StringAspect
{
public:
InitialCMakeArgumentsAspect(Utils::AspectContainer *container);
const CMakeConfig &cmakeConfiguration() const;
const QStringList allValues() const;
void setAllValues(const QString &values, QStringList &additionalArguments);
void setCMakeConfiguration(const CMakeConfig &config);
void fromMap(const QVariantMap &map) final;
void toMap(QVariantMap &map) const final;
private:
CMakeConfig m_cmakeConfiguration;
};
class ConfigureEnvironmentAspect final: public ProjectExplorer::EnvironmentAspect
{
public:
ConfigureEnvironmentAspect(Utils::AspectContainer *container,
ProjectExplorer::BuildConfiguration *buildConfig);
void fromMap(const QVariantMap &map);
void toMap(QVariantMap &map) const;
};
} // namespace Internal } // namespace Internal
class CMAKE_EXPORT CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration class CMAKE_EXPORT CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration
@@ -39,13 +68,18 @@ public:
void buildTarget(const QString &buildTarget); void buildTarget(const QString &buildTarget);
ProjectExplorer::BuildSystem *buildSystem() const final; ProjectExplorer::BuildSystem *buildSystem() const final;
void setSourceDirectory(const Utils::FilePath& path);
Utils::FilePath sourceDirectory() const;
void addToEnvironment(Utils::Environment &env) const override; void addToEnvironment(Utils::Environment &env) const override;
Utils::Environment configureEnvironment() const; Utils::Environment configureEnvironment() const;
ProjectExplorer::BuildDirectoryAspect buildDir{this};
Internal::InitialCMakeArgumentsAspect initialCMakeArguments{this};
Utils::StringAspect additionalCMakeOptions{this};
Utils::FilePathAspect sourceDirectory{this};
Utils::StringAspect buildTypeAspect{this};
QtSupport::QmlDebuggingAspect qmlDebugging{this};
Internal::ConfigureEnvironmentAspect configureEnv{this, this};
signals: signals:
void signingFlagsChanged(); void signingFlagsChanged();
void configureEnvironmentChanged(); void configureEnvironmentChanged();
@@ -94,59 +128,4 @@ private:
friend class Internal::CMakeProjectImporter; friend class Internal::CMakeProjectImporter;
}; };
namespace Internal {
class InitialCMakeArgumentsAspect final : public Utils::StringAspect
{
Q_OBJECT
CMakeConfig m_cmakeConfiguration;
public:
InitialCMakeArgumentsAspect();
const CMakeConfig &cmakeConfiguration() const;
const QStringList allValues() const;
void setAllValues(const QString &values, QStringList &additionalArguments);
void setCMakeConfiguration(const CMakeConfig &config);
void fromMap(const QVariantMap &map) final;
void toMap(QVariantMap &map) const final;
};
class AdditionalCMakeOptionsAspect final : public Utils::StringAspect
{
Q_OBJECT
public:
AdditionalCMakeOptionsAspect();
};
class SourceDirectoryAspect final : public Utils::FilePathAspect
{
Q_OBJECT
public:
SourceDirectoryAspect();
};
class BuildTypeAspect final : public Utils::StringAspect
{
Q_OBJECT
public:
BuildTypeAspect();
};
class ConfigureEnvironmentAspect final: public ProjectExplorer::EnvironmentAspect
{
Q_OBJECT
public:
explicit ConfigureEnvironmentAspect(ProjectExplorer::BuildConfiguration *buildConfig);
void fromMap(const QVariantMap &map);
void toMap(QVariantMap &map) const;
};
} // namespace Internal
} // namespace CMakeProjectManager } // namespace CMakeProjectManager

View File

@@ -1743,10 +1743,9 @@ void CMakeBuildSystem::runGenerator(Id id)
} }
for (const CMakeConfigItem &item : std::as_const(configItems)) for (const CMakeConfigItem &item : std::as_const(configItems))
cmdLine.addArg(item.toArgument(buildConfiguration()->macroExpander())); cmdLine.addArg(item.toArgument(buildConfiguration()->macroExpander()));
if (const auto optionsAspect = buildConfiguration()->aspect<AdditionalCMakeOptionsAspect>();
optionsAspect && !optionsAspect->value().isEmpty()) { cmdLine.addArgs(cmakeBuildConfiguration()->additionalCMakeOptions(), CommandLine::Raw);
cmdLine.addArgs(optionsAspect->value(), CommandLine::Raw);
}
const auto proc = new Process(this); const auto proc = new Process(this);
connect(proc, &Process::done, proc, &Process::deleteLater); connect(proc, &Process::done, proc, &Process::deleteLater);
connect(proc, &Process::readyReadStandardOutput, this, [proc] { connect(proc, &Process::readyReadStandardOutput, this, [proc] {