CMakePM: Add/remove CMake parameter for "Package manager auto Setup"

The CMake parameter is CMAKE_PROJECT_INCLUDE_BEFORE used in the "Initial
Configuration".

This commit will add or remove the above parameter in the "Initial
Configuration" list.

Previously, the parameter would have been added only on the first time.
Now with project CMake settings this is needed also for already
configured projects.

Change-Id: I7293032ef3e7e6e0ad0b51c68ef5fbe0cab48919
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Cristian Adam
2024-05-23 16:17:57 +02:00
parent b4d345db2a
commit 322944469f

View File

@@ -42,7 +42,6 @@
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/projectexplorertr.h>
#include <projectexplorer/projectmanager.h>
#include <projectexplorer/projecttree.h>
#include <projectexplorer/target.h>
#include <projectexplorer/taskhub.h>
@@ -129,6 +128,7 @@ private:
void kitCMakeConfiguration();
void updateConfigureDetailsWidgetsSummary(
const QStringList &configurationArguments = QStringList());
void updatePackageManagerAutoSetup(CMakeConfig &initialList);
CMakeBuildConfiguration *m_buildConfig;
QTreeView *m_configView;
@@ -167,6 +167,16 @@ static QModelIndex mapToSource(const QAbstractItemView *view, const QModelIndex
return result;
}
static CMakeConfigItem getPackageManagerAutoSetupParameter()
{
const QByteArray key("CMAKE_PROJECT_INCLUDE_BEFORE");
const QByteArray value = QString(
"%{BuildConfig:BuildDirectory:NativeFilePath}/%1/auto-setup.cmake")
.arg(Constants::PACKAGE_MANAGER_DIR)
.toUtf8();
return CMakeConfigItem(key, CMakeConfigItem::FILEPATH, value);
}
CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) :
NamedWidget(Tr::tr("CMake")),
m_buildConfig(bc),
@@ -605,6 +615,24 @@ void CMakeBuildSettingsWidget::reconfigureWithInitialParameters()
m_buildConfig->cmakeBuildSystem()->runCMake();
}
void CMakeBuildSettingsWidget::updatePackageManagerAutoSetup(CMakeConfig &initialList)
{
const bool usePackageManagerAutoSetup
= settings(m_buildConfig->project()).packageManagerAutoSetup();
const auto autoSetupParameter = getPackageManagerAutoSetupParameter();
auto it
= std::find_if(initialList.begin(), initialList.end(), [&autoSetupParameter](const CMakeConfigItem &item) {
return item.key == autoSetupParameter.key;
});
if (it != initialList.end()) {
if (!usePackageManagerAutoSetup && it->value == autoSetupParameter.value)
initialList.erase(it);
} else if (usePackageManagerAutoSetup) {
initialList.push_back(autoSetupParameter);
}
}
void CMakeBuildSettingsWidget::updateInitialCMakeArguments()
{
CMakeConfig initialList = m_buildConfig->initialCMakeArguments.cmakeConfiguration();
@@ -638,6 +666,8 @@ void CMakeBuildSettingsWidget::updateInitialCMakeArguments()
}
}
updatePackageManagerAutoSetup(initialList);
m_buildConfig->initialCMakeArguments.setCMakeConfiguration(initialList);
// value() will contain only the unknown arguments (the non -D/-U arguments)
@@ -1115,7 +1145,8 @@ static bool isWindowsARM64(const Kit *k)
&& targetAbi.wordWidth() == 64;
}
static CommandLine defaultInitialCMakeCommand(const Kit *k, const QString &buildType)
static CommandLine defaultInitialCMakeCommand(
const Kit *k, Project *project, const QString &buildType)
{
// Generator:
CMakeTool *tool = CMakeKitAspect::cmakeTool(k);
@@ -1129,11 +1160,8 @@ static CommandLine defaultInitialCMakeCommand(const Kit *k, const QString &build
cmd.addArg("-DCMAKE_BUILD_TYPE:STRING=" + buildType);
// Package manager auto setup
if (settings(ProjectTree::currentProject()).packageManagerAutoSetup()) {
cmd.addArg(QString("-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH="
"%{BuildConfig:BuildDirectory:NativeFilePath}/%1/auto-setup.cmake")
.arg(Constants::PACKAGE_MANAGER_DIR));
}
if (settings(project).packageManagerAutoSetup())
cmd.addArg(getPackageManagerAutoSetupParameter().toArgument());
// Cross-compilation settings:
if (!CMakeBuildConfiguration::isIos(k)) { // iOS handles this differently
@@ -1456,7 +1484,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id)
? extraInfoMap.value(CMAKE_BUILD_TYPE).toString()
: info.typeName;
CommandLine cmd = defaultInitialCMakeCommand(k, buildType);
CommandLine cmd = defaultInitialCMakeCommand(k, target->project(), buildType);
m_buildSystem->setIsMultiConfig(CMakeGeneratorKitAspect::isMultiConfigGenerator(k));
// Android magic: