Merge remote-tracking branch 'origin/10.0'

Change-Id: Ie591b7130b33a042509e56701384f8ff4d9cb7f8
This commit is contained in:
Eike Ziller
2023-03-16 11:57:01 +01:00
42 changed files with 41567 additions and 40656 deletions

View File

@@ -665,12 +665,15 @@ void CMakeBuildSettingsWidget::kitCMakeConfiguration()
auto layout = new QGridLayout(dialog);
kitAspect.createConfigWidget(m_buildSystem->kit())
->addToLayoutWithLabel(layout->parentWidget());
generatorAspect.createConfigWidget(m_buildSystem->kit())
->addToLayoutWithLabel(layout->parentWidget());
configurationKitAspect.createConfigWidget(m_buildSystem->kit())
->addToLayoutWithLabel(layout->parentWidget());
KitAspectWidget *widget = kitAspect.createConfigWidget(m_buildSystem->kit());
widget->setParent(dialog);
widget->addToLayoutWithLabel(layout->parentWidget());
widget = generatorAspect.createConfigWidget(m_buildSystem->kit());
widget->setParent(dialog);
widget->addToLayoutWithLabel(layout->parentWidget());
widget = configurationKitAspect.createConfigWidget(m_buildSystem->kit());
widget->setParent(dialog);
widget->addToLayoutWithLabel(layout->parentWidget());
layout->setColumnStretch(1, 1);
@@ -1175,6 +1178,12 @@ static void addCMakeConfigurePresetToInitialArguments(QStringList &initialArgume
initialArguments.removeIf(
[presetArgument](const QString &item) { return item == presetArgument; });
// Remove the -DQTC_KIT_DEFAULT_CONFIG_HASH argument
const QString presetHashArgument
= CMakeConfigurationKitAspect::kitDefaultConfigHashItem(k).toArgument();
initialArguments.removeIf(
[presetHashArgument](const QString &item) { return item == presetHashArgument; });
PresetsDetails::ConfigurePreset configurePreset
= Utils::findOrDefault(project->presetsData().configurePresets,
[presetName](const PresetsDetails::ConfigurePreset &preset) {

View File

@@ -209,12 +209,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);
}

View File

@@ -710,7 +710,10 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
data->cmakePresetDefaultConfigHash
= CMakeConfigurationKitAspect::computeDefaultConfigHash(config, data->cmakeBinary);
QByteArrayList buildConfigurationTypes = {cache.valueOf("CMAKE_BUILD_TYPE")};
QString cmakeBuildType = QString::fromUtf8(cache.valueOf("CMAKE_BUILD_TYPE"));
CMakePresets::Macros::expand(configurePreset, env, projectDirectory(), cmakeBuildType);
QByteArrayList buildConfigurationTypes = {cmakeBuildType.toUtf8()};
if (buildConfigurationTypes.front().isEmpty()) {
buildConfigurationTypes.clear();
QByteArray buildConfigurationTypesString = cache.valueOf("CMAKE_CONFIGURATION_TYPES");

View File

@@ -7,6 +7,7 @@
#include <utils/environment.h>
#include <utils/filepath.h>
#include <utils/hostosinfo.h>
#include <utils/osspecificaspects.h>
using namespace Utils;
@@ -40,10 +41,13 @@ static void expandAllButEnv(const PresetsDetails::ConfigurePreset &preset,
value.replace("${sourceDirName}", sourceDirectory.fileName());
value.replace("${presetName}", preset.name);
value.replace("${fileDir}", preset.fileDir.path());
if (preset.generator)
value.replace("${generator}", preset.generator.value());
value.replace("${hostSystemName}", getHostSystemName(sourceDirectory.osType()));
value.replace("${pathListSep}",
Utils::OsSpecificAspects::pathListSeparator(sourceDirectory.osType()));
}
static void expandAllButEnv(const PresetsDetails::BuildPreset &preset,
@@ -53,10 +57,13 @@ static void expandAllButEnv(const PresetsDetails::BuildPreset &preset,
value.replace("${dollar}", "$");
value.replace("${sourceDir}", sourceDirectory.toString());
value.replace("${fileDir}", preset.fileDir.path());
value.replace("${sourceParentDir}", sourceDirectory.parentDir().toString());
value.replace("${sourceDirName}", sourceDirectory.fileName());
value.replace("${presetName}", preset.name);
value.replace("${pathListSep}",
Utils::OsSpecificAspects::pathListSeparator(sourceDirectory.osType()));
}
static QString expandMacroEnv(const QString &macroPrefix,

View File

@@ -36,6 +36,22 @@ bool parseCMakeMinimumRequired(const QJsonValue &jsonValue, QVersionNumber &vers
return true;
}
std::optional<QStringList> parseInclude(const QJsonValue &jsonValue)
{
std::optional<QStringList> includes;
if (!jsonValue.isUndefined()) {
if (jsonValue.isArray()) {
includes = QStringList();
const QJsonArray includeArray = jsonValue.toArray();
for (const QJsonValue &includeValue : includeArray)
includes.value() << includeValue.toString();
}
}
return includes;
}
std::optional<PresetsDetails::Condition> parseCondition(const QJsonValue &jsonValue)
{
std::optional<PresetsDetails::Condition> condition;
@@ -133,7 +149,8 @@ std::optional<PresetsDetails::Condition> parseCondition(const QJsonValue &jsonVa
}
bool parseConfigurePresets(const QJsonValue &jsonValue,
QList<PresetsDetails::ConfigurePreset> &configurePresets)
QList<PresetsDetails::ConfigurePreset> &configurePresets,
const Utils::FilePath &fileDir)
{
// The whole section is optional
if (jsonValue.isUndefined())
@@ -151,6 +168,7 @@ bool parseConfigurePresets(const QJsonValue &jsonValue,
PresetsDetails::ConfigurePreset preset;
preset.name = object.value("name").toString();
preset.fileDir = fileDir;
preset.hidden = object.value("hidden").toBool();
QJsonValue inherits = object.value("inherits");
@@ -291,7 +309,8 @@ bool parseConfigurePresets(const QJsonValue &jsonValue,
}
bool parseBuildPresets(const QJsonValue &jsonValue,
QList<PresetsDetails::BuildPreset> &buildPresets)
QList<PresetsDetails::BuildPreset> &buildPresets,
const Utils::FilePath &fileDir)
{
// The whole section is optional
if (jsonValue.isUndefined())
@@ -309,6 +328,7 @@ bool parseBuildPresets(const QJsonValue &jsonValue,
PresetsDetails::BuildPreset preset;
preset.name = object.value("name").toString();
preset.fileDir = fileDir;
preset.hidden = object.value("hidden").toBool();
QJsonValue inherits = object.value("inherits");
@@ -416,6 +436,8 @@ bool PresetsParser::parse(const Utils::FilePath &jsonFile, QString &errorMessage
QJsonObject root = jsonDoc.object();
m_presetsData.fileDir = jsonFile.parentDir();
if (!parseVersion(root.value("version"), m_presetsData.version)) {
errorMessage = Tr::tr("Invalid \"version\" in file \"%1\".").arg(jsonFile.fileName());
return false;
@@ -426,14 +448,21 @@ bool PresetsParser::parse(const Utils::FilePath &jsonFile, QString &errorMessage
m_presetsData.cmakeMinimimRequired);
// optional
if (!parseConfigurePresets(root.value("configurePresets"), m_presetsData.configurePresets)) {
m_presetsData.include = parseInclude(root.value("include"));
// optional
if (!parseConfigurePresets(root.value("configurePresets"),
m_presetsData.configurePresets,
jsonFile.parentDir())) {
errorMessage
= Tr::tr("Invalid \"configurePresets\" section in %1 file").arg(jsonFile.fileName());
return false;
}
// optional
if (!parseBuildPresets(root.value("buildPresets"), m_presetsData.buildPresets)) {
if (!parseBuildPresets(root.value("buildPresets"),
m_presetsData.buildPresets,
jsonFile.parentDir())) {
errorMessage
= Tr::tr("Invalid \"buildPresets\" section in %1 file").arg(jsonFile.fileName());
return false;

View File

@@ -90,6 +90,7 @@ public:
void inheritFrom(const ConfigurePreset &other);
QString name;
Utils::FilePath fileDir;
std::optional<bool> hidden = false;
std::optional<QStringList> inherits;
std::optional<Condition> condition;
@@ -115,6 +116,7 @@ public:
void inheritFrom(const BuildPreset &other);
QString name;
Utils::FilePath fileDir;
std::optional<bool> hidden = false;
std::optional<QStringList> inherits;
std::optional<Condition> condition;
@@ -140,6 +142,8 @@ public:
int version = 0;
QVersionNumber cmakeMinimimRequired;
QHash<QString, QString> vendor;
std::optional<QStringList> include;
Utils::FilePath fileDir;
QList<PresetsDetails::ConfigurePreset> configurePresets;
QList<PresetsDetails::BuildPreset> buildPresets;
};