cmMakefile.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /*=========================================================================
  2. Program: Insight Segmentation & Registration Toolkit
  3. Module: $RCSfile$
  4. Language: C++
  5. Date: $Date$
  6. Version: $Revision$
  7. Copyright (c) 2000 National Library of Medicine
  8. All rights reserved.
  9. See COPYRIGHT.txt for copyright details.
  10. =========================================================================*/
  11. /**
  12. * cmMakefile - used to parse and store the contents of a
  13. * CMakeLists.txt makefile in memory.
  14. */
  15. #ifndef cmMakefile_h
  16. #define cmMakefile_h
  17. #include "cmStandardIncludes.h"
  18. #include "cmClassFile.h"
  19. #include "cmSystemTools.h"
  20. class cmRuleMaker;
  21. class cmMakefileGenerator;
  22. class cmMakefile
  23. {
  24. public:
  25. cmMakefile();
  26. ~cmMakefile();
  27. // Parse a CMakeLists.txt file
  28. bool ReadMakefile(const char* makefile, bool inheriting = false);
  29. // Add a wrap generator
  30. void AddRuleMaker(cmRuleMaker* );
  31. // Set the make file
  32. void SetMakefileGenerator(cmMakefileGenerator*);
  33. // Generate the output file
  34. void GenerateMakefile();
  35. // Print useful stuff to stdout
  36. void Print();
  37. // cmRuleMaker interfaces
  38. void AddCustomRule(const char* source,
  39. const char* result,
  40. const char* command,
  41. std::vector<std::string>& depends);
  42. void AddDefineFlag(const char* definition);
  43. void AddExecutable(cmClassFile&);
  44. void AddLinkLibrary(const char*);
  45. void AddLinkDirectory(const char*);
  46. void AddSubDirectory(const char*);
  47. void AddIncludeDirectory(const char*);
  48. void AddDefinition(const char* name, const char* value);
  49. void SetProjectName(const char*);
  50. void SetLibraryName(const char*);
  51. void AddClass(cmClassFile& );
  52. void AddExtraDirectory(const char* dir);
  53. // Set the home directory for the project
  54. void SetHomeDirectory(const char* dir)
  55. {
  56. m_cmHomeDirectory = dir;
  57. cmSystemTools::ConvertToUnixSlashes(m_cmHomeDirectory);
  58. }
  59. const char* GetHomeDirectory()
  60. {
  61. return m_cmHomeDirectory.c_str();
  62. }
  63. // Set the current directory in the project
  64. void SetCurrentDirectory(const char* dir)
  65. {
  66. m_cmCurrentDirectory = dir;
  67. }
  68. const char* GetCurrentDirectory()
  69. {
  70. return m_cmCurrentDirectory.c_str();
  71. }
  72. // Set the name of the library that is built by this makefile
  73. const char* GetLibraryName()
  74. {
  75. return m_LibraryName.c_str();
  76. }
  77. const char* GetProjectName()
  78. {
  79. return m_ProjectName.c_str();
  80. }
  81. // Set the name of the library that is built by this makefile
  82. void SetOutputDirectory(const char* lib)
  83. {
  84. m_OutputDirectory = lib;
  85. }
  86. const char* GetOutputDirectory()
  87. {
  88. return m_OutputDirectory.c_str();
  89. }
  90. // Set the name of the library that is built by this makefile
  91. void SetOutputHomeDirectory(const char* lib)
  92. {
  93. m_OutputHomeDirectory = lib;
  94. }
  95. const char* GetOutputHomeDirectory()
  96. {
  97. return m_OutputHomeDirectory.c_str();
  98. }
  99. const std::vector<std::string>& GetSubDirectories()
  100. {
  101. return m_SubDirectories;
  102. }
  103. bool HasExecutables()
  104. {
  105. return m_Executables;
  106. }
  107. std::vector<std::string>& GetIncludeDirectories()
  108. {
  109. return m_IncludeDirectories;
  110. }
  111. std::vector<std::string>& GetLinkDirectories()
  112. {
  113. return m_LinkDirectories;
  114. }
  115. std::vector<std::string>& GetLinkLibraries()
  116. {
  117. return m_LinkLibraries;
  118. }
  119. std::vector<std::string>& GetLinkLibrariesWin32()
  120. {
  121. return m_LinkLibrariesWin32;
  122. }
  123. std::vector<std::string>& GetLinkLibrariesUnix()
  124. {
  125. return m_LinkLibrariesUnix;
  126. }
  127. std::vector<cmClassFile>& GetClasses(){ return m_Classes;}
  128. std::vector<std::string>& GetAuxSourceDirectories()
  129. { return m_AuxSourceDirectories; }
  130. std::vector<std::string>& GetMakeVerbatim()
  131. { return m_MakeVerbatim;}
  132. const char* GetDefinition(const char*);
  133. const char* GetDefineFlags()
  134. { return m_DefineFlags.c_str();}
  135. private:
  136. /**
  137. * Look for CMakeLists.txt files to parse in dir,
  138. * then in dir's parents, until the SourceHome directory
  139. * is found.
  140. */
  141. void ParseDirectory(const char* dir);
  142. /**
  143. * Parse a file for includes links and libs
  144. */
  145. void ExpandVaribles();
  146. void ReadClasses(std::ifstream& fin, bool t);
  147. friend class cmMakeDepend; // make depend needs direct access
  148. // to the m_Classes array
  149. void PrintStringVector(const char* s, std::vector<std::string>& v);
  150. void AddDefaultRules();
  151. protected:
  152. bool m_Executables;
  153. std::string m_Prefix;
  154. std::vector<std::string> m_AuxSourceDirectories; //
  155. std::string m_OutputDirectory; // Current output directory for makefile
  156. std::string m_OutputHomeDirectory; // Top level output directory
  157. std::string m_cmHomeDirectory; // Home directory for source
  158. std::string m_cmCurrentDirectory; // current directory in source
  159. std::string m_LibraryName; // library name
  160. std::string m_ProjectName; // project name
  161. std::vector<cmClassFile> m_Classes; // list of classes in makefile
  162. std::vector<std::string> m_SubDirectories; // list of sub directories
  163. std::vector<std::string> m_MakeVerbatim; // lines copied from input file
  164. std::vector<std::string> m_IncludeDirectories;
  165. std::vector<std::string> m_LinkDirectories;
  166. std::vector<std::string> m_LinkLibraries;
  167. std::vector<std::string> m_LinkLibrariesWin32;
  168. std::vector<std::string> m_LinkLibrariesUnix;
  169. std::string m_DefineFlags;
  170. std::string m_SourceHomeDirectory;
  171. struct customRule
  172. {
  173. std::string m_Source;
  174. std::string m_Result;
  175. std::string m_Command;
  176. std::vector<std::string> m_Depends;
  177. };
  178. std::vector<customRule> m_CustomRules;
  179. typedef std::map<std::string, cmRuleMaker*> StringRuleMakerMap;
  180. typedef std::map<std::string, std::string> DefinitionMap;
  181. DefinitionMap m_Definitions;
  182. StringRuleMakerMap m_RuleMakers;
  183. std::vector<cmRuleMaker*> m_UsedRuleMakers;
  184. cmMakefileGenerator* m_MakefileGenerator;
  185. };
  186. #endif