CMakePM: Add include presets support

Fixes: QTCREATORBUG-28894
Change-Id: I9359cb85c230f2db02f08427af9832f168a32c41
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Cristian Adam
2023-03-14 14:24:21 +01:00
parent 25f1a4804a
commit 15e1a64764
7 changed files with 220 additions and 121 deletions

View File

@@ -208,12 +208,51 @@ void CMakeProject::readPresets()
return data;
};
std::function<void(Internal::PresetsData & presetData, Utils::FilePaths & inclueStack)>
resolveIncludes = [&](Internal::PresetsData &presetData, Utils::FilePaths &includeStack) {
if (presetData.include) {
for (const QString &path : presetData.include.value()) {
Utils::FilePath includePath = Utils::FilePath::fromUserInput(path);
if (!includePath.isAbsolutePath())
includePath = presetData.fileDir.resolvePath(path);
Internal::PresetsData includeData = parsePreset(includePath);
if (includeData.include) {
if (includeStack.contains(includePath)) {
TaskHub::addTask(BuildSystemTask(
Task::TaskType::Warning,
Tr::tr("Attempt to include %1 which was already parsed.")
.arg(includePath.path()),
Utils::FilePath(),
-1));
TaskHub::requestPopup();
} else {
resolveIncludes(includeData, includeStack);
}
}
presetData.configurePresets = includeData.configurePresets
+ presetData.configurePresets;
presetData.buildPresets = includeData.buildPresets + presetData.buildPresets;
includeStack << includePath;
}
}
};
const Utils::FilePath cmakePresetsJson = projectDirectory().pathAppended("CMakePresets.json");
const Utils::FilePath cmakeUserPresetsJson = projectDirectory().pathAppended("CMakeUserPresets.json");
Internal::PresetsData cmakePresetsData = parsePreset(cmakePresetsJson);
Internal::PresetsData cmakeUserPresetsData = parsePreset(cmakeUserPresetsJson);
// resolve the include
Utils::FilePaths includeStack = {cmakePresetsJson};
resolveIncludes(cmakePresetsData, includeStack);
includeStack = {cmakeUserPresetsJson};
resolveIncludes(cmakeUserPresetsData, includeStack);
m_presetsData = combinePresets(cmakePresetsData, cmakeUserPresetsData);
setupBuildPresets(m_presetsData);
}