/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include #include #include #include #include #include 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, }; enum class ArchToolsetStrategy { Set, External, }; class CacheVariable { public: std::string Type; std::string Value; }; class Preset { public: #if __cplusplus < 201703L && (!defined(_MSVC_LANG) || _MSVC_LANG < 201703L) // 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. Disable the // move assignment operator until C++17 is enabled. // Explicitly defining a copy assignment operator prevents the compiler // from automatically generating a move assignment operator. Preset& operator=(const Preset& /*other*/) = default; #endif virtual ~Preset() = default; std::string Name; std::vector Inherits; bool Hidden; bool User; std::string DisplayName; std::string Description; std::map> Environment; virtual ReadFileResult VisitPresetInherit(const Preset& parent) = 0; virtual ReadFileResult VisitPresetBeforeInherit() { return ReadFileResult::READ_OK; } virtual ReadFileResult VisitPresetAfterInherit() { return ReadFileResult::READ_OK; } }; class ConfigurePreset : public Preset { public: #if __cplusplus < 201703L && (!defined(_MSVC_LANG) || _MSVC_LANG < 201703L) // 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. Disable the // move assignment operator until C++17 is enabled. // Explicitly defining a copy assignment operator prevents the compiler // from automatically generating a move assignment operator. ConfigurePreset& operator=(const ConfigurePreset& /*other*/) = default; #endif std::string Generator; std::string Architecture; cm::optional ArchitectureStrategy; std::string Toolset; cm::optional ToolsetStrategy; std::string BinaryDir; std::map> CacheVariables; cm::optional WarnDev; cm::optional ErrorDev; cm::optional WarnDeprecated; cm::optional ErrorDeprecated; cm::optional WarnUninitialized; cm::optional WarnUnusedCli; cm::optional WarnSystemVars; cm::optional DebugOutput; cm::optional DebugTryCompile; cm::optional DebugFind; ReadFileResult VisitPresetInherit(const Preset& parent) override; ReadFileResult VisitPresetBeforeInherit() override; ReadFileResult VisitPresetAfterInherit() override; }; class BuildPreset : public Preset { public: #if __cplusplus < 201703L && (!defined(_MSVC_LANG) || _MSVC_LANG < 201703L) // 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. Disable the // move assignment operator until C++17 is enabled. // Explicitly defining a copy assignment operator prevents the compiler // from automatically generating a move assignment operator. BuildPreset& operator=(const BuildPreset& /*other*/) = default; #endif std::string ConfigurePreset; cm::optional InheritConfigureEnvironment; cm::optional Jobs; std::vector Targets; std::string Configuration; cm::optional CleanFirst; cm::optional Verbose; std::vector NativeToolOptions; ReadFileResult VisitPresetInherit(const Preset& parent) override; ReadFileResult VisitPresetAfterInherit() override; }; class TestPreset : public Preset { public: #if __cplusplus < 201703L && (!defined(_MSVC_LANG) || _MSVC_LANG < 201703L) // 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. Disable the // move assignment operator until C++17 is enabled. // Explicitly defining a copy assignment operator prevents the compiler // from automatically generating a move assignment operator. TestPreset& operator=(const TestPreset& /*other*/) = default; #endif struct OutputOptions { enum class VerbosityEnum { Default, Verbose, Extra }; cm::optional ShortProgress; cm::optional Verbosity; cm::optional Debug; cm::optional OutputOnFailure; cm::optional Quiet; std::string OutputLogFile; cm::optional LabelSummary; cm::optional SubprojectSummary; cm::optional MaxPassedTestOutputSize; cm::optional MaxFailedTestOutputSize; cm::optional MaxTestNameWidth; }; struct IncludeOptions { struct IndexOptions { cm::optional Start; cm::optional End; cm::optional Stride; std::vector SpecificTests; std::string IndexFile; }; std::string Name; std::string Label; cm::optional Index; cm::optional UseUnion; }; struct ExcludeOptions { struct FixturesOptions { std::string Any; std::string Setup; std::string Cleanup; }; std::string Name; std::string Label; cm::optional Fixtures; }; struct FilterOptions { cm::optional Include; cm::optional 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 StopOnFailure; cm::optional EnableFailover; cm::optional Jobs; std::string ResourceSpecFile; cm::optional TestLoad; cm::optional ShowOnly; cm::optional Repeat; cm::optional InteractiveDebugging; cm::optional ScheduleRandom; cm::optional Timeout; cm::optional NoTestsAction; }; std::string ConfigurePreset; cm::optional InheritConfigureEnvironment; std::string Configuration; std::vector OverwriteConfigurationFile; cm::optional Output; cm::optional Filter; cm::optional Execution; ReadFileResult VisitPresetInherit(const Preset& parent) override; ReadFileResult VisitPresetAfterInherit() override; }; template class PresetPair { public: T Unexpanded; cm::optional Expanded; }; std::map> ConfigurePresets; std::map> BuildPresets; std::map> TestPresets; std::vector ConfigurePresetOrder; std::vector BuildPresetOrder; std::vector TestPresetOrder; std::string SourceDir; 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& presets); void PrintConfigurePresetList() const; void PrintConfigurePresetList( const std::function& 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(); };