cmCPackWIXGenerator.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /*============================================================================
  2. CMake - Cross Platform Makefile Generator
  3. Copyright 2000-2012 Kitware, Inc.
  4. Distributed under the OSI-approved BSD License (the "License");
  5. see accompanying file Copyright.txt for details.
  6. This software is distributed WITHOUT ANY WARRANTY; without even the
  7. implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  8. See the License for more information.
  9. ============================================================================*/
  10. #ifndef cmCPackWIXGenerator_h
  11. #define cmCPackWIXGenerator_h
  12. #include <CPack/cmCPackGenerator.h>
  13. #include <string>
  14. #include <map>
  15. struct cmWIXShortcut
  16. {
  17. std::string textLabel;
  18. std::string workingDirectoryId;
  19. };
  20. class cmWIXSourceWriter;
  21. /** \class cmCPackWIXGenerator
  22. * \brief A generator for WIX files
  23. */
  24. class cmCPackWIXGenerator : public cmCPackGenerator
  25. {
  26. public:
  27. cmCPackTypeMacro(cmCPackWIXGenerator, cmCPackGenerator);
  28. protected:
  29. virtual int InitializeInternal();
  30. virtual int PackageFiles();
  31. virtual const char* GetOutputExtension()
  32. {
  33. return ".msi";
  34. }
  35. virtual enum CPackSetDestdirSupport SupportsSetDestdir() const
  36. {
  37. return SETDESTDIR_UNSUPPORTED;
  38. }
  39. virtual bool SupportsAbsoluteDestination() const
  40. {
  41. return false;
  42. }
  43. virtual bool SupportsComponentInstallation() const
  44. {
  45. return true;
  46. }
  47. private:
  48. typedef std::map<std::string, std::string> id_map_t;
  49. typedef std::map<std::string, size_t> ambiguity_map_t;
  50. typedef std::map<std::string, cmWIXShortcut> shortcut_map_t;
  51. typedef std::set<std::string> extension_set_t;
  52. bool InitializeWiXConfiguration();
  53. bool PackageFilesImpl();
  54. bool CreateWiXVariablesIncludeFile();
  55. void CopyDefinition(
  56. cmWIXSourceWriter &source, const std::string &name);
  57. void AddDefinition(cmWIXSourceWriter& source,
  58. const std::string& name, const std::string& value);
  59. bool CreateWiXSourceFiles();
  60. bool CreateFeatureHierarchy(
  61. cmWIXSourceWriter& featureDefinitions);
  62. bool EmitFeatureForComponentGroup(
  63. cmWIXSourceWriter& featureDefinitions,
  64. cmCPackComponentGroup const& group);
  65. bool EmitFeatureForComponent(
  66. cmWIXSourceWriter& featureDefinitions,
  67. cmCPackComponent const& component);
  68. bool AddComponentsToFeature(
  69. std::string const& rootPath,
  70. std::string const& featureId,
  71. cmWIXSourceWriter& directoryDefinitions,
  72. cmWIXSourceWriter& fileDefinitions,
  73. cmWIXSourceWriter& featureDefinitions,
  74. shortcut_map_t& shortcutMap);
  75. bool CreateStartMenuShortcuts(
  76. std::string const& cpackComponentName,
  77. std::string const& featureId,
  78. shortcut_map_t& shortcutMap,
  79. cmWIXSourceWriter& fileDefinitions,
  80. cmWIXSourceWriter& featureDefinitions);
  81. void CreateUninstallShortcut(
  82. std::string const& packageName,
  83. cmWIXSourceWriter& fileDefinitions);
  84. void AppendUserSuppliedExtraSources();
  85. void AppendUserSuppliedExtraObjects(std::ostream& stream);
  86. bool CreateLicenseFile();
  87. bool RunWiXCommand(const std::string& command);
  88. bool RunCandleCommand(
  89. const std::string& sourceFile, const std::string& objectFile);
  90. bool RunLightCommand(const std::string& objectFiles);
  91. void AddDirectoryAndFileDefinitons(const std::string& topdir,
  92. const std::string& directoryId,
  93. cmWIXSourceWriter& directoryDefinitions,
  94. cmWIXSourceWriter& fileDefinitions,
  95. cmWIXSourceWriter& featureDefinitions,
  96. const std::vector<std::string>& pkgExecutables,
  97. shortcut_map_t& shortcutMap);
  98. bool RequireOption(const std::string& name, std::string& value) const;
  99. std::string GetArchitecture() const;
  100. static std::string GenerateGUID();
  101. static std::string QuotePath(const std::string& path);
  102. static std::string GetRightmostExtension(const std::string& filename);
  103. std::string PathToId(const std::string& path);
  104. std::string CreateNewIdForPath(const std::string& path);
  105. static std::string CreateHashedId(
  106. const std::string& path, const std::string& normalizedFilename);
  107. std::string NormalizeComponentForId(
  108. const std::string& component, size_t& replacementCount);
  109. static bool IsLegalIdCharacter(char c);
  110. void CollectExtensions(
  111. const std::string& variableName, extension_set_t& extensions);
  112. void AddCustomFlags(
  113. const std::string& variableName, std::ostream& stream);
  114. void CreateStartMenuFolder(cmWIXSourceWriter& directoryDefinitions);
  115. std::vector<std::string> wixSources;
  116. id_map_t pathToIdMap;
  117. ambiguity_map_t idAmbiguityCounter;
  118. extension_set_t candleExtensions;
  119. extension_set_t lightExtensions;
  120. };
  121. #endif