cmState.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #ifndef cmState_h
  4. #define cmState_h
  5. #include <cmConfigure.h> // IWYU pragma: keep
  6. #include "cmAlgorithms.h"
  7. #include "cmDefinitions.h"
  8. #include "cmLinkedTree.h"
  9. #include "cmPolicies.h"
  10. #include "cmProperty.h"
  11. #include "cmPropertyDefinitionMap.h"
  12. #include "cmPropertyMap.h"
  13. #include <map>
  14. #include <set>
  15. #include <string>
  16. #include <vector>
  17. class cmCacheManager;
  18. class cmCommand;
  19. class cmListFileBacktrace;
  20. class cmPropertyDefinition;
  21. namespace cmStateDetail {
  22. struct BuildsystemDirectoryStateType;
  23. struct SnapshotDataType;
  24. struct PolicyStackEntry;
  25. typedef cmLinkedTree<cmStateDetail::SnapshotDataType>::iterator PositionType;
  26. }
  27. namespace cmStateEnums {
  28. enum SnapshotType
  29. {
  30. BaseType,
  31. BuildsystemDirectoryType,
  32. FunctionCallType,
  33. MacroCallType,
  34. IncludeFileType,
  35. InlineListFileType,
  36. PolicyScopeType,
  37. VariableScopeType
  38. };
  39. }
  40. class cmState
  41. {
  42. public:
  43. cmState();
  44. ~cmState();
  45. class Directory;
  46. class Snapshot
  47. {
  48. public:
  49. Snapshot(cmState* state = CM_NULLPTR);
  50. Snapshot(cmState* state, cmStateDetail::PositionType position);
  51. const char* GetDefinition(std::string const& name) const;
  52. bool IsInitialized(std::string const& name) const;
  53. void SetDefinition(std::string const& name, std::string const& value);
  54. void RemoveDefinition(std::string const& name);
  55. std::vector<std::string> UnusedKeys() const;
  56. std::vector<std::string> ClosureKeys() const;
  57. bool RaiseScope(std::string const& var, const char* varDef);
  58. void SetListFile(std::string const& listfile);
  59. std::string GetExecutionListFile() const;
  60. std::vector<Snapshot> GetChildren();
  61. bool IsValid() const;
  62. Snapshot GetBuildsystemDirectoryParent() const;
  63. Snapshot GetCallStackParent() const;
  64. Snapshot GetCallStackBottom() const;
  65. cmStateEnums::SnapshotType GetType() const;
  66. void SetPolicy(cmPolicies::PolicyID id, cmPolicies::PolicyStatus status);
  67. cmPolicies::PolicyStatus GetPolicy(cmPolicies::PolicyID id) const;
  68. bool HasDefinedPolicyCMP0011();
  69. void PushPolicy(cmPolicies::PolicyMap entry, bool weak);
  70. bool PopPolicy();
  71. bool CanPopPolicyScope();
  72. cmState* GetState() const;
  73. Directory GetDirectory() const;
  74. void SetProjectName(std::string const& name);
  75. std::string GetProjectName() const;
  76. void InitializeFromParent_ForSubdirsCommand();
  77. struct StrictWeakOrder
  78. {
  79. bool operator()(const cmState::Snapshot& lhs,
  80. const cmState::Snapshot& rhs) const;
  81. };
  82. void SetDirectoryDefinitions();
  83. void SetDefaultDefinitions();
  84. private:
  85. friend bool operator==(const cmState::Snapshot& lhs,
  86. const cmState::Snapshot& rhs);
  87. friend bool operator!=(const cmState::Snapshot& lhs,
  88. const cmState::Snapshot& rhs);
  89. friend class cmState;
  90. friend class Directory;
  91. friend struct StrictWeakOrder;
  92. void InitializeFromParent();
  93. cmState* State;
  94. cmStateDetail::PositionType Position;
  95. };
  96. class Directory
  97. {
  98. Directory(cmLinkedTree<
  99. cmStateDetail::BuildsystemDirectoryStateType>::iterator iter,
  100. Snapshot const& snapshot);
  101. public:
  102. const char* GetCurrentSource() const;
  103. void SetCurrentSource(std::string const& dir);
  104. const char* GetCurrentBinary() const;
  105. void SetCurrentBinary(std::string const& dir);
  106. const char* GetRelativePathTopSource() const;
  107. const char* GetRelativePathTopBinary() const;
  108. void SetRelativePathTopSource(const char* dir);
  109. void SetRelativePathTopBinary(const char* dir);
  110. cmStringRange GetIncludeDirectoriesEntries() const;
  111. cmBacktraceRange GetIncludeDirectoriesEntryBacktraces() const;
  112. void AppendIncludeDirectoriesEntry(std::string const& vec,
  113. cmListFileBacktrace const& lfbt);
  114. void PrependIncludeDirectoriesEntry(std::string const& vec,
  115. cmListFileBacktrace const& lfbt);
  116. void SetIncludeDirectories(std::string const& vec,
  117. cmListFileBacktrace const& lfbt);
  118. void ClearIncludeDirectories();
  119. cmStringRange GetCompileDefinitionsEntries() const;
  120. cmBacktraceRange GetCompileDefinitionsEntryBacktraces() const;
  121. void AppendCompileDefinitionsEntry(std::string const& vec,
  122. cmListFileBacktrace const& lfbt);
  123. void SetCompileDefinitions(std::string const& vec,
  124. cmListFileBacktrace const& lfbt);
  125. void ClearCompileDefinitions();
  126. cmStringRange GetCompileOptionsEntries() const;
  127. cmBacktraceRange GetCompileOptionsEntryBacktraces() const;
  128. void AppendCompileOptionsEntry(std::string const& vec,
  129. cmListFileBacktrace const& lfbt);
  130. void SetCompileOptions(std::string const& vec,
  131. cmListFileBacktrace const& lfbt);
  132. void ClearCompileOptions();
  133. void SetProperty(const std::string& prop, const char* value,
  134. cmListFileBacktrace const& lfbt);
  135. void AppendProperty(const std::string& prop, const char* value,
  136. bool asString, cmListFileBacktrace const& lfbt);
  137. const char* GetProperty(const std::string& prop) const;
  138. const char* GetProperty(const std::string& prop, bool chain) const;
  139. bool GetPropertyAsBool(const std::string& prop) const;
  140. std::vector<std::string> GetPropertyKeys() const;
  141. void AddNormalTargetName(std::string const& name);
  142. private:
  143. void ComputeRelativePathTopSource();
  144. void ComputeRelativePathTopBinary();
  145. private:
  146. cmLinkedTree<cmStateDetail::BuildsystemDirectoryStateType>::iterator
  147. DirectoryState;
  148. Snapshot Snapshot_;
  149. friend class Snapshot;
  150. };
  151. enum TargetType
  152. {
  153. EXECUTABLE,
  154. STATIC_LIBRARY,
  155. SHARED_LIBRARY,
  156. MODULE_LIBRARY,
  157. OBJECT_LIBRARY,
  158. UTILITY,
  159. GLOBAL_TARGET,
  160. INTERFACE_LIBRARY,
  161. UNKNOWN_LIBRARY
  162. };
  163. static const char* GetTargetTypeName(cmState::TargetType targetType);
  164. Snapshot CreateBaseSnapshot();
  165. Snapshot CreateBuildsystemDirectorySnapshot(Snapshot originSnapshot);
  166. Snapshot CreateFunctionCallSnapshot(Snapshot originSnapshot,
  167. std::string const& fileName);
  168. Snapshot CreateMacroCallSnapshot(Snapshot originSnapshot,
  169. std::string const& fileName);
  170. Snapshot CreateIncludeFileSnapshot(Snapshot originSnapshot,
  171. std::string const& fileName);
  172. Snapshot CreateVariableScopeSnapshot(Snapshot originSnapshot);
  173. Snapshot CreateInlineListFileSnapshot(Snapshot originSnapshot,
  174. std::string const& fileName);
  175. Snapshot CreatePolicyScopeSnapshot(Snapshot originSnapshot);
  176. Snapshot Pop(Snapshot originSnapshot);
  177. enum CacheEntryType
  178. {
  179. BOOL = 0,
  180. PATH,
  181. FILEPATH,
  182. STRING,
  183. INTERNAL,
  184. STATIC,
  185. UNINITIALIZED
  186. };
  187. static CacheEntryType StringToCacheEntryType(const char*);
  188. static const char* CacheEntryTypeToString(CacheEntryType);
  189. static bool IsCacheEntryType(std::string const& key);
  190. bool LoadCache(const std::string& path, bool internal,
  191. std::set<std::string>& excludes,
  192. std::set<std::string>& includes);
  193. bool SaveCache(const std::string& path);
  194. bool DeleteCache(const std::string& path);
  195. std::vector<std::string> GetCacheEntryKeys() const;
  196. const char* GetCacheEntryValue(std::string const& key) const;
  197. const char* GetInitializedCacheValue(std::string const& key) const;
  198. CacheEntryType GetCacheEntryType(std::string const& key) const;
  199. void SetCacheEntryValue(std::string const& key, std::string const& value);
  200. void SetCacheValue(std::string const& key, std::string const& value);
  201. void RemoveCacheEntry(std::string const& key);
  202. void SetCacheEntryProperty(std::string const& key,
  203. std::string const& propertyName,
  204. std::string const& value);
  205. void SetCacheEntryBoolProperty(std::string const& key,
  206. std::string const& propertyName, bool value);
  207. std::vector<std::string> GetCacheEntryPropertyList(std::string const& key);
  208. const char* GetCacheEntryProperty(std::string const& key,
  209. std::string const& propertyName);
  210. bool GetCacheEntryPropertyAsBool(std::string const& key,
  211. std::string const& propertyName);
  212. void AppendCacheEntryProperty(std::string const& key,
  213. const std::string& property,
  214. const std::string& value,
  215. bool asString = false);
  216. void RemoveCacheEntryProperty(std::string const& key,
  217. std::string const& propertyName);
  218. ///! Break up a line like VAR:type="value" into var, type and value
  219. static bool ParseCacheEntry(const std::string& entry, std::string& var,
  220. std::string& value, CacheEntryType& type);
  221. Snapshot Reset();
  222. // Define a property
  223. void DefineProperty(const std::string& name, cmProperty::ScopeType scope,
  224. const char* ShortDescription,
  225. const char* FullDescription, bool chain = false);
  226. // get property definition
  227. cmPropertyDefinition const* GetPropertyDefinition(
  228. const std::string& name, cmProperty::ScopeType scope) const;
  229. // Is a property defined?
  230. bool IsPropertyDefined(const std::string& name,
  231. cmProperty::ScopeType scope) const;
  232. bool IsPropertyChained(const std::string& name,
  233. cmProperty::ScopeType scope) const;
  234. void SetLanguageEnabled(std::string const& l);
  235. bool GetLanguageEnabled(std::string const& l) const;
  236. std::vector<std::string> GetEnabledLanguages() const;
  237. void SetEnabledLanguages(std::vector<std::string> const& langs);
  238. void ClearEnabledLanguages();
  239. bool GetIsInTryCompile() const;
  240. void SetIsInTryCompile(bool b);
  241. cmCommand* GetCommand(std::string const& name) const;
  242. void AddCommand(cmCommand* command);
  243. void RemoveUnscriptableCommands();
  244. void RenameCommand(std::string const& oldName, std::string const& newName);
  245. void RemoveUserDefinedCommands();
  246. std::vector<std::string> GetCommandNames() const;
  247. void SetGlobalProperty(const std::string& prop, const char* value);
  248. void AppendGlobalProperty(const std::string& prop, const char* value,
  249. bool asString = false);
  250. const char* GetGlobalProperty(const std::string& prop);
  251. bool GetGlobalPropertyAsBool(const std::string& prop);
  252. const char* GetSourceDirectory() const;
  253. void SetSourceDirectory(std::string const& sourceDirectory);
  254. const char* GetBinaryDirectory() const;
  255. void SetBinaryDirectory(std::string const& binaryDirectory);
  256. void SetWindowsShell(bool windowsShell);
  257. bool UseWindowsShell() const;
  258. void SetWindowsVSIDE(bool windowsVSIDE);
  259. bool UseWindowsVSIDE() const;
  260. void SetWatcomWMake(bool watcomWMake);
  261. bool UseWatcomWMake() const;
  262. void SetMinGWMake(bool minGWMake);
  263. bool UseMinGWMake() const;
  264. void SetNMake(bool nMake);
  265. bool UseNMake() const;
  266. void SetMSYSShell(bool mSYSShell);
  267. bool UseMSYSShell() const;
  268. unsigned int GetCacheMajorVersion() const;
  269. unsigned int GetCacheMinorVersion() const;
  270. private:
  271. friend class cmake;
  272. void AddCacheEntry(const std::string& key, const char* value,
  273. const char* helpString, CacheEntryType type);
  274. std::map<cmProperty::ScopeType, cmPropertyDefinitionMap> PropertyDefinitions;
  275. std::vector<std::string> EnabledLanguages;
  276. std::map<std::string, cmCommand*> Commands;
  277. cmPropertyMap GlobalProperties;
  278. cmCacheManager* CacheManager;
  279. cmLinkedTree<cmStateDetail::BuildsystemDirectoryStateType>
  280. BuildsystemDirectory;
  281. cmLinkedTree<std::string> ExecutionListFiles;
  282. cmLinkedTree<cmStateDetail::PolicyStackEntry> PolicyStack;
  283. cmLinkedTree<cmStateDetail::SnapshotDataType> SnapshotData;
  284. cmLinkedTree<cmDefinitions> VarTree;
  285. std::string SourceDirectory;
  286. std::string BinaryDirectory;
  287. bool IsInTryCompile;
  288. bool WindowsShell;
  289. bool WindowsVSIDE;
  290. bool WatcomWMake;
  291. bool MinGWMake;
  292. bool NMake;
  293. bool MSYSShell;
  294. };
  295. bool operator==(const cmState::Snapshot& lhs, const cmState::Snapshot& rhs);
  296. bool operator!=(const cmState::Snapshot& lhs, const cmState::Snapshot& rhs);
  297. #endif