cmState.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #pragma once
  4. #include "cmConfigure.h" // IWYU pragma: keep
  5. #include <functional>
  6. #include <memory>
  7. #include <set>
  8. #include <string>
  9. #include <unordered_map>
  10. #include <unordered_set>
  11. #include <vector>
  12. #include "cmDefinitions.h"
  13. #include "cmLinkedTree.h"
  14. #include "cmListFileCache.h"
  15. #include "cmPolicies.h"
  16. #include "cmProperty.h"
  17. #include "cmPropertyDefinition.h"
  18. #include "cmPropertyMap.h"
  19. #include "cmStatePrivate.h"
  20. #include "cmStateTypes.h"
  21. class cmCacheManager;
  22. class cmCommand;
  23. class cmGlobVerificationManager;
  24. class cmMakefile;
  25. class cmStateSnapshot;
  26. class cmMessenger;
  27. class cmExecutionStatus;
  28. class cmState
  29. {
  30. friend class cmStateSnapshot;
  31. public:
  32. cmState();
  33. ~cmState();
  34. cmState(const cmState&) = delete;
  35. cmState& operator=(const cmState&) = delete;
  36. enum Mode
  37. {
  38. Unknown,
  39. Project,
  40. Script,
  41. FindPackage,
  42. CTest,
  43. CPack,
  44. };
  45. static const std::string& GetTargetTypeName(
  46. cmStateEnums::TargetType targetType);
  47. cmStateSnapshot CreateBaseSnapshot();
  48. cmStateSnapshot CreateBuildsystemDirectorySnapshot(
  49. cmStateSnapshot const& originSnapshot);
  50. cmStateSnapshot CreateDeferCallSnapshot(
  51. cmStateSnapshot const& originSnapshot, std::string const& fileName);
  52. cmStateSnapshot CreateFunctionCallSnapshot(
  53. cmStateSnapshot const& originSnapshot, std::string const& fileName);
  54. cmStateSnapshot CreateMacroCallSnapshot(
  55. cmStateSnapshot const& originSnapshot, std::string const& fileName);
  56. cmStateSnapshot CreateIncludeFileSnapshot(
  57. cmStateSnapshot const& originSnapshot, std::string const& fileName);
  58. cmStateSnapshot CreateVariableScopeSnapshot(
  59. cmStateSnapshot const& originSnapshot);
  60. cmStateSnapshot CreateInlineListFileSnapshot(
  61. cmStateSnapshot const& originSnapshot, std::string const& fileName);
  62. cmStateSnapshot CreatePolicyScopeSnapshot(
  63. cmStateSnapshot const& originSnapshot);
  64. cmStateSnapshot Pop(cmStateSnapshot const& originSnapshot);
  65. static cmStateEnums::CacheEntryType StringToCacheEntryType(
  66. const std::string&);
  67. static bool StringToCacheEntryType(const std::string&,
  68. cmStateEnums::CacheEntryType& type);
  69. static const std::string& CacheEntryTypeToString(
  70. cmStateEnums::CacheEntryType);
  71. static bool IsCacheEntryType(std::string const& key);
  72. bool LoadCache(const std::string& path, bool internal,
  73. std::set<std::string>& excludes,
  74. std::set<std::string>& includes);
  75. bool SaveCache(const std::string& path, cmMessenger* messenger);
  76. bool DeleteCache(const std::string& path);
  77. bool IsCacheLoaded() const;
  78. std::vector<std::string> GetCacheEntryKeys() const;
  79. cmProp GetCacheEntryValue(std::string const& key) const;
  80. std::string GetSafeCacheEntryValue(std::string const& key) const;
  81. cmProp GetInitializedCacheValue(std::string const& key) const;
  82. cmStateEnums::CacheEntryType GetCacheEntryType(std::string const& key) const;
  83. void SetCacheEntryValue(std::string const& key, std::string const& value);
  84. void RemoveCacheEntry(std::string const& key);
  85. void SetCacheEntryProperty(std::string const& key,
  86. std::string const& propertyName,
  87. std::string const& value);
  88. void SetCacheEntryBoolProperty(std::string const& key,
  89. std::string const& propertyName, bool value);
  90. std::vector<std::string> GetCacheEntryPropertyList(std::string const& key);
  91. cmProp GetCacheEntryProperty(std::string const& key,
  92. std::string const& propertyName);
  93. bool GetCacheEntryPropertyAsBool(std::string const& key,
  94. std::string const& propertyName);
  95. void AppendCacheEntryProperty(std::string const& key,
  96. const std::string& property,
  97. const std::string& value,
  98. bool asString = false);
  99. void RemoveCacheEntryProperty(std::string const& key,
  100. std::string const& propertyName);
  101. //! Break up a line like VAR:type="value" into var, type and value
  102. static bool ParseCacheEntry(const std::string& entry, std::string& var,
  103. std::string& value,
  104. cmStateEnums::CacheEntryType& type);
  105. cmStateSnapshot Reset();
  106. // Define a property
  107. void DefineProperty(const std::string& name, cmProperty::ScopeType scope,
  108. const std::string& ShortDescription,
  109. const std::string& FullDescription, bool chain = false);
  110. // get property definition
  111. cmPropertyDefinition const* GetPropertyDefinition(
  112. const std::string& name, cmProperty::ScopeType scope) const;
  113. bool IsPropertyChained(const std::string& name,
  114. cmProperty::ScopeType scope) const;
  115. void SetLanguageEnabled(std::string const& l);
  116. bool GetLanguageEnabled(std::string const& l) const;
  117. std::vector<std::string> GetEnabledLanguages() const;
  118. void SetEnabledLanguages(std::vector<std::string> const& langs);
  119. void ClearEnabledLanguages();
  120. bool GetIsInTryCompile() const;
  121. void SetIsInTryCompile(bool b);
  122. bool GetIsGeneratorMultiConfig() const;
  123. void SetIsGeneratorMultiConfig(bool b);
  124. using Command = std::function<bool(std::vector<cmListFileArgument> const&,
  125. cmExecutionStatus&)>;
  126. using BuiltinCommand = bool (*)(std::vector<std::string> const&,
  127. cmExecutionStatus&);
  128. // Returns a command from its name, case insensitive, or nullptr
  129. Command GetCommand(std::string const& name) const;
  130. // Returns a command from its name, or nullptr
  131. Command GetCommandByExactName(std::string const& name) const;
  132. void AddBuiltinCommand(std::string const& name,
  133. std::unique_ptr<cmCommand> command);
  134. void AddBuiltinCommand(std::string const& name, Command command);
  135. void AddBuiltinCommand(std::string const& name, BuiltinCommand command);
  136. void AddFlowControlCommand(std::string const& name, Command command);
  137. void AddFlowControlCommand(std::string const& name, BuiltinCommand command);
  138. void AddDisallowedCommand(std::string const& name, BuiltinCommand command,
  139. cmPolicies::PolicyID policy, const char* message);
  140. void AddUnexpectedCommand(std::string const& name, const char* error);
  141. void AddUnexpectedFlowControlCommand(std::string const& name,
  142. const char* error);
  143. bool AddScriptedCommand(std::string const& name, BT<Command> command,
  144. cmMakefile& mf);
  145. void RemoveBuiltinCommand(std::string const& name);
  146. void RemoveUserDefinedCommands();
  147. std::vector<std::string> GetCommandNames() const;
  148. void SetGlobalProperty(const std::string& prop, const char* value);
  149. void AppendGlobalProperty(const std::string& prop, const std::string& value,
  150. bool asString = false);
  151. cmProp GetGlobalProperty(const std::string& prop);
  152. bool GetGlobalPropertyAsBool(const std::string& prop);
  153. std::string const& GetSourceDirectory() const;
  154. void SetSourceDirectory(std::string const& sourceDirectory);
  155. std::string const& GetBinaryDirectory() const;
  156. void SetBinaryDirectory(std::string const& binaryDirectory);
  157. void SetWindowsShell(bool windowsShell);
  158. bool UseWindowsShell() const;
  159. void SetWindowsVSIDE(bool windowsVSIDE);
  160. bool UseWindowsVSIDE() const;
  161. void SetGhsMultiIDE(bool ghsMultiIDE);
  162. bool UseGhsMultiIDE() const;
  163. void SetWatcomWMake(bool watcomWMake);
  164. bool UseWatcomWMake() const;
  165. void SetMinGWMake(bool minGWMake);
  166. bool UseMinGWMake() const;
  167. void SetNMake(bool nMake);
  168. bool UseNMake() const;
  169. void SetMSYSShell(bool mSYSShell);
  170. bool UseMSYSShell() const;
  171. void SetNinjaMulti(bool ninjaMulti);
  172. bool UseNinjaMulti() const;
  173. unsigned int GetCacheMajorVersion() const;
  174. unsigned int GetCacheMinorVersion() const;
  175. Mode GetMode() const;
  176. std::string GetModeString() const;
  177. void SetMode(Mode mode);
  178. static std::string ModeToString(Mode mode);
  179. private:
  180. friend class cmake;
  181. void AddCacheEntry(const std::string& key, const char* value,
  182. const char* helpString,
  183. cmStateEnums::CacheEntryType type);
  184. bool DoWriteGlobVerifyTarget() const;
  185. std::string const& GetGlobVerifyScript() const;
  186. std::string const& GetGlobVerifyStamp() const;
  187. bool SaveVerificationScript(const std::string& path);
  188. void AddGlobCacheEntry(bool recurse, bool listDirectories,
  189. bool followSymlinks, const std::string& relative,
  190. const std::string& expression,
  191. const std::vector<std::string>& files,
  192. const std::string& variable,
  193. cmListFileBacktrace const& bt);
  194. cmPropertyDefinitionMap PropertyDefinitions;
  195. std::vector<std::string> EnabledLanguages;
  196. std::unordered_map<std::string, Command> BuiltinCommands;
  197. std::unordered_map<std::string, Command> ScriptedCommands;
  198. std::unordered_set<std::string> FlowControlCommands;
  199. cmPropertyMap GlobalProperties;
  200. std::unique_ptr<cmCacheManager> CacheManager;
  201. std::unique_ptr<cmGlobVerificationManager> GlobVerificationManager;
  202. cmLinkedTree<cmStateDetail::BuildsystemDirectoryStateType>
  203. BuildsystemDirectory;
  204. cmLinkedTree<std::string> ExecutionListFiles;
  205. cmLinkedTree<cmStateDetail::PolicyStackEntry> PolicyStack;
  206. cmLinkedTree<cmStateDetail::SnapshotDataType> SnapshotData;
  207. cmLinkedTree<cmDefinitions> VarTree;
  208. std::string SourceDirectory;
  209. std::string BinaryDirectory;
  210. bool IsInTryCompile = false;
  211. bool IsGeneratorMultiConfig = false;
  212. bool WindowsShell = false;
  213. bool WindowsVSIDE = false;
  214. bool GhsMultiIDE = false;
  215. bool WatcomWMake = false;
  216. bool MinGWMake = false;
  217. bool NMake = false;
  218. bool MSYSShell = false;
  219. bool NinjaMulti = false;
  220. Mode CurrentMode = Unknown;
  221. };