summaryrefslogtreecommitdiffstats
path: root/Source/cmCMakePresetsGraph.h
diff options
context:
space:
mode:
authorKyle Edwards <kyle.edwards@kitware.com>2021-12-21 19:39:04 (GMT)
committerKyle Edwards <kyle.edwards@kitware.com>2022-01-06 23:52:30 (GMT)
commitfd6ea2f67fc5fd1aee27ae92d6a16bc0fba1209e (patch)
treec4dbf6fc64a862facea8948d350df173393a2629 /Source/cmCMakePresetsGraph.h
parent13e71b7c3ec9351f0c25656e72c1c0199ddf771c (diff)
downloadCMake-fd6ea2f67fc5fd1aee27ae92d6a16bc0fba1209e.zip
CMake-fd6ea2f67fc5fd1aee27ae92d6a16bc0fba1209e.tar.gz
CMake-fd6ea2f67fc5fd1aee27ae92d6a16bc0fba1209e.tar.bz2
Refactor: Rename cmCMakePresetsFile to cmCMakePresetsGraph
And change all references to "file" to say "graph" instead.
Diffstat (limited to 'Source/cmCMakePresetsGraph.h')
-rw-r--r--Source/cmCMakePresetsGraph.h378
1 files changed, 378 insertions, 0 deletions
diff --git a/Source/cmCMakePresetsGraph.h b/Source/cmCMakePresetsGraph.h
new file mode 100644
index 0000000..937b281
--- /dev/null
+++ b/Source/cmCMakePresetsGraph.h
@@ -0,0 +1,378 @@
+/* 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 <utility>
+#include <vector>
+
+#include <cm/optional>
+
+class cmCMakePresetsGraph
+{
+public:
+ enum class ReadFileResult
+ {
+ READ_OK,
+ FILE_NOT_FOUND,
+ JSON_PARSE_ERROR,
+ INVALID_ROOT,
+ NO_VERSION,
+ INVALID_VERSION,
+ UNRECOGNIZED_VERSION,
+ INVALID_CMAKE_VERSION,
+ UNRECOGNIZED_CMAKE_VERSION,
+ INVALID_PRESETS,
+ INVALID_PRESET,
+ INVALID_VARIABLE,
+ DUPLICATE_PRESETS,
+ CYCLIC_PRESET_INHERITANCE,
+ USER_PRESET_INHERITANCE,
+ INVALID_MACRO_EXPANSION,
+ BUILD_TEST_PRESETS_UNSUPPORTED,
+ INVALID_CONFIGURE_PRESET,
+ INSTALL_PREFIX_UNSUPPORTED,
+ INVALID_CONDITION,
+ CONDITION_UNSUPPORTED,
+ TOOLCHAIN_FILE_UNSUPPORTED,
+ };
+
+ enum class ArchToolsetStrategy
+ {
+ Set,
+ External,
+ };
+
+ class CacheVariable
+ {
+ public:
+ std::string Type;
+ std::string Value;
+ };
+
+ class Condition;
+
+ 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;
+ bool User;
+ std::string DisplayName;
+ std::string Description;
+
+ std::shared_ptr<Condition> ConditionEvaluator;
+ bool ConditionResult = true;
+
+ std::map<std::string, cm::optional<std::string>> Environment;
+
+ virtual ReadFileResult VisitPresetInherit(const Preset& parent) = 0;
+ virtual ReadFileResult VisitPresetBeforeInherit()
+ {
+ return ReadFileResult::READ_OK;
+ }
+
+ virtual ReadFileResult VisitPresetAfterInherit(int /* version */)
+ {
+ return ReadFileResult::READ_OK;
+ }
+ };
+
+ 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;
+
+ ReadFileResult VisitPresetInherit(const Preset& parent) override;
+ ReadFileResult VisitPresetBeforeInherit() override;
+ ReadFileResult VisitPresetAfterInherit(int version) 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;
+
+ ReadFileResult VisitPresetInherit(const Preset& parent) override;
+ ReadFileResult VisitPresetAfterInherit(int /* version */) 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;
+ cm::optional<bool> LabelSummary;
+ cm::optional<bool> SubprojectSummary;
+ cm::optional<int> MaxPassedTestOutputSize;
+ cm::optional<int> MaxFailedTestOutputSize;
+ 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;
+
+ ReadFileResult VisitPresetInherit(const Preset& parent) override;
+ ReadFileResult VisitPresetAfterInherit(int /* version */) 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::vector<std::string> ConfigurePresetOrder;
+ std::vector<std::string> BuildPresetOrder;
+ std::vector<std::string> TestPresetOrder;
+
+ std::string SourceDir;
+ int Version;
+ int UserVersion;
+
+ int GetVersion(const Preset& preset) const
+ {
+ return preset.User ? this->UserVersion : this->Version;
+ }
+
+ static std::string GetFilename(const std::string& sourceDir);
+ static std::string GetUserFilename(const std::string& sourceDir);
+ ReadFileResult ReadProjectPresets(const std::string& sourceDir,
+ bool allowNoFiles = false);
+ static const char* ResultToString(ReadFileResult result);
+
+ 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 "";
+ }
+
+ static void PrintPresets(
+ const std::vector<const cmCMakePresetsGraph::Preset*>& presets);
+ void PrintConfigurePresetList() const;
+ void PrintConfigurePresetList(
+ const std::function<bool(const ConfigurePreset&)>& filter) const;
+ void PrintBuildPresetList() const;
+ void PrintTestPresetList() const;
+ void PrintAllPresets() const;
+
+private:
+ ReadFileResult ReadProjectPresetsInternal(bool allowNoFiles);
+ ReadFileResult ReadJSONFile(const std::string& filename, bool user);
+ void ClearPresets();
+};