/*============================================================================ CMake - Cross Platform Makefile Generator Copyright 2012-2015 Kitware, Inc. Distributed under the OSI-approved BSD License (the "License"); see accompanying file Copyright.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more information. ============================================================================*/ #ifndef cmCPackWIXGenerator_h #define cmCPackWIXGenerator_h #include "cmWIXPatch.h" #include "cmWIXShortcut.h" #include #include #include class cmWIXSourceWriter; class cmWIXDirectoriesSourceWriter; class cmWIXFilesSourceWriter; class cmWIXFeaturesSourceWriter; /** \class cmCPackWIXGenerator * \brief A generator for WIX files */ class cmCPackWIXGenerator : public cmCPackGenerator { public: cmCPackTypeMacro(cmCPackWIXGenerator, cmCPackGenerator); cmCPackWIXGenerator(); ~cmCPackWIXGenerator(); protected: virtual int InitializeInternal(); virtual int PackageFiles(); virtual const char* GetOutputExtension() { return ".msi"; } virtual enum CPackSetDestdirSupport SupportsSetDestdir() const { return SETDESTDIR_UNSUPPORTED; } virtual bool SupportsAbsoluteDestination() const { return false; } virtual bool SupportsComponentInstallation() const { return true; } private: typedef std::map id_map_t; typedef std::map ambiguity_map_t; typedef std::map shortcut_map_t; typedef std::set extension_set_t; bool InitializeWiXConfiguration(); bool PackageFilesImpl(); void CreateWiXVariablesIncludeFile(); void CreateWiXPropertiesIncludeFile(); void CreateWiXProductFragmentIncludeFile(); void CopyDefinition( cmWIXSourceWriter &source, std::string const& name); void AddDefinition(cmWIXSourceWriter& source, std::string const& name, std::string const& value); bool CreateWiXSourceFiles(); std::string GetProgramFilesFolderId() const; bool GenerateMainSourceFileFromTemplate(); bool CreateFeatureHierarchy( cmWIXFeaturesSourceWriter& featureDefinitions); bool AddComponentsToFeature( std::string const& rootPath, std::string const& featureId, cmWIXDirectoriesSourceWriter& directoryDefinitions, cmWIXFilesSourceWriter& fileDefinitions, cmWIXFeaturesSourceWriter& featureDefinitions, shortcut_map_t& shortcutMap); bool CreateStartMenuShortcuts( std::string const& cpackComponentName, std::string const& featureId, shortcut_map_t& shortcutMap, cmWIXFilesSourceWriter& fileDefinitions, cmWIXFeaturesSourceWriter& featureDefinitions); void AppendUserSuppliedExtraSources(); void AppendUserSuppliedExtraObjects(std::ostream& stream); bool CreateLicenseFile(); bool RunWiXCommand(std::string const& command); bool RunCandleCommand( std::string const& sourceFile, std::string const& objectFile); bool RunLightCommand(std::string const& objectFiles); void AddDirectoryAndFileDefinitons(std::string const& topdir, std::string const& directoryId, cmWIXDirectoriesSourceWriter& directoryDefinitions, cmWIXFilesSourceWriter& fileDefinitions, cmWIXFeaturesSourceWriter& featureDefinitions, const std::vector& pkgExecutables, const std::vector& desktopExecutables, shortcut_map_t& shortcutMap); bool RequireOption(std::string const& name, std::string& value) const; std::string GetArchitecture() const; static std::string GenerateGUID(); static std::string QuotePath(std::string const& path); static std::string GetRightmostExtension(std::string const& filename); std::string PathToId(std::string const& path); std::string CreateNewIdForPath(std::string const& path); static std::string CreateHashedId( std::string const& path, std::string const& normalizedFilename); std::string NormalizeComponentForId( std::string const& component, size_t& replacementCount); static bool IsLegalIdCharacter(char c); void CollectExtensions( std::string const& variableName, extension_set_t& extensions); void AddCustomFlags( std::string const& variableName, std::ostream& stream); std::vector WixSources; id_map_t PathToIdMap; ambiguity_map_t IdAmbiguityCounter; extension_set_t CandleExtensions; extension_set_t LightExtensions; bool HasDesktopShortcuts; std::string CPackTopLevel; cmWIXPatch* Patch; }; #endif