cmState.h 12 KB

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