cmQtAutoGenerators.h 7.8 KB

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