Files
cmake/Source/cmCMakePresetsArgs.h
Maximilian Sander 2a9cde8b6e presets: Add defined listings with unavailable reasons
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
2026-08-19 16:47:50 +02:00

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;
};