/* 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 <memory> #include <set> #include <string> #include <type_traits> #include <unordered_map> #include <unordered_set> #include <utility> #include <vector> #include <cm/optional> #include "cmDefinitions.h" #include "cmDependencyProvider.h" #include "cmLinkedTree.h" #include "cmPolicies.h" #include "cmProperty.h" #include "cmPropertyDefinition.h" #include "cmPropertyMap.h" #include "cmStatePrivate.h" #include "cmStateTypes.h" #include "cmValue.h" class cmCacheManager; class cmCommand; class cmGlobVerificationManager; class cmMakefile; class cmStateSnapshot; class cmMessenger; class cmExecutionStatus; class cmListFileBacktrace; struct cmListFileArgument; template <typename T> class BT; class cmState { friend class cmStateSnapshot; public: enum Mode { Unknown, Project, Script, FindPackage, CTest, CPack, Help }; enum class ProjectKind { Normal, TryCompile, }; cmState(Mode mode, ProjectKind projectKind = ProjectKind::Normal); ~cmState(); cmState(const cmState&) = delete; cmState& operator=(const cmState&) = delete; static const std::string& GetTargetTypeName( cmStateEnums::TargetType targetType); cmStateSnapshot CreateBaseSnapshot(); cmStateSnapshot CreateBuildsystemDirectorySnapshot( cmStateSnapshot const& originSnapshot); cmStateSnapshot CreateDeferCallSnapshot( cmStateSnapshot const& originSnapshot, std::string const& fileName); cmStateSnapshot CreateFunctionCallSnapshot( cmStateSnapshot const& originSnapshot, std::string const& fileName); cmStateSnapshot CreateMacroCallSnapshot( cmStateSnapshot const& originSnapshot, std::string const& fileName); cmStateSnapshot CreateIncludeFileSnapshot( cmStateSnapshot const& originSnapshot, std::string const& fileName); cmStateSnapshot CreateVariableScopeSnapshot( cmStateSnapshot const& originSnapshot); cmStateSnapshot CreateInlineListFileSnapshot( cmStateSnapshot const& originSnapshot, std::string const& fileName); cmStateSnapshot CreatePolicyScopeSnapshot( cmStateSnapshot const& originSnapshot); cmStateSnapshot Pop(cmStateSnapshot const& originSnapshot); static cmStateEnums::CacheEntryType StringToCacheEntryType( const std::string&); static bool StringToCacheEntryType(const std::string&, cmStateEnums::CacheEntryType& type); static const std::string& CacheEntryTypeToString( cmStateEnums::CacheEntryType); static bool IsCacheEntryType(std::string const& key); bool LoadCache(const std::string& path, bool internal, std::set<std::string>& excludes, std::set<std::string>& includes); bool SaveCache(const std::string& path, cmMessenger* messenger); bool DeleteCache(const std::string& path); bool IsCacheLoaded() const; std::vector<std::string> GetCacheEntryKeys() const; cmValue GetCacheEntryValue(std::string const& key) const; std::string GetSafeCacheEntryValue(std::string const& key) const; cmValue GetInitializedCacheValue(std::string const& key) const; cmStateEnums::CacheEntryType GetCacheEntryType(std::string const& key) const; void SetCacheEntryValue(std::string const& key, std::string const& value); void RemoveCacheEntry(std::string const& key); void SetCacheEntryProperty(std::string const& key, std::string const& propertyName, std::string const& value); void SetCacheEntryBoolProperty(std::string const& key, std::string const& propertyName, bool value); std::vector<std::string> GetCacheEntryPropertyList(std::string const& key); cmValue GetCacheEntryProperty(std::string const& key, std::string const& propertyName); bool GetCacheEntryPropertyAsBool(std::string const& key, std::string const& propertyName); void AppendCacheEntryProperty(std::string const& key, const std::string& property, const std::string& value, bool asString = false); void RemoveCacheEntryProperty(std::string const& key, std::string const& propertyName); //! Break up a line like VAR:type="value" into var, type and value static bool ParseCacheEntry(const std::string& entry, std::string& var, std::string& value, cmStateEnums::CacheEntryType& type); cmStateSnapshot Reset(); // Define a property void DefineProperty(const std::string& name, cmProperty::ScopeType scope, const std::string& ShortDescription, const std::string& FullDescription, bool chain = false, const std::string& initializeFromVariable = ""); // get property definition cmPropertyDefinition const* GetPropertyDefinition( const std::string& name, cmProperty::ScopeType scope) const; const cmPropertyDefinitionMap& GetPropertyDefinitions() const { return this->PropertyDefinitions; } bool IsPropertyChained(const std::string& name, cmProperty::ScopeType scope) const; void SetLanguageEnabled(std::string const& l); bool GetLanguageEnabled(std::string const& l) const; std::vector<std::string> GetEnabledLanguages() const; void SetEnabledLanguages(std::vector<std::string> const& langs); void ClearEnabledLanguages(); bool GetIsGeneratorMultiConfig() const; void SetIsGeneratorMultiConfig(bool b); using Command = std::function<bool(std::vector<cmListFileArgument> const&, cmExecutionStatus&)>; using BuiltinCommand = bool (*)(std::vector<std::string> const&, cmExecutionStatus&); // Returns a command from its name, case insensitive, or nullptr Command GetCommand(std::string const& name) const; // Returns a command from its name, or nullptr Command GetCommandByExactName(std::string const& name) const; void AddBuiltinCommand(std::string const& name, std::unique_ptr<cmCommand> command); void AddBuiltinCommand(std::string const& name, Command command); void AddBuiltinCommand(std::string const& name, BuiltinCommand command); void AddFlowControlCommand(std::string const& name, Command command); void AddFlowControlCommand(std::string const& name, BuiltinCommand command); void AddDisallowedCommand(std::string const& name, BuiltinCommand command, cmPolicies::PolicyID policy, const char* message); void AddUnexpectedCommand(std::string const& name, const char* error); void AddUnexpectedFlowControlCommand(std::string const& name, const char* error); bool AddScriptedCommand(std::string const& name, BT<Command> command, cmMakefile& mf); void RemoveBuiltinCommand(std::string const& name); void RemoveUserDefinedCommands(); std::vector<std::string> GetCommandNames() const; void SetGlobalProperty(const std::string& prop, const char* value); void SetGlobalProperty(const std::string& prop, cmValue value); void AppendGlobalProperty(const std::string& prop, const std::string& value, bool asString = false); cmValue GetGlobalProperty(const std::string& prop); bool GetGlobalPropertyAsBool(const std::string& prop); std::string const& GetSourceDirectory() const; void SetSourceDirectory(std::string const& sourceDirectory); std::string const& GetBinaryDirectory() const; void SetBinaryDirectory(std::string const& binaryDirectory); void SetWindowsShell(bool windowsShell); bool UseWindowsShell() const; void SetWindowsVSIDE(bool windowsVSIDE); bool UseWindowsVSIDE() const; void SetGhsMultiIDE(bool ghsMultiIDE); bool UseGhsMultiIDE() const; void SetWatcomWMake(bool watcomWMake); bool UseWatcomWMake() const; void SetMinGWMake(bool minGWMake); bool UseMinGWMake() const; void SetNMake(bool nMake); bool UseNMake() const; void SetMSYSShell(bool mSYSShell); bool UseMSYSShell() const; void SetNinjaMulti(bool ninjaMulti); bool UseNinjaMulti() const; unsigned int GetCacheMajorVersion() const; unsigned int GetCacheMinorVersion() const; Mode GetMode() const; std::string GetModeString() const; static std::string ModeToString(Mode mode); ProjectKind GetProjectKind() const; void ClearDependencyProvider() { this->DependencyProvider.reset(); } void SetDependencyProvider(cmDependencyProvider provider) { this->DependencyProvider = std::move(provider); } cm::optional<cmDependencyProvider> const& GetDependencyProvider() const { return this->DependencyProvider; } Command GetDependencyProviderCommand( cmDependencyProvider::Method method) const; void SetInTopLevelIncludes(bool inTopLevelIncludes) { this->ProcessingTopLevelIncludes = inTopLevelIncludes; } bool InTopLevelIncludes() const { return this->ProcessingTopLevelIncludes; } private: friend class cmake; void AddCacheEntry(const std::string& key, cmValue value, const char* helpString, cmStateEnums::CacheEntryType type); bool DoWriteGlobVerifyTarget() const; std::string const& GetGlobVerifyScript() const; std::string const& GetGlobVerifyStamp() const; bool SaveVerificationScript(const std::string& path, cmMessenger* messenger); void AddGlobCacheEntry(bool recurse, bool listDirectories, bool followSymlinks, const std::string& relative, const std::string& expression, const std::vector<std::string>& files, const std::string& variable, cmListFileBacktrace const& bt, cmMessenger* messenger); cmPropertyDefinitionMap PropertyDefinitions; std::vector<std::string> EnabledLanguages; std::unordered_map<std::string, Command> BuiltinCommands; std::unordered_map<std::string, Command> ScriptedCommands; std::unordered_set<std::string> FlowControlCommands; cmPropertyMap GlobalProperties; std::unique_ptr<cmCacheManager> CacheManager; std::unique_ptr<cmGlobVerificationManager> GlobVerificationManager; cmLinkedTree<cmStateDetail::BuildsystemDirectoryStateType> BuildsystemDirectory; cmLinkedTree<std::string> ExecutionListFiles; cmLinkedTree<cmStateDetail::PolicyStackEntry> PolicyStack; cmLinkedTree<cmStateDetail::SnapshotDataType> SnapshotData; cmLinkedTree<cmDefinitions> VarTree; std::string SourceDirectory; std::string BinaryDirectory; bool IsGeneratorMultiConfig = false; bool WindowsShell = false; bool WindowsVSIDE = false; bool GhsMultiIDE = false; bool WatcomWMake = false; bool MinGWMake = false; bool NMake = false; bool MSYSShell = false; bool NinjaMulti = false; Mode StateMode = Unknown; ProjectKind StateProjectKind = ProjectKind::Normal; cm::optional<cmDependencyProvider> DependencyProvider; bool ProcessingTopLevelIncludes = false; };