cmState.h 12 KB

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