cmState.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  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 <type_traits>
  10. #include <unordered_map>
  11. #include <unordered_set>
  12. #include <utility>
  13. #include <vector>
  14. #include <cm/optional>
  15. #include "cmDefinitions.h"
  16. #include "cmDependencyProvider.h"
  17. #include "cmLinkedTree.h"
  18. #include "cmPolicies.h"
  19. #include "cmProperty.h"
  20. #include "cmPropertyDefinition.h"
  21. #include "cmPropertyMap.h"
  22. #include "cmStatePrivate.h"
  23. #include "cmStateTypes.h"
  24. #include "cmValue.h"
  25. class cmCacheManager;
  26. class cmCommand;
  27. class cmGlobVerificationManager;
  28. class cmMakefile;
  29. class cmStateSnapshot;
  30. class cmMessenger;
  31. class cmExecutionStatus;
  32. class cmListFileBacktrace;
  33. struct cmListFileArgument;
  34. template <typename T>
  35. class BT;
  36. class cmState
  37. {
  38. friend class cmStateSnapshot;
  39. public:
  40. enum Mode
  41. {
  42. Unknown,
  43. Project,
  44. Script,
  45. FindPackage,
  46. CTest,
  47. CPack,
  48. Help
  49. };
  50. enum class ProjectKind
  51. {
  52. Normal,
  53. TryCompile,
  54. };
  55. cmState(Mode mode, ProjectKind projectKind = ProjectKind::Normal);
  56. ~cmState();
  57. cmState(const cmState&) = delete;
  58. cmState& operator=(const cmState&) = delete;
  59. static const std::string& GetTargetTypeName(
  60. cmStateEnums::TargetType targetType);
  61. cmStateSnapshot CreateBaseSnapshot();
  62. cmStateSnapshot CreateBuildsystemDirectorySnapshot(
  63. cmStateSnapshot const& originSnapshot);
  64. cmStateSnapshot CreateDeferCallSnapshot(
  65. cmStateSnapshot const& originSnapshot, std::string const& fileName);
  66. cmStateSnapshot CreateFunctionCallSnapshot(
  67. cmStateSnapshot const& originSnapshot, std::string const& fileName);
  68. cmStateSnapshot CreateMacroCallSnapshot(
  69. cmStateSnapshot const& originSnapshot, std::string const& fileName);
  70. cmStateSnapshot CreateIncludeFileSnapshot(
  71. cmStateSnapshot const& originSnapshot, std::string const& fileName);
  72. cmStateSnapshot CreateVariableScopeSnapshot(
  73. cmStateSnapshot const& originSnapshot);
  74. cmStateSnapshot CreateInlineListFileSnapshot(
  75. cmStateSnapshot const& originSnapshot, std::string const& fileName);
  76. cmStateSnapshot CreatePolicyScopeSnapshot(
  77. cmStateSnapshot const& originSnapshot);
  78. cmStateSnapshot Pop(cmStateSnapshot const& originSnapshot);
  79. static cmStateEnums::CacheEntryType StringToCacheEntryType(
  80. const std::string&);
  81. static bool StringToCacheEntryType(const std::string&,
  82. cmStateEnums::CacheEntryType& type);
  83. static const std::string& CacheEntryTypeToString(
  84. cmStateEnums::CacheEntryType);
  85. static bool IsCacheEntryType(std::string const& key);
  86. bool LoadCache(const std::string& path, bool internal,
  87. std::set<std::string>& excludes,
  88. std::set<std::string>& includes);
  89. bool SaveCache(const std::string& path, cmMessenger* messenger);
  90. bool DeleteCache(const std::string& path);
  91. bool IsCacheLoaded() const;
  92. std::vector<std::string> GetCacheEntryKeys() const;
  93. cmValue GetCacheEntryValue(std::string const& key) const;
  94. std::string GetSafeCacheEntryValue(std::string const& key) const;
  95. cmValue GetInitializedCacheValue(std::string const& key) const;
  96. cmStateEnums::CacheEntryType GetCacheEntryType(std::string const& key) const;
  97. void SetCacheEntryValue(std::string const& key, std::string const& value);
  98. void RemoveCacheEntry(std::string const& key);
  99. void SetCacheEntryProperty(std::string const& key,
  100. std::string const& propertyName,
  101. std::string const& value);
  102. void SetCacheEntryBoolProperty(std::string const& key,
  103. std::string const& propertyName, bool value);
  104. std::vector<std::string> GetCacheEntryPropertyList(std::string const& key);
  105. cmValue GetCacheEntryProperty(std::string const& key,
  106. std::string const& propertyName);
  107. bool GetCacheEntryPropertyAsBool(std::string const& key,
  108. std::string const& propertyName);
  109. void AppendCacheEntryProperty(std::string const& key,
  110. const std::string& property,
  111. const std::string& value,
  112. bool asString = false);
  113. void RemoveCacheEntryProperty(std::string const& key,
  114. std::string const& propertyName);
  115. //! Break up a line like VAR:type="value" into var, type and value
  116. static bool ParseCacheEntry(const std::string& entry, std::string& var,
  117. std::string& value,
  118. cmStateEnums::CacheEntryType& type);
  119. cmStateSnapshot Reset();
  120. // Define a property
  121. void DefineProperty(const std::string& name, cmProperty::ScopeType scope,
  122. const std::string& ShortDescription,
  123. const std::string& FullDescription, bool chain = false,
  124. const std::string& initializeFromVariable = "");
  125. // get property definition
  126. cmPropertyDefinition const* GetPropertyDefinition(
  127. const std::string& name, cmProperty::ScopeType scope) const;
  128. const cmPropertyDefinitionMap& GetPropertyDefinitions() const
  129. {
  130. return this->PropertyDefinitions;
  131. }
  132. bool IsPropertyChained(const std::string& name,
  133. cmProperty::ScopeType scope) const;
  134. void SetLanguageEnabled(std::string const& l);
  135. bool GetLanguageEnabled(std::string const& l) const;
  136. std::vector<std::string> GetEnabledLanguages() const;
  137. void SetEnabledLanguages(std::vector<std::string> const& langs);
  138. void ClearEnabledLanguages();
  139. bool GetIsGeneratorMultiConfig() const;
  140. void SetIsGeneratorMultiConfig(bool b);
  141. using Command = std::function<bool(std::vector<cmListFileArgument> const&,
  142. cmExecutionStatus&)>;
  143. using BuiltinCommand = bool (*)(std::vector<std::string> const&,
  144. cmExecutionStatus&);
  145. // Returns a command from its name, case insensitive, or nullptr
  146. Command GetCommand(std::string const& name) const;
  147. // Returns a command from its name, or nullptr
  148. Command GetCommandByExactName(std::string const& name) const;
  149. void AddBuiltinCommand(std::string const& name,
  150. std::unique_ptr<cmCommand> command);
  151. void AddBuiltinCommand(std::string const& name, Command command);
  152. void AddBuiltinCommand(std::string const& name, BuiltinCommand command);
  153. void AddFlowControlCommand(std::string const& name, Command command);
  154. void AddFlowControlCommand(std::string const& name, BuiltinCommand command);
  155. void AddDisallowedCommand(std::string const& name, BuiltinCommand command,
  156. cmPolicies::PolicyID policy, const char* message);
  157. void AddUnexpectedCommand(std::string const& name, const char* error);
  158. void AddUnexpectedFlowControlCommand(std::string const& name,
  159. const char* error);
  160. bool AddScriptedCommand(std::string const& name, BT<Command> command,
  161. cmMakefile& mf);
  162. void RemoveBuiltinCommand(std::string const& name);
  163. void RemoveUserDefinedCommands();
  164. std::vector<std::string> GetCommandNames() const;
  165. void SetGlobalProperty(const std::string& prop, const char* value);
  166. void SetGlobalProperty(const std::string& prop, cmValue value);
  167. void AppendGlobalProperty(const std::string& prop, const std::string& value,
  168. bool asString = false);
  169. cmValue GetGlobalProperty(const std::string& prop);
  170. bool GetGlobalPropertyAsBool(const std::string& prop);
  171. std::string const& GetSourceDirectory() const;
  172. void SetSourceDirectory(std::string const& sourceDirectory);
  173. std::string const& GetBinaryDirectory() const;
  174. void SetBinaryDirectory(std::string const& binaryDirectory);
  175. void SetWindowsShell(bool windowsShell);
  176. bool UseWindowsShell() const;
  177. void SetWindowsVSIDE(bool windowsVSIDE);
  178. bool UseWindowsVSIDE() const;
  179. void SetGhsMultiIDE(bool ghsMultiIDE);
  180. bool UseGhsMultiIDE() const;
  181. void SetWatcomWMake(bool watcomWMake);
  182. bool UseWatcomWMake() const;
  183. void SetMinGWMake(bool minGWMake);
  184. bool UseMinGWMake() const;
  185. void SetNMake(bool nMake);
  186. bool UseNMake() const;
  187. void SetMSYSShell(bool mSYSShell);
  188. bool UseMSYSShell() const;
  189. void SetNinjaMulti(bool ninjaMulti);
  190. bool UseNinjaMulti() const;
  191. unsigned int GetCacheMajorVersion() const;
  192. unsigned int GetCacheMinorVersion() const;
  193. Mode GetMode() const;
  194. std::string GetModeString() const;
  195. static std::string ModeToString(Mode mode);
  196. ProjectKind GetProjectKind() const;
  197. void ClearDependencyProvider() { this->DependencyProvider.reset(); }
  198. void SetDependencyProvider(cmDependencyProvider provider)
  199. {
  200. this->DependencyProvider = std::move(provider);
  201. }
  202. cm::optional<cmDependencyProvider> const& GetDependencyProvider() const
  203. {
  204. return this->DependencyProvider;
  205. }
  206. Command GetDependencyProviderCommand(
  207. cmDependencyProvider::Method method) const;
  208. void SetInTopLevelIncludes(bool inTopLevelIncludes)
  209. {
  210. this->ProcessingTopLevelIncludes = inTopLevelIncludes;
  211. }
  212. bool InTopLevelIncludes() const { return this->ProcessingTopLevelIncludes; }
  213. private:
  214. friend class cmake;
  215. void AddCacheEntry(const std::string& key, const char* value,
  216. const char* helpString, cmStateEnums::CacheEntryType type)
  217. {
  218. this->AddCacheEntry(key,
  219. value ? cmValue(std::string(value)) : cmValue(nullptr),
  220. helpString, type);
  221. }
  222. void AddCacheEntry(const std::string& key, const std::string& value,
  223. const char* helpString, cmStateEnums::CacheEntryType type)
  224. {
  225. this->AddCacheEntry(key, cmValue(value), helpString, type);
  226. }
  227. void AddCacheEntry(const std::string& key, cmValue value,
  228. const char* helpString,
  229. cmStateEnums::CacheEntryType type);
  230. bool DoWriteGlobVerifyTarget() const;
  231. std::string const& GetGlobVerifyScript() const;
  232. std::string const& GetGlobVerifyStamp() const;
  233. bool SaveVerificationScript(const std::string& path, cmMessenger* messenger);
  234. void AddGlobCacheEntry(bool recurse, bool listDirectories,
  235. bool followSymlinks, const std::string& relative,
  236. const std::string& expression,
  237. const std::vector<std::string>& files,
  238. const std::string& variable,
  239. cmListFileBacktrace const& bt,
  240. cmMessenger* messenger);
  241. cmPropertyDefinitionMap PropertyDefinitions;
  242. std::vector<std::string> EnabledLanguages;
  243. std::unordered_map<std::string, Command> BuiltinCommands;
  244. std::unordered_map<std::string, Command> ScriptedCommands;
  245. std::unordered_set<std::string> FlowControlCommands;
  246. cmPropertyMap GlobalProperties;
  247. std::unique_ptr<cmCacheManager> CacheManager;
  248. std::unique_ptr<cmGlobVerificationManager> GlobVerificationManager;
  249. cmLinkedTree<cmStateDetail::BuildsystemDirectoryStateType>
  250. BuildsystemDirectory;
  251. cmLinkedTree<std::string> ExecutionListFiles;
  252. cmLinkedTree<cmStateDetail::PolicyStackEntry> PolicyStack;
  253. cmLinkedTree<cmStateDetail::SnapshotDataType> SnapshotData;
  254. cmLinkedTree<cmDefinitions> VarTree;
  255. std::string SourceDirectory;
  256. std::string BinaryDirectory;
  257. bool IsGeneratorMultiConfig = false;
  258. bool WindowsShell = false;
  259. bool WindowsVSIDE = false;
  260. bool GhsMultiIDE = false;
  261. bool WatcomWMake = false;
  262. bool MinGWMake = false;
  263. bool NMake = false;
  264. bool MSYSShell = false;
  265. bool NinjaMulti = false;
  266. Mode StateMode = Unknown;
  267. ProjectKind StateProjectKind = ProjectKind::Normal;
  268. cm::optional<cmDependencyProvider> DependencyProvider;
  269. bool ProcessingTopLevelIncludes = false;
  270. };