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