| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 |
- /* 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 cmCMakePresetsFile
- {
- 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 cmCMakePresetsFile::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();
- };
|