/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file LICENSE.rst or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #include #include #include #include #include #include "cmDiagnostics.h" #include "cmJSONState.h" #include "cmStateTypes.h" // IWYU pragma: keep #include "CTest/cmCTestTypes.h" // IWYU pragma: keep enum class PackageResolveMode; class cmCMakePresetsGraph { public: enum class PresetListMode { Available, Defined, }; std::string errors; cmJSONState parseState; enum class ArchToolsetStrategy { Set, External, }; enum class TraceEnableMode { Disable, Default, Expand, }; struct CacheVariable { std::string Type; std::string Value; }; class Condition; struct File { std::unordered_set ReachableFiles; std::string Filename; int Version; }; class Preset { public: Preset() = default; Preset(Preset&& /*other*/) = default; Preset(Preset const& /*other*/) = default; Preset& operator=(Preset const& /*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 Inherits; bool Hidden = false; File* OriginFile; std::string DisplayName; std::string Description; std::shared_ptr ConditionEvaluator; bool ConditionResult = true; std::map> Environment; std::string ErrorDetail; virtual bool VisitPresetInherit(Preset const& 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(ConfigurePreset const& /*other*/) = default; ConfigurePreset& operator=(ConfigurePreset const& /*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 ArchitectureStrategy; std::string Toolset; cm::optional ToolsetStrategy; std::string ToolchainFile; std::string GraphVizFile; std::string BinaryDir; std::string InstallDir; std::map> CacheVariables; std::map Warnings; std::map Errors; cm::optional WarnSystemVars; cm::optional WarnDev; // Deprecated synonym for Warnings.CMD_AUTHOR cm::optional ErrorDev; // Deprecated synonym for Errors.CMD_AUTHOR cm::optional DebugOutput; cm::optional DebugTryCompile; cm::optional DebugFind; cm::optional TraceMode; cm::optional TraceFormat; std::vector TraceSource; std::string TraceRedirect; bool VisitPresetInherit(Preset const& parent) override; bool VisitPresetBeforeInherit() override; bool VisitPresetAfterInherit(int version, cmJSONState* state) override; static char const* kind() { return "configure"; } }; class BuildPreset : public Preset { public: BuildPreset() = default; BuildPreset(BuildPreset&& /*other*/) = default; BuildPreset(BuildPreset const& /*other*/) = default; BuildPreset& operator=(BuildPreset const& /*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 InheritConfigureEnvironment; cm::optional Jobs; std::vector Targets; std::string Configuration; cm::optional CleanFirst; cm::optional Verbose; std::vector NativeToolOptions; cm::optional ResolvePackageReferences; bool VisitPresetInherit(Preset const& parent) override; bool VisitPresetAfterInherit(int /* version */, cmJSONState* /*state*/) override; static char const* kind() { return "build"; } }; class TestPreset : public Preset { public: TestPreset() = default; TestPreset(TestPreset&& /*other*/) = default; TestPreset(TestPreset const& /*other*/) = default; TestPreset& operator=(TestPreset const& /*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 ShortProgress; cm::optional Verbosity; cm::optional Debug; cm::optional OutputOnFailure; cm::optional Quiet; std::string OutputLogFile; std::string OutputJUnitFile; cm::optional LabelSummary; cm::optional SubprojectSummary; cm::optional MaxPassedTestOutputSize; cm::optional MaxFailedTestOutputSize; cm::optional TestOutputTruncation; 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::vector TestPassthroughArguments; }; std::string ConfigurePreset; cm::optional InheritConfigureEnvironment; std::string Configuration; std::vector OverwriteConfigurationFile; cm::optional Output; cm::optional Filter; cm::optional Execution; bool VisitPresetInherit(Preset const& parent) override; bool VisitPresetAfterInherit(int /* version */, cmJSONState* /*state*/) override; static char const* kind() { return "test"; } }; class PackagePreset : public Preset { public: PackagePreset() = default; PackagePreset(PackagePreset&& /*other*/) = default; PackagePreset(PackagePreset const& /*other*/) = default; PackagePreset& operator=(PackagePreset const& /*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 InheritConfigureEnvironment; std::vector Generators; std::vector Configurations; std::map Variables; std::string ConfigFile; cm::optional DebugOutput; cm::optional VerboseOutput; std::string PackageName; std::string PackageVersion; std::string PackageDirectory; std::string VendorName; bool VisitPresetInherit(Preset const& parent) override; bool VisitPresetAfterInherit(int /* version */, cmJSONState* /*state*/) override; static char const* kind() { return "package"; } }; class WorkflowPreset : public Preset { public: WorkflowPreset() = default; WorkflowPreset(WorkflowPreset&& /*other*/) = default; WorkflowPreset(WorkflowPreset const& /*other*/) = default; WorkflowPreset& operator=(WorkflowPreset const& /*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 struct WorkflowStep { enum class Type { Configure, Build, Test, Package, }; Type PresetType; std::string PresetName; }; std::vector Steps; bool VisitPresetInherit(Preset const& parent) override; bool VisitPresetAfterInherit(int /* version */, cmJSONState* /* state */) override; static char const* kind() { return "workflow"; } }; template struct PresetPair { T Unexpanded; cm::optional Expanded; }; enum class PresetResolveStatus { Success, NotFound, Hidden, InvalidMacroExpansion, Disabled, }; // Result type for preset resolution template struct PresetResolveResult { using Status = PresetResolveStatus; Status StatusCode = Status::Success; std::string ErrorPresetName; T const* Preset = nullptr; }; template PresetResolveResult ResolvePreset( std::string const& presetName, std::map> const& presets) const; // Returns an error message for a preset resolve status, // or cm::nullopt on Success. template static cm::optional FormatPresetError( PresetResolveStatus status, std::string const& errorPresetName, std::string const& directory); template bool ResolveDependentPresets(std::map>& presets); std::map> ConfigurePresets; std::map> BuildPresets; std::map> TestPresets; std::map> PackagePresets; std::map> WorkflowPresets; std::vector ConfigurePresetOrder; std::vector BuildPresetOrder; std::vector TestPresetOrder; std::vector PackagePresetOrder; std::vector WorkflowPresetOrder; std::string SourceDir; std::vector> Files; int GetVersion(Preset const& preset) const { return preset.OriginFile->Version; } enum class ReadOption { RequireFiles, AllowNoFiles, }; bool ReadProjectPresets( std::string const& sourceDir, std::string const& presetsFile, ReadOption readFilesOption = ReadOption::RequireFiles); std::string GetGeneratorForPreset(std::string const& presetName) const; using ConfigurePresetUsabilityCheck = std::function(ConfigurePreset const&)>; void PrintConfigurePresetList( PresetListMode mode = PresetListMode::Available, ConfigurePresetUsabilityCheck const& usabilityCheck = {}) const; void PrintBuildPresetList( PresetListMode mode = PresetListMode::Available, ConfigurePresetUsabilityCheck const& configureUsabilityCheck = {}) const; void PrintTestPresetList( PresetListMode mode = PresetListMode::Available, ConfigurePresetUsabilityCheck const& configureUsabilityCheck = {}) const; void PrintPackagePresetList( PresetListMode mode = PresetListMode::Available, ConfigurePresetUsabilityCheck const& configureUsabilityCheck = {}) const; void PrintPackagePresetList( std::function const& packageGeneratorsPresent, PresetListMode mode = PresetListMode::Available, ConfigurePresetUsabilityCheck const& configureUsabilityCheck = {}) const; void PrintWorkflowPresetList( PresetListMode mode = PresetListMode::Available, ConfigurePresetUsabilityCheck const& configureUsabilityCheck = {}) const; private: enum class RootType { Any, Project, User, }; enum class ReadReason { Root, Included, }; bool ReadProjectPresetsInternal(std::string const& presetsFile, ReadOption readFilesOption); bool ReadJSONFile(std::string const& filename, RootType rootType, ReadReason readReason, std::vector& inProgressFiles, File*& file, std::string& errMsg); void ClearPresets(); cm::optional GetWorkflowUnavailableReason( WorkflowPreset const& preset, ConfigurePresetUsabilityCheck const& configureUsabilityCheck) const; static std::string GetFilename(std::string const& sourceDir); static std::string GetUserFilename(std::string const& sourceDir); }; extern template cmCMakePresetsGraph::PresetResolveResult< cmCMakePresetsGraph::ConfigurePreset> cmCMakePresetsGraph::ResolvePreset( std::string const&, std::map> const&) const; extern template cmCMakePresetsGraph::PresetResolveResult< cmCMakePresetsGraph::BuildPreset> cmCMakePresetsGraph::ResolvePreset( std::string const&, std::map< std::string, cmCMakePresetsGraph::PresetPair> const&) const; extern template cmCMakePresetsGraph::PresetResolveResult< cmCMakePresetsGraph::TestPreset> cmCMakePresetsGraph::ResolvePreset( std::string const&, std::map< std::string, cmCMakePresetsGraph::PresetPair> const&) const; extern template cmCMakePresetsGraph::PresetResolveResult< cmCMakePresetsGraph::PackagePreset> cmCMakePresetsGraph::ResolvePreset( std::string const&, std::map> const&) const; extern template cm::optional cmCMakePresetsGraph::FormatPresetError( cmCMakePresetsGraph::PresetResolveStatus, std::string const&, std::string const&); extern template cm::optional cmCMakePresetsGraph::FormatPresetError( cmCMakePresetsGraph::PresetResolveStatus, std::string const&, std::string const&); extern template cm::optional cmCMakePresetsGraph::FormatPresetError( cmCMakePresetsGraph::PresetResolveStatus, std::string const&, std::string const&); extern template cm::optional cmCMakePresetsGraph::FormatPresetError( cmCMakePresetsGraph::PresetResolveStatus, std::string const&, std::string const&);