cmQtAutoGenerators.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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> MacroFilter;
  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. const std::string& targetDirectory);
  39. bool SettingsFileWrite(const std::string& targetDirectory);
  40. bool GenerateAllAny() const
  41. {
  42. return (this->GenerateAllMoc || this->GenerateAllRcc ||
  43. this->GenerateAllUic);
  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 = CM_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. void 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::string& subDir,
  91. const std::map<std::string, std::set<std::string> >& mocDepends);
  92. // - Uic file generation
  93. bool UicFindIncludedFile(std::string& absFile, const std::string& sourceFile,
  94. const std::string& includeString);
  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 char* basePrefix,
  119. const char* baseSuffix) const;
  120. bool MakeParentDirectory(const std::string& filename) const;
  121. bool FindHeader(std::string& header, const std::string& testBasePath) const;
  122. bool FindHeaderGlobal(std::string& header,
  123. const std::string& testBasePath) const;
  124. std::string FindMocHeader(const std::string& basePath,
  125. const std::string& baseName,
  126. const std::string& subDir) const;
  127. bool FindIncludedFile(std::string& absFile, const std::string& sourceFile,
  128. const std::string& includeString) const;
  129. // - Target names
  130. std::string OriginTargetName;
  131. std::string AutogenTargetName;
  132. // - Directories
  133. std::string ProjectSourceDir;
  134. std::string ProjectBinaryDir;
  135. std::string CurrentSourceDir;
  136. std::string CurrentBinaryDir;
  137. std::string AutogenBuildSubDir;
  138. // - Qt environment
  139. std::string QtMajorVersion;
  140. std::string MocExecutable;
  141. std::string UicExecutable;
  142. std::string RccExecutable;
  143. // - File lists
  144. std::vector<std::string> Sources;
  145. std::vector<std::string> Headers;
  146. // - Settings
  147. std::string SettingsStringMoc;
  148. std::string SettingsStringUic;
  149. std::string SettingsStringRcc;
  150. // - Moc
  151. std::string MocCppFilenameRel;
  152. std::string MocCppFilenameAbs;
  153. std::vector<std::string> MocSkipList;
  154. std::vector<std::string> MocIncludePaths;
  155. std::vector<std::string> MocIncludes;
  156. std::vector<std::string> MocDefinitions;
  157. std::vector<std::string> MocOptions;
  158. std::vector<MocDependFilter> MocDependFilters;
  159. // - Uic
  160. std::vector<std::string> UicSkipList;
  161. std::vector<std::string> UicTargetOptions;
  162. std::map<std::string, std::string> UicOptions;
  163. std::vector<std::string> UicSearchPaths;
  164. // - Rcc
  165. std::vector<std::string> RccSources;
  166. std::map<std::string, std::string> RccOptions;
  167. std::map<std::string, std::vector<std::string> > RccInputs;
  168. // - Utility
  169. cmFilePathChecksum fpathCheckSum;
  170. std::vector<std::string> HeaderExtensions;
  171. MacroFilter MacroFilters[2];
  172. cmsys::RegularExpression RegExpMocInclude;
  173. cmsys::RegularExpression RegExpUicInclude;
  174. // - Flags
  175. bool IncludeProjectDirsBefore;
  176. bool Verbose;
  177. bool ColorOutput;
  178. bool RunMocFailed;
  179. bool RunUicFailed;
  180. bool RunRccFailed;
  181. bool GenerateAllMoc;
  182. bool GenerateAllUic;
  183. bool GenerateAllRcc;
  184. bool MocRelaxedMode;
  185. };
  186. #endif