mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-09-25 04:09:36 +03:00
Add workflow and per-type defined values to cmake --list-presets. Each -defined value lists every non-hidden preset of the selected type and explains why unavailable presets cannot be used. The defined value is an alias for configure-defined. Support --list-presets=defined in cmake build and workflow modes, ctest, and cpack. Propagate configure preset unavailability to dependent build, test, package, and workflow presets. Fixes: #28016, #26118
126 lines
2.8 KiB
C++
126 lines
2.8 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file LICENSE.rst or https://cmake.org/licensing for details. */
|
|
#pragma once
|
|
|
|
#include <string>
|
|
|
|
#include <cm/optional>
|
|
|
|
#include "cmCMakePresetsGraph.h"
|
|
|
|
class cmCMakePresetsArgsBase
|
|
{
|
|
public:
|
|
using PresetListMode = cmCMakePresetsGraph::PresetListMode;
|
|
|
|
virtual ~cmCMakePresetsArgsBase() = default;
|
|
|
|
virtual bool HasPresetsArg() const { return !this->PresetName.empty(); };
|
|
virtual void Clear() { this->PresetName.clear(); }
|
|
|
|
static PresetListMode ParseListPresetsMode(std::string& type)
|
|
{
|
|
struct DefinedPresetType
|
|
{
|
|
char const* Type;
|
|
char const* BaseType;
|
|
};
|
|
static constexpr DefinedPresetType definedPresetTypes[] = {
|
|
{ "defined", "" },
|
|
{ "configure-defined", "configure" },
|
|
{ "build-defined", "build" },
|
|
{ "test-defined", "test" },
|
|
{ "package-defined", "package" },
|
|
{ "workflow-defined", "workflow" },
|
|
{ "all-defined", "all" },
|
|
};
|
|
|
|
for (auto const& definedPresetType : definedPresetTypes) {
|
|
if (type == definedPresetType.Type) {
|
|
type = definedPresetType.BaseType;
|
|
return PresetListMode::Defined;
|
|
}
|
|
}
|
|
return PresetListMode::Available;
|
|
}
|
|
|
|
std::string PresetName;
|
|
std::string PresetsFile;
|
|
|
|
protected:
|
|
cmCMakePresetsArgsBase() = default;
|
|
};
|
|
|
|
class cmCMakePresetsArgs : public cmCMakePresetsArgsBase
|
|
{
|
|
public:
|
|
bool HasPresetsArg() const override
|
|
{
|
|
return this->cmCMakePresetsArgsBase::HasPresetsArg() ||
|
|
this->ListPresetsMode.has_value();
|
|
}
|
|
|
|
void Clear() override
|
|
{
|
|
this->cmCMakePresetsArgsBase::Clear();
|
|
this->ListPresetsMode.reset();
|
|
}
|
|
|
|
bool SetListPresets(std::string const& value)
|
|
{
|
|
std::string type = value;
|
|
auto const mode = ParseListPresetsMode(type);
|
|
if (!type.empty()) {
|
|
this->Clear();
|
|
return false;
|
|
}
|
|
this->ListPresetsMode = mode;
|
|
return true;
|
|
}
|
|
|
|
cm::optional<PresetListMode> ListPresetsMode;
|
|
};
|
|
|
|
class cmCMakePresetsConfigureArgs : public cmCMakePresetsArgsBase
|
|
{
|
|
public:
|
|
enum class ListPresetsOption
|
|
{
|
|
None,
|
|
Configure,
|
|
Build,
|
|
Test,
|
|
Package,
|
|
Workflow,
|
|
All,
|
|
};
|
|
|
|
bool HasPresetsArg() const override
|
|
{
|
|
return this->cmCMakePresetsArgsBase::HasPresetsArg() ||
|
|
this->ListPresets != ListPresetsOption::None;
|
|
}
|
|
|
|
void Clear() override
|
|
{
|
|
this->cmCMakePresetsArgsBase::Clear();
|
|
this->ListPresets = ListPresetsOption::None;
|
|
this->ListPresetsMode = PresetListMode::Available;
|
|
}
|
|
|
|
ListPresetsOption ListPresets = ListPresetsOption::None;
|
|
PresetListMode ListPresetsMode = PresetListMode::Available;
|
|
};
|
|
|
|
class cmCMakePresetsWorkflowArgs : public cmCMakePresetsArgs
|
|
{
|
|
public:
|
|
void Clear() override
|
|
{
|
|
this->cmCMakePresetsArgs::Clear();
|
|
this->Fresh = false;
|
|
}
|
|
|
|
bool Fresh = false;
|
|
};
|