|
|
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
|
|
|
|
#include <functional>
|
|
|
|
#include <map>
|
|
|
|
#include <memory>
|
|
|
|
#include <string>
|
|
|
|
#include <unordered_set>
|
|
|
|
#include <utility>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include <cm/optional>
|
|
|
|
|
|
|
|
#include "cmJSONState.h"
|
|
|
|
#include "cmStateTypes.h" // IWYU pragma: keep
|
|
|
|
|
|
|
|
#include "CTest/cmCTestTypes.h" // IWYU pragma: keep
|
|
|
|
|
|
|
|
enum class PackageResolveMode;
|
|
|
|
|
|
|
|
class cmCMakePresetsGraph
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
std::string errors;
|
|
|
|
cmJSONState parseState;
|
|
|
|
|
|
|
|
enum class ArchToolsetStrategy
|
|
|
|
{
|
|
|
|
Set,
|
|
|
|
External,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class TraceEnableMode
|
|
|
|
{
|
|
|
|
Disable,
|
|
|
|
Default,
|
|
|
|
Expand,
|
|
|
|
};
|
|
|
|
|
|
|
|
class CacheVariable
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
std::string Type;
|
|
|
|
std::string Value;
|
|
|
|
};
|
|
|
|
|
|
|
|
class Condition;
|
|
|
|
|
|
|
|
class File
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
std::string Filename;
|
|
|
|
int Version;
|
|
|
|
|
|
|
|
std::unordered_set<File*> ReachableFiles;
|
|
|
|
};
|
|
|
|
|
|
|
|
class Preset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Preset() = default;
|
|
|
|
Preset(Preset&& /*other*/) = default;
|
|
|
|
Preset(const Preset& /*other*/) = default;
|
|
|
|
Preset& operator=(const Preset& /*other*/) = default;
|
|
|
|
virtual ~Preset() = default;
|
|
|
|
#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
|
|
|
|
Preset& operator=(Preset&& /*other*/) = default;
|
|
|
|
#else
|
|
|
|
// The move assignment operators for several STL classes did not become
|
|
|
|
// noexcept until C++17, which causes some tools to warn about this move
|
|
|
|
// assignment operator throwing an exception when it shouldn't.
|
|
|
|
Preset& operator=(Preset&& /*other*/) = delete;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
std::string Name;
|
|
|
|
std::vector<std::string> Inherits;
|
|
|
|
bool Hidden = false;
|
|
|
|
File* OriginFile;
|
|
|
|
std::string DisplayName;
|
|
|
|
std::string Description;
|
|
|
|
|
|
|
|
std::shared_ptr<Condition> ConditionEvaluator;
|
|
|
|
bool ConditionResult = true;
|
|
|
|
|
|
|
|
std::map<std::string, cm::optional<std::string>> Environment;
|
|
|
|
|
|
|
|
virtual bool VisitPresetInherit(const Preset& parent) = 0;
|
|
|
|
virtual bool VisitPresetBeforeInherit() { return true; }
|
|
|
|
|
|
|
|
virtual bool VisitPresetAfterInherit(int /* version */,
|
|
|
|
cmJSONState* /*state*/)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
class ConfigurePreset : public Preset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
ConfigurePreset() = default;
|
|
|
|
ConfigurePreset(ConfigurePreset&& /*other*/) = default;
|
|
|
|
ConfigurePreset(const ConfigurePreset& /*other*/) = default;
|
|
|
|
ConfigurePreset& operator=(const ConfigurePreset& /*other*/) = default;
|
|
|
|
~ConfigurePreset() override = default;
|
|
|
|
#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
|
|
|
|
ConfigurePreset& operator=(ConfigurePreset&& /*other*/) = default;
|
|
|
|
#else
|
|
|
|
// The move assignment operators for several STL classes did not become
|
|
|
|
// noexcept until C++17, which causes some tools to warn about this move
|
|
|
|
// assignment operator throwing an exception when it shouldn't.
|
|
|
|
ConfigurePreset& operator=(ConfigurePreset&& /*other*/) = delete;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
std::string Generator;
|
|
|
|
std::string Architecture;
|
|
|
|
cm::optional<ArchToolsetStrategy> ArchitectureStrategy;
|
|
|
|
std::string Toolset;
|
|
|
|
cm::optional<ArchToolsetStrategy> ToolsetStrategy;
|
|
|
|
std::string ToolchainFile;
|
|
|
|
std::string GraphVizFile;
|
|
|
|
std::string BinaryDir;
|
|
|
|
std::string InstallDir;
|
|
|
|
|
|
|
|
std::map<std::string, cm::optional<CacheVariable>> CacheVariables;
|
|
|
|
|
|
|
|
cm::optional<bool> WarnDev;
|
|
|
|
cm::optional<bool> ErrorDev;
|
|
|
|
cm::optional<bool> WarnDeprecated;
|
|
|
|
cm::optional<bool> ErrorDeprecated;
|
|
|
|
cm::optional<bool> WarnUninitialized;
|
|
|
|
cm::optional<bool> WarnUnusedCli;
|
|
|
|
cm::optional<bool> WarnSystemVars;
|
|
|
|
|
|
|
|
cm::optional<bool> DebugOutput;
|
|
|
|
cm::optional<bool> DebugTryCompile;
|
|
|
|
cm::optional<bool> DebugFind;
|
|
|
|
|
|
|
|
cm::optional<TraceEnableMode> TraceMode;
|
|
|
|
cm::optional<cmTraceEnums::TraceOutputFormat> TraceFormat;
|
|
|
|
std::vector<std::string> TraceSource;
|
|
|
|
std::string TraceRedirect;
|
|
|
|
|
|
|
|
bool VisitPresetInherit(const Preset& parent) override;
|
|
|
|
bool VisitPresetBeforeInherit() override;
|
|
|
|
bool VisitPresetAfterInherit(int version, cmJSONState* state) override;
|
|
|
|
};
|
|
|
|
|
|
|
|
class BuildPreset : public Preset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
BuildPreset() = default;
|
|
|
|
BuildPreset(BuildPreset&& /*other*/) = default;
|
|
|
|
BuildPreset(const BuildPreset& /*other*/) = default;
|
|
|
|
BuildPreset& operator=(const BuildPreset& /*other*/) = default;
|
|
|
|
~BuildPreset() override = default;
|
|
|
|
#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
|
|
|
|
BuildPreset& operator=(BuildPreset&& /*other*/) = default;
|
|
|
|
#else
|
|
|
|
// The move assignment operators for several STL classes did not become
|
|
|
|
// noexcept until C++17, which causes some tools to warn about this move
|
|
|
|
// assignment operator throwing an exception when it shouldn't.
|
|
|
|
BuildPreset& operator=(BuildPreset&& /*other*/) = delete;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
std::string ConfigurePreset;
|
|
|
|
cm::optional<bool> InheritConfigureEnvironment;
|
|
|
|
cm::optional<int> Jobs;
|
|
|
|
std::vector<std::string> Targets;
|
|
|
|
std::string Configuration;
|
|
|
|
cm::optional<bool> CleanFirst;
|
|
|
|
cm::optional<bool> Verbose;
|
|
|
|
std::vector<std::string> NativeToolOptions;
|
|
|
|
cm::optional<PackageResolveMode> ResolvePackageReferences;
|
|
|
|
|
|
|
|
bool VisitPresetInherit(const Preset& parent) override;
|
|
|
|
bool VisitPresetAfterInherit(int /* version */,
|
|
|
|
cmJSONState* /*state*/) override;
|
|
|
|
};
|
|
|
|
|
|
|
|
class TestPreset : public Preset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
TestPreset() = default;
|
|
|
|
TestPreset(TestPreset&& /*other*/) = default;
|
|
|
|
TestPreset(const TestPreset& /*other*/) = default;
|
|
|
|
TestPreset& operator=(const TestPreset& /*other*/) = default;
|
|
|
|
~TestPreset() override = default;
|
|
|
|
#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
|
|
|
|
TestPreset& operator=(TestPreset&& /*other*/) = default;
|
|
|
|
#else
|
|
|
|
// The move assignment operators for several STL classes did not become
|
|
|
|
// noexcept until C++17, which causes some tools to warn about this move
|
|
|
|
// assignment operator throwing an exception when it shouldn't.
|
|
|
|
TestPreset& operator=(TestPreset&& /*other*/) = delete;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
struct OutputOptions
|
|
|
|
{
|
|
|
|
enum class VerbosityEnum
|
|
|
|
{
|
|
|
|
Default,
|
|
|
|
Verbose,
|
|
|
|
Extra
|
|
|
|
};
|
|
|
|
|
|
|
|
cm::optional<bool> ShortProgress;
|
|
|
|
cm::optional<VerbosityEnum> Verbosity;
|
|
|
|
cm::optional<bool> Debug;
|
|
|
|
cm::optional<bool> OutputOnFailure;
|
|
|
|
cm::optional<bool> Quiet;
|
|
|
|
std::string OutputLogFile;
|
|
|
|
std::string OutputJUnitFile;
|
|
|
|
cm::optional<bool> LabelSummary;
|
|
|
|
cm::optional<bool> SubprojectSummary;
|
|
|
|
cm::optional<int> MaxPassedTestOutputSize;
|
|
|
|
cm::optional<int> MaxFailedTestOutputSize;
|
|
|
|
cm::optional<cmCTestTypes::TruncationMode> TestOutputTruncation;
|
|
|
|
cm::optional<int> MaxTestNameWidth;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct IncludeOptions
|
|
|
|
{
|
|
|
|
struct IndexOptions
|
|
|
|
{
|
|
|
|
cm::optional<int> Start;
|
|
|
|
cm::optional<int> End;
|
|
|
|
cm::optional<int> Stride;
|
|
|
|
std::vector<int> SpecificTests;
|
|
|
|
|
|
|
|
std::string IndexFile;
|
|
|
|
};
|
|
|
|
|
|
|
|
std::string Name;
|
|
|
|
std::string Label;
|
|
|
|
cm::optional<IndexOptions> Index;
|
|
|
|
cm::optional<bool> UseUnion;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ExcludeOptions
|
|
|
|
{
|
|
|
|
struct FixturesOptions
|
|
|
|
{
|
|
|
|
std::string Any;
|
|
|
|
std::string Setup;
|
|
|
|
std::string Cleanup;
|
|
|
|
};
|
|
|
|
|
|
|
|
std::string Name;
|
|
|
|
std::string Label;
|
|
|
|
cm::optional<FixturesOptions> Fixtures;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct FilterOptions
|
|
|
|
{
|
|
|
|
cm::optional<IncludeOptions> Include;
|
|
|
|
cm::optional<ExcludeOptions> Exclude;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ExecutionOptions
|
|
|
|
{
|
|
|
|
enum class ShowOnlyEnum
|
|
|
|
{
|
|
|
|
Human,
|
|
|
|
JsonV1
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RepeatOptions
|
|
|
|
{
|
|
|
|
enum class ModeEnum
|
|
|
|
{
|
|
|
|
UntilFail,
|
|
|
|
UntilPass,
|
|
|
|
AfterTimeout
|
|
|
|
};
|
|
|
|
|
|
|
|
ModeEnum Mode;
|
|
|
|
int Count;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class NoTestsActionEnum
|
|
|
|
{
|
|
|
|
Default,
|
|
|
|
Error,
|
|
|
|
Ignore
|
|
|
|
};
|
|
|
|
|
|
|
|
cm::optional<bool> StopOnFailure;
|
|
|
|
cm::optional<bool> EnableFailover;
|
|
|
|
cm::optional<int> Jobs;
|
|
|
|
std::string ResourceSpecFile;
|
|
|
|
cm::optional<int> TestLoad;
|
|
|
|
cm::optional<ShowOnlyEnum> ShowOnly;
|
|
|
|
|
|
|
|
cm::optional<RepeatOptions> Repeat;
|
|
|
|
cm::optional<bool> InteractiveDebugging;
|
|
|
|
cm::optional<bool> ScheduleRandom;
|
|
|
|
cm::optional<int> Timeout;
|
|
|
|
cm::optional<NoTestsActionEnum> NoTestsAction;
|
|
|
|
};
|
|
|
|
|
|
|
|
std::string ConfigurePreset;
|
|
|
|
cm::optional<bool> InheritConfigureEnvironment;
|
|
|
|
std::string Configuration;
|
|
|
|
std::vector<std::string> OverwriteConfigurationFile;
|
|
|
|
cm::optional<OutputOptions> Output;
|
|
|
|
cm::optional<FilterOptions> Filter;
|
|
|
|
cm::optional<ExecutionOptions> Execution;
|
|
|
|
|
|
|
|
bool VisitPresetInherit(const Preset& parent) override;
|
|
|
|
bool VisitPresetAfterInherit(int /* version */,
|
|
|
|
cmJSONState* /*state*/) override;
|
|
|
|
};
|
|
|
|
|
|
|
|
class PackagePreset : public Preset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PackagePreset() = default;
|
|
|
|
PackagePreset(PackagePreset&& /*other*/) = default;
|
|
|
|
PackagePreset(const PackagePreset& /*other*/) = default;
|
|
|
|
PackagePreset& operator=(const PackagePreset& /*other*/) = default;
|
|
|
|
~PackagePreset() override = default;
|
|
|
|
#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
|
|
|
|
PackagePreset& operator=(PackagePreset&& /*other*/) = default;
|
|
|
|
#else
|
|
|
|
// The move assignment operators for several STL classes did not become
|
|
|
|
// noexcept until C++17, which causes some tools to warn about this move
|
|
|
|
// assignment operator throwing an exception when it shouldn't.
|
|
|
|
PackagePreset& operator=(PackagePreset&& /*other*/) = delete;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
std::string ConfigurePreset;
|
|
|
|
cm::optional<bool> InheritConfigureEnvironment;
|
|
|
|
std::vector<std::string> Generators;
|
|
|
|
std::vector<std::string> Configurations;
|
|
|
|
std::map<std::string, std::string> Variables;
|
|
|
|
std::string ConfigFile;
|
|
|
|
|
|
|
|
cm::optional<bool> DebugOutput;
|
|
|
|
cm::optional<bool> VerboseOutput;
|
|
|
|
|
|
|
|
std::string PackageName;
|
|
|
|
std::string PackageVersion;
|
|
|
|
std::string PackageDirectory;
|
|
|
|
std::string VendorName;
|
|
|
|
|
|
|
|
bool VisitPresetInherit(const Preset& parent) override;
|
|
|
|
bool VisitPresetAfterInherit(int /* version */,
|
|
|
|
cmJSONState* /*state*/) override;
|
|
|
|
};
|
|
|
|
|
|
|
|
class WorkflowPreset : public Preset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
WorkflowPreset() = default;
|
|
|
|
WorkflowPreset(WorkflowPreset&& /*other*/) = default;
|
|
|
|
WorkflowPreset(const WorkflowPreset& /*other*/) = default;
|
|
|
|
WorkflowPreset& operator=(const WorkflowPreset& /*other*/) = default;
|
|
|
|
~WorkflowPreset() override = default;
|
|
|
|
#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
|
|
|
|
WorkflowPreset& operator=(WorkflowPreset&& /*other*/) = default;
|
|
|
|
#else
|
|
|
|
// The move assignment operators for several STL classes did not become
|
|
|
|
// noexcept until C++17, which causes some tools to warn about this move
|
|
|
|
// assignment operator throwing an exception when it shouldn't.
|
|
|
|
WorkflowPreset& operator=(WorkflowPreset&& /*other*/) = delete;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
class WorkflowStep
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum class Type
|
|
|
|
{
|
|
|
|
Configure,
|
|
|
|
Build,
|
|
|
|
Test,
|
|
|
|
Package,
|
|
|
|
};
|
|
|
|
Type PresetType;
|
|
|
|
std::string PresetName;
|
|
|
|
};
|
|
|
|
|
|
|
|
std::vector<WorkflowStep> Steps;
|
|
|
|
|
|
|
|
bool VisitPresetInherit(const Preset& parent) override;
|
|
|
|
bool VisitPresetAfterInherit(int /* version */,
|
|
|
|
cmJSONState* /* state */) override;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class T>
|
|
|
|
class PresetPair
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
T Unexpanded;
|
|
|
|
cm::optional<T> Expanded;
|
|
|
|
};
|
|
|
|
|
|
|
|
std::map<std::string, PresetPair<ConfigurePreset>> ConfigurePresets;
|
|
|
|
std::map<std::string, PresetPair<BuildPreset>> BuildPresets;
|
|
|
|
std::map<std::string, PresetPair<TestPreset>> TestPresets;
|
|
|
|
std::map<std::string, PresetPair<PackagePreset>> PackagePresets;
|
|
|
|
std::map<std::string, PresetPair<WorkflowPreset>> WorkflowPresets;
|
|
|
|
|
|
|
|
std::vector<std::string> ConfigurePresetOrder;
|
|
|
|
std::vector<std::string> BuildPresetOrder;
|
|
|
|
std::vector<std::string> TestPresetOrder;
|
|
|
|
std::vector<std::string> PackagePresetOrder;
|
|
|
|
std::vector<std::string> WorkflowPresetOrder;
|
|
|
|
|
|
|
|
std::string SourceDir;
|
|
|
|
std::vector<std::unique_ptr<File>> Files;
|
|
|
|
|
|
|
|
int GetVersion(const Preset& preset) const
|
|
|
|
{
|
|
|
|
return preset.OriginFile->Version;
|
|
|
|
}
|
|
|
|
|
|
|
|
static std::string GetFilename(const std::string& sourceDir);
|
|
|
|
static std::string GetUserFilename(const std::string& sourceDir);
|
|
|
|
bool ReadProjectPresets(const std::string& sourceDir,
|
|
|
|
bool allowNoFiles = false);
|
|
|
|
|
|
|
|
std::string GetGeneratorForPreset(const std::string& presetName) const
|
|
|
|
{
|
|
|
|
auto configurePresetName = presetName;
|
|
|
|
|
|
|
|
auto buildPresetIterator = this->BuildPresets.find(presetName);
|
|
|
|
if (buildPresetIterator != this->BuildPresets.end()) {
|
|
|
|
configurePresetName =
|
|
|
|
buildPresetIterator->second.Unexpanded.ConfigurePreset;
|
|
|
|
} else {
|
|
|
|
auto testPresetIterator = this->TestPresets.find(presetName);
|
|
|
|
if (testPresetIterator != this->TestPresets.end()) {
|
|
|
|
configurePresetName =
|
|
|
|
testPresetIterator->second.Unexpanded.ConfigurePreset;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
auto configurePresetIterator =
|
|
|
|
this->ConfigurePresets.find(configurePresetName);
|
|
|
|
if (configurePresetIterator != this->ConfigurePresets.end()) {
|
|
|
|
return configurePresetIterator->second.Unexpanded.Generator;
|
|
|
|
}
|
|
|
|
|
|
|
|
// This should only happen if the preset is hidden
|
|
|
|
// or (for build or test presets) if ConfigurePreset is invalid.
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
enum class PrintPrecedingNewline
|
|
|
|
{
|
|
|
|
False,
|
|
|
|
True,
|
|
|
|
};
|
|
|
|
static void printPrecedingNewline(PrintPrecedingNewline* p);
|
|
|
|
|
|
|
|
static void PrintPresets(
|
|
|
|
const std::vector<const cmCMakePresetsGraph::Preset*>& presets);
|
|
|
|
void PrintConfigurePresetList(
|
|
|
|
PrintPrecedingNewline* newline = nullptr) const;
|
|
|
|
void PrintConfigurePresetList(
|
|
|
|
const std::function<bool(const ConfigurePreset&)>& filter,
|
|
|
|
PrintPrecedingNewline* newline = nullptr) const;
|
|
|
|
void PrintBuildPresetList(PrintPrecedingNewline* newline = nullptr) const;
|
|
|
|
void PrintTestPresetList(PrintPrecedingNewline* newline = nullptr) const;
|
|
|
|
void PrintPackagePresetList(PrintPrecedingNewline* newline = nullptr) const;
|
|
|
|
void PrintPackagePresetList(
|
|
|
|
const std::function<bool(const PackagePreset&)>& filter,
|
|
|
|
PrintPrecedingNewline* newline = nullptr) const;
|
|
|
|
void PrintWorkflowPresetList(PrintPrecedingNewline* newline = nullptr) const;
|
|
|
|
void PrintAllPresets() const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
enum class RootType
|
|
|
|
{
|
|
|
|
Project,
|
|
|
|
User,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ReadReason
|
|
|
|
{
|
|
|
|
Root,
|
|
|
|
Included,
|
|
|
|
};
|
|
|
|
|
|
|
|
bool ReadProjectPresetsInternal(bool allowNoFiles);
|
|
|
|
bool ReadJSONFile(const std::string& filename, RootType rootType,
|
|
|
|
ReadReason readReason, std::vector<File*>& inProgressFiles,
|
|
|
|
File*& file, std::string& errMsg);
|
|
|
|
void ClearPresets();
|
|
|
|
};
|