mirror of
https://github.com/reactos/CMake.git
synced 2025-02-21 20:40:44 +00:00

Cygwin-built CMake now converts paths from Cygwin to Windows form (using cygpath -w) before they're passed to WiX. The Wix generator on Cygwin requires the libuuid-dev package when building CMake. However, the DLL it links to is installed by default as part of Cygwin's core libs, so it does not need to be distributed. If libuuid-dev isn't available, CMake is simply built without Wix support on Cygwin.
167 lines
4.5 KiB
C++
167 lines
4.5 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#include "cmWIXFilesSourceWriter.h"
|
|
|
|
#include "cmWIXAccessControlList.h"
|
|
|
|
#include "cmInstalledFile.h"
|
|
|
|
#include "cmSystemTools.h"
|
|
#include "cmUuid.h"
|
|
|
|
#include "cm_sys_stat.h"
|
|
|
|
#include "cmCMakeToWixPath.h"
|
|
|
|
cmWIXFilesSourceWriter::cmWIXFilesSourceWriter(cmCPackLog* logger,
|
|
std::string const& filename,
|
|
GuidType componentGuidType)
|
|
: cmWIXSourceWriter(logger, filename, componentGuidType)
|
|
{
|
|
}
|
|
|
|
void cmWIXFilesSourceWriter::EmitShortcut(std::string const& id,
|
|
cmWIXShortcut const& shortcut,
|
|
std::string const& shortcutPrefix,
|
|
size_t shortcutIndex)
|
|
{
|
|
std::ostringstream shortcutId;
|
|
shortcutId << shortcutPrefix << id;
|
|
|
|
if (shortcutIndex > 0) {
|
|
shortcutId << "_" << shortcutIndex;
|
|
}
|
|
|
|
std::string fileId = std::string("CM_F") + id;
|
|
|
|
BeginElement("Shortcut");
|
|
AddAttribute("Id", shortcutId.str());
|
|
AddAttribute("Name", shortcut.label);
|
|
std::string target = "[#" + fileId + "]";
|
|
AddAttribute("Target", target);
|
|
AddAttribute("WorkingDirectory", shortcut.workingDirectoryId);
|
|
EndElement("Shortcut");
|
|
}
|
|
|
|
void cmWIXFilesSourceWriter::EmitRemoveFolder(std::string const& id)
|
|
{
|
|
BeginElement("RemoveFolder");
|
|
AddAttribute("Id", id);
|
|
AddAttribute("On", "uninstall");
|
|
EndElement("RemoveFolder");
|
|
}
|
|
|
|
void cmWIXFilesSourceWriter::EmitInstallRegistryValue(
|
|
std::string const& registryKey, std::string const& cpackComponentName,
|
|
std::string const& suffix)
|
|
{
|
|
std::string valueName;
|
|
if (!cpackComponentName.empty()) {
|
|
valueName = cpackComponentName + "_";
|
|
}
|
|
|
|
valueName += "installed";
|
|
valueName += suffix;
|
|
|
|
BeginElement("RegistryValue");
|
|
AddAttribute("Root", "HKCU");
|
|
AddAttribute("Key", registryKey);
|
|
AddAttribute("Name", valueName);
|
|
AddAttribute("Type", "integer");
|
|
AddAttribute("Value", "1");
|
|
AddAttribute("KeyPath", "yes");
|
|
EndElement("RegistryValue");
|
|
}
|
|
|
|
void cmWIXFilesSourceWriter::EmitUninstallShortcut(
|
|
std::string const& packageName)
|
|
{
|
|
BeginElement("Shortcut");
|
|
AddAttribute("Id", "UNINSTALL");
|
|
AddAttribute("Name", "Uninstall " + packageName);
|
|
AddAttribute("Description", "Uninstalls " + packageName);
|
|
AddAttribute("Target", "[SystemFolder]msiexec.exe");
|
|
AddAttribute("Arguments", "/x [ProductCode]");
|
|
EndElement("Shortcut");
|
|
}
|
|
|
|
std::string cmWIXFilesSourceWriter::EmitComponentCreateFolder(
|
|
std::string const& directoryId, std::string const& guid,
|
|
cmInstalledFile const* installedFile)
|
|
{
|
|
std::string componentId = std::string("CM_C_EMPTY_") + directoryId;
|
|
|
|
BeginElement("DirectoryRef");
|
|
AddAttribute("Id", directoryId);
|
|
|
|
BeginElement("Component");
|
|
AddAttribute("Id", componentId);
|
|
AddAttribute("Guid", guid);
|
|
|
|
BeginElement("CreateFolder");
|
|
|
|
if (installedFile) {
|
|
cmWIXAccessControlList acl(Logger, *installedFile, *this);
|
|
acl.Apply();
|
|
}
|
|
|
|
EndElement("CreateFolder");
|
|
EndElement("Component");
|
|
EndElement("DirectoryRef");
|
|
|
|
return componentId;
|
|
}
|
|
|
|
std::string cmWIXFilesSourceWriter::EmitComponentFile(
|
|
std::string const& directoryId, std::string const& id,
|
|
std::string const& filePath, cmWIXPatch& patch,
|
|
cmInstalledFile const* installedFile)
|
|
{
|
|
std::string componentId = std::string("CM_C") + id;
|
|
std::string fileId = std::string("CM_F") + id;
|
|
|
|
std::string guid = CreateGuidFromComponentId(componentId);
|
|
|
|
BeginElement("DirectoryRef");
|
|
AddAttribute("Id", directoryId);
|
|
|
|
BeginElement("Component");
|
|
AddAttribute("Id", componentId);
|
|
AddAttribute("Guid", guid);
|
|
|
|
if (installedFile) {
|
|
if (installedFile->GetPropertyAsBool("CPACK_NEVER_OVERWRITE")) {
|
|
AddAttribute("NeverOverwrite", "yes");
|
|
}
|
|
if (installedFile->GetPropertyAsBool("CPACK_PERMANENT")) {
|
|
AddAttribute("Permanent", "yes");
|
|
}
|
|
}
|
|
|
|
patch.ApplyFragment(componentId, *this);
|
|
BeginElement("File");
|
|
AddAttribute("Id", fileId);
|
|
AddAttribute("Source", CMakeToWixPath(filePath));
|
|
AddAttribute("KeyPath", "yes");
|
|
|
|
mode_t fileMode = 0;
|
|
cmSystemTools::GetPermissions(filePath.c_str(), fileMode);
|
|
|
|
if (!(fileMode & S_IWRITE)) {
|
|
AddAttribute("ReadOnly", "yes");
|
|
}
|
|
patch.ApplyFragment(fileId, *this);
|
|
|
|
if (installedFile) {
|
|
cmWIXAccessControlList acl(Logger, *installedFile, *this);
|
|
acl.Apply();
|
|
}
|
|
|
|
EndElement("File");
|
|
|
|
EndElement("Component");
|
|
EndElement("DirectoryRef");
|
|
|
|
return componentId;
|
|
}
|