Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Kitware
GitHub Repository: Kitware/CMake
Path: blob/master/Source/CPack/WiX/cmCPackWIXGenerator.h
5017 views
1
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2
file LICENSE.rst or https://cmake.org/licensing for details. */
3
#pragma once
4
5
#include <map>
6
#include <memory>
7
#include <string>
8
9
#include "cmCPackGenerator.h"
10
#include "cmWIXPatch.h"
11
#include "cmWIXShortcut.h"
12
13
class cmWIXSourceWriter;
14
class cmWIXDirectoriesSourceWriter;
15
class cmWIXFilesSourceWriter;
16
class cmWIXFeaturesSourceWriter;
17
18
/** \class cmCPackWIXGenerator
19
* \brief A generator for WIX files
20
*/
21
class cmCPackWIXGenerator : public cmCPackGenerator
22
{
23
public:
24
cmCPackTypeMacro(cmCPackWIXGenerator, cmCPackGenerator);
25
26
cmCPackWIXGenerator();
27
cmCPackWIXGenerator(cmCPackWIXGenerator const&) = delete;
28
cmCPackWIXGenerator const& operator=(cmCPackWIXGenerator const&) = delete;
29
~cmCPackWIXGenerator();
30
31
protected:
32
int InitializeInternal() override;
33
34
int PackageFiles() override;
35
36
char const* GetOutputExtension() override { return ".msi"; }
37
38
enum CPackSetDestdirSupport SupportsSetDestdir() const override
39
{
40
return SETDESTDIR_UNSUPPORTED;
41
}
42
43
bool SupportsAbsoluteDestination() const override { return false; }
44
45
bool SupportsComponentInstallation() const override { return true; }
46
47
private:
48
using id_map_t = std::map<std::string, std::string>;
49
using ambiguity_map_t = std::map<std::string, size_t>;
50
using extension_set_t = std::set<std::string>;
51
using xmlns_map_t = std::map<std::string, std::string>;
52
53
enum class DefinitionType
54
{
55
STRING,
56
PATH
57
};
58
59
bool InitializeWiXConfiguration();
60
61
bool PackageFilesImpl();
62
bool PackageWithWix();
63
bool PackageWithWix3();
64
65
void CreateWiXVariablesIncludeFile();
66
67
void CreateWiXPropertiesIncludeFile();
68
69
void CreateWiXProductFragmentIncludeFile();
70
71
void CopyDefinition(cmWIXSourceWriter& source, std::string const& name,
72
DefinitionType type = DefinitionType::STRING);
73
74
void AddDefinition(cmWIXSourceWriter& source, std::string const& name,
75
std::string const& value);
76
77
bool CreateWiXSourceFiles();
78
79
std::string GetRootFolderId() const;
80
81
bool GenerateMainSourceFileFromTemplate();
82
83
bool CreateFeatureHierarchy(cmWIXFeaturesSourceWriter& featureDefinitions);
84
85
bool AddComponentsToFeature(
86
std::string const& rootPath, std::string const& featureId,
87
cmWIXDirectoriesSourceWriter& directoryDefinitions,
88
cmWIXFilesSourceWriter& fileDefinitions,
89
cmWIXFeaturesSourceWriter& featureDefinitions, cmWIXShortcuts& shortcuts,
90
int diskId);
91
92
bool CreateShortcuts(std::string const& cpackComponentName,
93
std::string const& featureId,
94
cmWIXShortcuts const& shortcuts,
95
bool emitUninstallShortcut,
96
cmWIXFilesSourceWriter& fileDefinitions,
97
cmWIXFeaturesSourceWriter& featureDefinitions);
98
99
bool CreateShortcutsOfSpecificType(
100
cmWIXShortcuts::Type type, std::string const& cpackComponentName,
101
std::string const& featureId, std::string const& idPrefix,
102
cmWIXShortcuts const& shortcuts, bool emitUninstallShortcut,
103
cmWIXFilesSourceWriter& fileDefinitions,
104
cmWIXFeaturesSourceWriter& featureDefinitions);
105
106
void AppendUserSuppliedExtraSources();
107
108
void AppendUserSuppliedExtraObjects(std::ostream& stream);
109
110
bool CreateLicenseFile();
111
112
bool RunWiXCommand(std::string const& command);
113
114
bool RunCandleCommand(std::string const& sourceFile,
115
std::string const& objectFile);
116
117
bool RunLightCommand(std::string const& objectFiles);
118
119
void AddDirectoryAndFileDefinitions(
120
std::string const& topdir, std::string const& directoryId,
121
cmWIXDirectoriesSourceWriter& directoryDefinitions,
122
cmWIXFilesSourceWriter& fileDefinitions,
123
cmWIXFeaturesSourceWriter& featureDefinitions,
124
std::vector<std::string> const& packageExecutables,
125
std::vector<std::string> const& desktopExecutables,
126
cmWIXShortcuts& shortcuts, int diskId);
127
128
bool RequireOption(std::string const& name, std::string& value) const;
129
130
std::string GetArchitecture() const;
131
132
static std::string GenerateGUID();
133
134
static std::string QuotePath(std::string const& path);
135
136
static std::string GetRightmostExtension(std::string const& filename);
137
138
std::string PathToId(std::string const& path);
139
140
std::string CreateNewIdForPath(std::string const& path);
141
142
static std::string CreateHashedId(std::string const& path,
143
std::string const& normalizedFilename);
144
145
std::string NormalizeComponentForId(std::string const& component,
146
size_t& replacementCount);
147
148
static bool IsLegalIdCharacter(char c);
149
150
void CollectExtensions(std::string const& variableName,
151
extension_set_t& extensions);
152
153
void CollectXmlNamespaces(std::string const& variableName,
154
xmlns_map_t& namespaces);
155
156
void AddCustomFlags(std::string const& variableName, std::ostream& stream);
157
158
std::string RelativePathWithoutComponentPrefix(std::string const& path);
159
160
void InjectXmlNamespaces(cmWIXSourceWriter& sourceWriter);
161
162
std::vector<std::string> WixSources;
163
id_map_t PathToIdMap;
164
ambiguity_map_t IdAmbiguityCounter;
165
166
extension_set_t WixExtensions;
167
extension_set_t CandleExtensions;
168
extension_set_t LightExtensions;
169
xmlns_map_t CustomXmlNamespaces;
170
171
std::string CPackTopLevel;
172
173
std::unique_ptr<cmWIXPatch> Patch;
174
175
unsigned long WixVersion = 3;
176
177
cmWIXSourceWriter::GuidType ComponentGuidType;
178
};
179
180