https://github.com/Kitware/CMake
Raw File
Tip revision: 344f9ed96a4cc457810ca84cf6549f7a4218fd8a authored by Brad King on 05 June 2017, 14:32:40 UTC
CMake 3.9.0-rc1 version update
Tip revision: 344f9ed
cmQtAutoGenerators.h
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#ifndef cmQtAutoGenerators_h
#define cmQtAutoGenerators_h

#include "cmConfigure.h" // IWYU pragma: keep

#include "cmFilePathChecksum.h"
#include "cmsys/RegularExpression.hxx"

#include <map>
#include <set>
#include <string>
#include <utility>
#include <vector>

class cmMakefile;

class cmQtAutoGenerators
{
public:
  cmQtAutoGenerators();
  bool Run(const std::string& targetDirectory, const std::string& config);

private:
  // -- Types

  /// @brief Used to extract additional dependencies from content text
  struct MocDependFilter
  {
    std::string key;
    cmsys::RegularExpression regExp;
  };
  typedef std::pair<std::string, cmsys::RegularExpression> MocMacroFilter;

  // -- Configuration
  bool MocDependFilterPush(const std::string& key, const std::string& regExp);
  bool ReadAutogenInfoFile(cmMakefile* makefile,
                           const std::string& targetDirectory,
                           const std::string& config);

  bool MocEnabled() const { return !this->MocExecutable.empty(); }
  bool UicEnabled() const { return !this->UicExecutable.empty(); }
  bool RccEnabled() const { return !this->RccExecutable.empty(); }

  // -- Settings file
  void SettingsFileRead(cmMakefile* makefile);
  bool SettingsFileWrite();

  bool AnySettingsChanged() const
  {
    return (this->MocSettingsChanged || this->RccSettingsChanged ||
            this->UicSettingsChanged);
  }

  // -- Init and run
  void Init(cmMakefile* makefile);
  bool RunAutogen();

  // -- Content analysis
  bool MocRequired(const std::string& contentText,
                   std::string* macroName = CM_NULLPTR);
  void MocFindDepends(
    const std::string& absFilename, const std::string& contentText,
    std::map<std::string, std::set<std::string> >& mocDepends);

  bool MocSkip(const std::string& absFilename) const;
  bool UicSkip(const std::string& absFilename) const;

  bool ParseSourceFile(
    const std::string& absFilename,
    std::map<std::string, std::string>& mocsIncluded,
    std::map<std::string, std::set<std::string> >& mocDepends,
    std::map<std::string, std::vector<std::string> >& includedUis,
    bool relaxed);

  void SearchHeadersForSourceFile(const std::string& absFilename,
                                  std::set<std::string>& mocHeaderFiles,
                                  std::set<std::string>& uicHeaderFiles) const;

  bool ParseHeaders(
    const std::set<std::string>& mocHeaderFiles,
    const std::set<std::string>& uicHeaderFiles,
    const std::map<std::string, std::string>& mocsIncluded,
    std::map<std::string, std::string>& mocsNotIncluded,
    std::map<std::string, std::set<std::string> >& mocDepends,
    std::map<std::string, std::vector<std::string> >& includedUis);

  void UicParseContent(
    const std::string& fileName, const std::string& contentText,
    std::map<std::string, std::vector<std::string> >& includedUis);

  bool MocParseSourceContent(
    const std::string& absFilename, const std::string& contentText,
    std::map<std::string, std::string>& mocsIncluded,
    std::map<std::string, std::set<std::string> >& mocDepends, bool relaxed);

  void MocParseHeaderContent(
    const std::string& absFilename, const std::string& contentText,
    std::map<std::string, std::string>& mocsNotIncluded,
    std::map<std::string, std::set<std::string> >& mocDepends);

  // -- Moc file generation
  bool MocGenerateAll(
    const std::map<std::string, std::string>& mocsIncluded,
    const std::map<std::string, std::string>& mocsNotIncluded,
    const std::map<std::string, std::set<std::string> >& mocDepends);
  bool MocGenerateFile(
    const std::string& sourceFile, const std::string& mocFileName,
    const std::map<std::string, std::set<std::string> >& mocDepends,
    bool included);

  // -- Uic file generation
  bool UicFindIncludedFile(std::string& absFile, const std::string& sourceFile,
                           const std::string& includeString);
  bool UicGenerateAll(
    const std::map<std::string, std::vector<std::string> >& includedUis);
  bool UicGenerateFile(const std::string& realName,
                       const std::string& uiInputFile,
                       const std::string& uiOutputFile);

  // -- Rcc file generation
  bool RccGenerateAll();
  bool RccGenerateFile(const std::string& qrcInputFile,
                       const std::string& qrcOutputFile, bool unique_n);

  // -- Logging
  void LogErrorNameCollision(
    const std::string& message,
    const std::multimap<std::string, std::string>& collisions) const;
  void LogBold(const std::string& message) const;
  void LogInfo(const std::string& message) const;
  void LogWarning(const std::string& message) const;
  void LogError(const std::string& message) const;
  void LogCommand(const std::vector<std::string>& command) const;

  // -- Utility
  bool NameCollisionTest(
    const std::map<std::string, std::string>& genFiles,
    std::multimap<std::string, std::string>& collisions) const;
  std::string ChecksumedPath(const std::string& sourceFile,
                             const std::string& basePrefix,
                             const std::string& baseSuffix) const;
  bool MakeParentDirectory(const char* logPrefix,
                           const std::string& filename) const;
  bool FileDiffers(const std::string& filename, const std::string& content);
  bool FileWrite(const char* logPrefix, const std::string& filename,
                 const std::string& content);

  bool RunCommand(const std::vector<std::string>& command, std::string& output,
                  bool verbose = true) const;

  bool FindHeader(std::string& header, const std::string& testBasePath) const;

  std::string MocFindHeader(const std::string& sourcePath,
                            const std::string& includeBase) const;
  bool MocFindIncludedFile(std::string& absFile, const std::string& sourceFile,
                           const std::string& includeString) const;

  // -- Meta
  std::string ConfigSuffix;
  // -- Directories
  std::string ProjectSourceDir;
  std::string ProjectBinaryDir;
  std::string CurrentSourceDir;
  std::string CurrentBinaryDir;
  std::string AutogenBuildDir;
  std::string AutogenIncludeDir;
  // -- Qt environment
  std::string QtMajorVersion;
  std::string MocExecutable;
  std::string UicExecutable;
  std::string RccExecutable;
  // -- File lists
  std::vector<std::string> Sources;
  std::vector<std::string> Headers;
  std::vector<std::string> HeaderExtensions;
  cmFilePathChecksum FPathChecksum;
  // -- Settings
  bool IncludeProjectDirsBefore;
  bool Verbose;
  bool ColorOutput;
  std::string SettingsFile;
  std::string SettingsStringMoc;
  std::string SettingsStringUic;
  std::string SettingsStringRcc;
  // -- Moc
  bool MocSettingsChanged;
  bool MocPredefsChanged;
  bool MocRelaxedMode;
  bool MocRunFailed;
  std::string MocCompFileRel;
  std::string MocCompFileAbs;
  std::string MocPredefsFileRel;
  std::string MocPredefsFileAbs;
  std::vector<std::string> MocSkipList;
  std::vector<std::string> MocIncludePaths;
  std::vector<std::string> MocIncludes;
  std::vector<std::string> MocDefinitions;
  std::vector<std::string> MocOptions;
  std::vector<std::string> MocPredefsCmd;
  std::vector<MocDependFilter> MocDependFilters;
  MocMacroFilter MocMacroFilters[2];
  cmsys::RegularExpression MocRegExpInclude;
  // -- Uic
  bool UicSettingsChanged;
  bool UicRunFailed;
  std::vector<std::string> UicSkipList;
  std::vector<std::string> UicTargetOptions;
  std::map<std::string, std::string> UicOptions;
  std::vector<std::string> UicSearchPaths;
  cmsys::RegularExpression UicRegExpInclude;
  // -- Rcc
  bool RccSettingsChanged;
  bool RccRunFailed;
  std::vector<std::string> RccSources;
  std::map<std::string, std::string> RccOptions;
  std::map<std::string, std::vector<std::string> > RccInputs;
};

#endif
back to top