diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 91de7766c7d..c6736d4a9a9 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -1956,19 +1956,8 @@ CMakeBuildConfigurationFactory::CMakeBuildConfigurationFactory() // Skip the default shadow build directories for build types if we have presets const CMakeConfigItem presetItem = CMakeConfigurationKitAspect::cmakePresetConfigItem(k); - if (!presetItem.isNull()) { - const QString presetName = presetItem.expandedValue(k); - const auto project = qobject_cast(SessionManager::startupProject()); - - PresetsDetails::ConfigurePreset configurePreset - = Utils::findOrDefault(project->presetsData().configurePresets, - [&presetName] (const PresetsDetails::ConfigurePreset &preset) { - return preset.name == presetName; - }); - - if (configurePreset.binaryDir) - return result; - } + if (!presetItem.isNull()) + return result; for (int type = BuildTypeDebug; type != BuildTypeLast; ++type) { BuildInfo info = createBuildInfo(BuildType(type)); diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index e870b787bc9..bbea21567ee 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -453,14 +453,12 @@ QList CMakeProjectImporter::examineDirectory(const FilePath &importPath, if (configurePreset.toolset && configurePreset.toolset.value().value) data->toolset = configurePreset.toolset.value().value.value(); - QString binaryDir = importPath.toString(); if (configurePreset.binaryDir) { - binaryDir = configurePreset.binaryDir.value(); + QString binaryDir = configurePreset.binaryDir.value(); CMakePresets::Macros::expand(configurePreset, env, projectDirectory(), binaryDir); + data->buildDirectory = Utils::FilePath::fromString(binaryDir); } - data->buildDirectory = Utils::FilePath::fromString(binaryDir); - CMakePresets::Macros::updateToolchainFile(configurePreset, env, projectDirectory(), @@ -566,9 +564,24 @@ QList CMakeProjectImporter::examineDirectory(const FilePath &importPath, return result; } +void CMakeProjectImporter::ensureBuildDirectory(DirectoryData &data, const Kit *k) const +{ + if (!data.buildDirectory.isEmpty()) + return; + + const auto cmakeBuildType = CMakeBuildConfigurationFactory::buildTypeFromByteArray( + data.cmakeBuildType); + auto buildInfo = CMakeBuildConfigurationFactory::createBuildInfo(cmakeBuildType); + + data.buildDirectory = CMakeBuildConfiguration::shadowBuildDirectory(projectFilePath(), + k, + buildInfo.typeName, + buildInfo.buildType); +} + bool CMakeProjectImporter::matchKit(void *directoryData, const Kit *k) const { - const DirectoryData *data = static_cast(directoryData); + DirectoryData *data = static_cast(directoryData); CMakeTool *cm = CMakeKitAspect::cmakeTool(k); if (!cm || cm->cmakeExecutable() != data->cmakeBinary) @@ -600,6 +613,8 @@ bool CMakeProjectImporter::matchKit(void *directoryData, const Kit *k) const auto presetConfigItem = CMakeConfigurationKitAspect::cmakePresetConfigItem(k); if (data->cmakePreset != presetConfigItem.expandedValue(k)) return false; + + ensureBuildDirectory(*data, k); } qCDebug(cmInputLog) << k->displayName() @@ -609,7 +624,7 @@ bool CMakeProjectImporter::matchKit(void *directoryData, const Kit *k) const Kit *CMakeProjectImporter::createKit(void *directoryData) const { - const DirectoryData *data = static_cast(directoryData); + DirectoryData *data = static_cast(directoryData); return QtProjectImporter::createTemporaryKit(data->qt, [&data, this](Kit *k) { const CMakeToolData cmtd = findOrCreateCMakeTool(data->cmakeBinary); @@ -629,6 +644,8 @@ Kit *CMakeProjectImporter::createKit(void *directoryData) const CMakeConfigurationKitAspect::setCMakePreset(k, data->cmakePreset); } + if (!data->cmakePreset.isEmpty()) + ensureBuildDirectory(*data, k); SysRootKitAspect::setSysRoot(k, data->sysroot); diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h index f4f66d47faa..2aefe036fcd 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h @@ -14,6 +14,8 @@ class CMakeTool; namespace Internal { +struct DirectoryData; + class CMakeProjectImporter : public QtSupport::QtProjectImporter { public: @@ -39,6 +41,8 @@ private: void cleanupTemporaryCMake(ProjectExplorer::Kit *k, const QVariantList &vl); void persistTemporaryCMake(ProjectExplorer::Kit *k, const QVariantList &vl); + void ensureBuildDirectory(DirectoryData &data, const ProjectExplorer::Kit *k) const; + Internal::PresetsData m_presetsData; Utils::TemporaryDirectory m_presetsTempDir; }; diff --git a/tests/manual/cmakepresets/CMakePresets.json b/tests/manual/cmakepresets/CMakePresets.json index 5e9d149b8bb..976f44832ac 100644 --- a/tests/manual/cmakepresets/CMakePresets.json +++ b/tests/manual/cmakepresets/CMakePresets.json @@ -10,7 +10,6 @@ "name": "mingw", "displayName": "MinGW 11.2.0", "generator": "Ninja", - "binaryDir": "${sourceDir}/build-${presetName}-release", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", "CMAKE_PREFIX_PATH": "c:/Qt/6.3.2/mingw_64" @@ -29,6 +28,7 @@ }, { "name": "mingw-make", + "binaryDir": "${sourceDir}/build-${presetName}-release", "displayName": "MinGW 11.2.0 Makefiles", "generator": "MinGW Makefiles", "inherits" : "mingw"