cmQtAutoGenerators.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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 cmQtAutoGenerators_h
  4. #define cmQtAutoGenerators_h
  5. #include "cmConfigure.h" // IWYU pragma: keep
  6. #include "cmFilePathChecksum.h"
  7. #include "cmQtAutoGen.h"
  8. #include "cmsys/RegularExpression.hxx"
  9. #include <map>
  10. #include <set>
  11. #include <string>
  12. #include <utility>
  13. #include <vector>
  14. class cmMakefile;
  15. class cmQtAutoGenerators
  16. {
  17. public:
  18. cmQtAutoGenerators();
  19. bool Run(const std::string& targetDirectory, const std::string& config);
  20. private:
  21. // -- Types
  22. /// @brief Used to extract additional dependencies from content text
  23. struct MocDependFilter
  24. {
  25. std::string key;
  26. cmsys::RegularExpression regExp;
  27. };
  28. typedef std::pair<std::string, cmsys::RegularExpression> MocMacroFilter;
  29. // -- Configuration
  30. bool MocDependFilterPush(const std::string& key, const std::string& regExp);
  31. bool ReadAutogenInfoFile(cmMakefile* makefile,
  32. const std::string& targetDirectory,
  33. const std::string& config);
  34. bool MocEnabled() const { return !this->MocExecutable.empty(); }
  35. bool UicEnabled() const { return !this->UicExecutable.empty(); }
  36. bool RccEnabled() const { return !this->RccExecutable.empty(); }
  37. // -- Settings file
  38. void SettingsFileRead(cmMakefile* makefile);
  39. bool SettingsFileWrite();
  40. bool AnySettingsChanged() const
  41. {
  42. return (this->MocSettingsChanged || this->RccSettingsChanged ||
  43. this->UicSettingsChanged);
  44. }
  45. // -- Init and run
  46. void Init(cmMakefile* makefile);
  47. bool RunAutogen();
  48. // -- Content analysis
  49. bool MocRequired(const std::string& contentText,
  50. std::string* macroName = nullptr);
  51. void MocFindDepends(
  52. const std::string& absFilename, const std::string& contentText,
  53. std::map<std::string, std::set<std::string>>& mocDepends);
  54. bool MocSkip(const std::string& absFilename) const;
  55. bool UicSkip(const std::string& absFilename) const;
  56. bool ParseSourceFile(
  57. const std::string& absFilename,
  58. std::map<std::string, std::string>& mocsIncluded,
  59. std::map<std::string, std::set<std::string>>& mocDepends,
  60. std::map<std::string, std::vector<std::string>>& includedUis,
  61. bool relaxed);
  62. void SearchHeadersForSourceFile(const std::string& absFilename,
  63. std::set<std::string>& mocHeaderFiles,
  64. std::set<std::string>& uicHeaderFiles) const;
  65. bool ParseHeaders(
  66. const std::set<std::string>& mocHeaderFiles,
  67. const std::set<std::string>& uicHeaderFiles,
  68. const std::map<std::string, std::string>& mocsIncluded,
  69. std::map<std::string, std::string>& mocsNotIncluded,
  70. std::map<std::string, std::set<std::string>>& mocDepends,
  71. std::map<std::string, std::vector<std::string>>& includedUis);
  72. void UicParseContent(
  73. const std::string& fileName, const std::string& contentText,
  74. std::map<std::string, std::vector<std::string>>& includedUis);
  75. bool MocParseSourceContent(
  76. const std::string& absFilename, const std::string& contentText,
  77. std::map<std::string, std::string>& mocsIncluded,
  78. std::map<std::string, std::set<std::string>>& mocDepends, bool relaxed);
  79. void MocParseHeaderContent(
  80. const std::string& absFilename, const std::string& contentText,
  81. std::map<std::string, std::string>& mocsNotIncluded,
  82. std::map<std::string, std::set<std::string>>& mocDepends);
  83. // -- Moc file generation
  84. bool MocGenerateAll(
  85. const std::map<std::string, std::string>& mocsIncluded,
  86. const std::map<std::string, std::string>& mocsNotIncluded,
  87. const std::map<std::string, std::set<std::string>>& mocDepends);
  88. bool MocGenerateFile(
  89. const std::string& sourceFile, const std::string& mocFileName,
  90. const std::map<std::string, std::set<std::string>>& mocDepends,
  91. bool included);
  92. // -- Uic file generation
  93. bool UicFindIncludedFile(std::string& absFile, const std::string& sourceFile,
  94. const std::string& searchPath,
  95. const std::string& searchFile);
  96. bool UicGenerateAll(
  97. const std::map<std::string, std::vector<std::string>>& includedUis);
  98. bool UicGenerateFile(const std::string& realName,
  99. const std::string& uiInputFile,
  100. const std::string& uiOutputFile);
  101. // -- Rcc file generation
  102. bool RccGenerateAll();
  103. bool RccGenerateFile(const std::string& qrcInputFile,
  104. const std::string& qrcOutputFile, bool unique_n);
  105. // -- Logging
  106. void LogErrorNameCollision(
  107. const std::string& message,
  108. const std::multimap<std::string, std::string>& collisions) const;
  109. void LogBold(const std::string& message) const;
  110. void LogInfo(const std::string& message) const;
  111. void LogWarning(const std::string& message) const;
  112. void LogError(const std::string& message) const;
  113. void LogCommand(const std::vector<std::string>& command) const;
  114. // -- Utility
  115. bool NameCollisionTest(
  116. const std::map<std::string, std::string>& genFiles,
  117. std::multimap<std::string, std::string>& collisions) const;
  118. std::string ChecksumedPath(const std::string& sourceFile,
  119. const std::string& basePrefix,
  120. const std::string& baseSuffix) const;
  121. bool MakeParentDirectory(cmQtAutoGen::GeneratorType genType,
  122. const std::string& filename) const;
  123. bool FileDiffers(const std::string& filename, const std::string& content);
  124. bool FileWrite(cmQtAutoGen::GeneratorType genType,
  125. const std::string& filename, const std::string& content);
  126. bool RunCommand(const std::vector<std::string>& command, std::string& output,
  127. bool verbose = true) const;
  128. bool FindHeader(std::string& header, const std::string& testBasePath) const;
  129. std::string MocFindHeader(const std::string& sourcePath,
  130. const std::string& includeBase) const;
  131. bool MocFindIncludedFile(std::string& absFile, const std::string& sourceFile,
  132. const std::string& includeString) const;
  133. // -- Meta
  134. std::string ConfigSuffix;
  135. // -- Directories
  136. std::string ProjectSourceDir;
  137. std::string ProjectBinaryDir;
  138. std::string CurrentSourceDir;
  139. std::string CurrentBinaryDir;
  140. std::string AutogenBuildDir;
  141. std::string AutogenIncludeDir;
  142. // -- Qt environment
  143. std::string QtMajorVersion;
  144. std::string MocExecutable;
  145. std::string UicExecutable;
  146. std::string RccExecutable;
  147. // -- File lists
  148. std::vector<std::string> Sources;
  149. std::vector<std::string> Headers;
  150. std::vector<std::string> HeaderExtensions;
  151. cmFilePathChecksum FPathChecksum;
  152. // -- Settings
  153. bool IncludeProjectDirsBefore;
  154. bool Verbose;
  155. bool ColorOutput;
  156. std::string SettingsFile;
  157. std::string SettingsStringMoc;
  158. std::string SettingsStringUic;
  159. std::string SettingsStringRcc;
  160. // -- Moc
  161. bool MocSettingsChanged;
  162. bool MocPredefsChanged;
  163. bool MocRelaxedMode;
  164. bool MocRunFailed;
  165. std::string MocCompFileRel;
  166. std::string MocCompFileAbs;
  167. std::string MocPredefsFileRel;
  168. std::string MocPredefsFileAbs;
  169. std::vector<std::string> MocSkipList;
  170. std::vector<std::string> MocIncludePaths;
  171. std::vector<std::string> MocIncludes;
  172. std::vector<std::string> MocDefinitions;
  173. std::vector<std::string> MocOptions;
  174. std::vector<std::string> MocPredefsCmd;
  175. std::vector<MocDependFilter> MocDependFilters;
  176. std::vector<MocMacroFilter> MocMacroFilters;
  177. cmsys::RegularExpression MocRegExpInclude;
  178. // -- Uic
  179. bool UicSettingsChanged;
  180. bool UicRunFailed;
  181. std::vector<std::string> UicSkipList;
  182. std::vector<std::string> UicTargetOptions;
  183. std::map<std::string, std::string> UicOptions;
  184. std::vector<std::string> UicSearchPaths;
  185. cmsys::RegularExpression UicRegExpInclude;
  186. // -- Rcc
  187. bool RccSettingsChanged;
  188. bool RccRunFailed;
  189. std::vector<std::string> RccSources;
  190. std::map<std::string, std::string> RccOptions;
  191. std::map<std::string, std::vector<std::string>> RccInputs;
  192. };
  193. #endif