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