| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492 |
- /* 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 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();
- };
|