CPackWIX: Implement new CPACK_WIX_SKIP_PROGRAM_FOLDER feature

The new variable allows setting of a custom absolute installation prefix
outside of the ProgramFiles folders.
This commit is contained in:
Michael Stürmer 2016-07-20 15:32:38 +02:00 committed by Nils Gladitz
parent 5a62e0c172
commit 17bbf6af1e
6 changed files with 55 additions and 4 deletions

View File

@ -0,0 +1,7 @@
wix-custom-install-dir
----------------------
* The CPack WIX generator now supports
:variable:`CPACK_WIX_SKIP_PROGRAM_FOLDER` to allow specification
of a custom absolute installation prefix outside
of the ProgramFiles folders.

View File

@ -248,6 +248,23 @@
# Sets the description of the root install feature in the WIX installer. Same as # Sets the description of the root install feature in the WIX installer. Same as
# CPACK_COMPONENT_<compName>_DESCRIPTION for components. # CPACK_COMPONENT_<compName>_DESCRIPTION for components.
# #
# .. variable:: CPACK_WIX_SKIP_PROGRAM_FOLDER
#
# If this variable is set to true, the default install location
# of the generated package will be CPACK_PACKAGE_INSTALL_DIRECTORY directly.
# The install location will not be located relatively below
# ProgramFiles or ProgramFiles64.
#
# .. note::
# Installers created with this feature do not take differences
# between the system on which the installer is created
# and the system on which the installer might be used into account.
#
# It is therefor possible that the installer e.g. might try to install
# onto a drive that is unavailable or unintended or a path that does not
# follow the localization or convention of the system on which the
# installation is performed.
#
#============================================================================= #=============================================================================
# Copyright 2014-2015 Kitware, Inc. # Copyright 2014-2015 Kitware, Inc.

View File

@ -18,6 +18,7 @@
#include <cmGeneratedFileStream.h> #include <cmGeneratedFileStream.h>
#include <cmInstalledFile.h> #include <cmInstalledFile.h>
#include <cmSystemTools.h> #include <cmSystemTools.h>
#include <cmUuid.h>
#include "cmWIXDirectoriesSourceWriter.h" #include "cmWIXDirectoriesSourceWriter.h"
#include "cmWIXFeaturesSourceWriter.h" #include "cmWIXFeaturesSourceWriter.h"
@ -441,6 +442,11 @@ bool cmCPackWIXGenerator::CreateWiXSourceFiles()
cmWIXFilesSourceWriter fileDefinitions(this->Logger, cmWIXFilesSourceWriter fileDefinitions(this->Logger,
fileDefinitionsFilename); fileDefinitionsFilename);
// if install folder is supposed to be set absolutely, the default
// component guid "*" cannot be used
fileDefinitions.GenerateComponentGuids =
cmSystemTools::IsOn(GetOption("CPACK_WIX_SKIP_PROGRAM_FOLDER"));
fileDefinitions.BeginElement("Fragment"); fileDefinitions.BeginElement("Fragment");
std::string featureDefinitionsFilename = std::string featureDefinitionsFilename =
@ -566,6 +572,9 @@ bool cmCPackWIXGenerator::CreateWiXSourceFiles()
std::string cmCPackWIXGenerator::GetProgramFilesFolderId() const std::string cmCPackWIXGenerator::GetProgramFilesFolderId() const
{ {
if (cmSystemTools::IsOn(GetOption("CPACK_WIX_SKIP_PROGRAM_FOLDER"))) {
return "";
}
if (GetArchitecture() == "x86") { if (GetArchitecture() == "x86") {
return "ProgramFilesFolder"; return "ProgramFilesFolder";
} else { } else {

View File

@ -52,8 +52,12 @@ size_t cmWIXDirectoriesSourceWriter::BeginInstallationPrefixDirectory(
std::string const& programFilesFolderId, std::string const& programFilesFolderId,
std::string const& installRootString) std::string const& installRootString)
{ {
BeginElement("Directory"); size_t offset = 1;
AddAttribute("Id", programFilesFolderId); if (!programFilesFolderId.empty()) {
BeginElement("Directory");
AddAttribute("Id", programFilesFolderId);
offset = 0;
}
std::vector<std::string> installRoot; std::vector<std::string> installRoot;
@ -77,7 +81,7 @@ size_t cmWIXDirectoriesSourceWriter::BeginInstallationPrefixDirectory(
AddAttribute("Name", installRoot[i]); AddAttribute("Name", installRoot[i]);
} }
return installRoot.size(); return installRoot.size() - offset;
} }
void cmWIXDirectoriesSourceWriter::EndInstallationPrefixDirectory(size_t size) void cmWIXDirectoriesSourceWriter::EndInstallationPrefixDirectory(size_t size)

View File

@ -16,6 +16,9 @@
#include <cmInstalledFile.h> #include <cmInstalledFile.h>
#include <cmSystemTools.h>
#include <cmUuid.h>
#include <sys/types.h> #include <sys/types.h>
// include sys/stat.h after sys/types.h // include sys/stat.h after sys/types.h
#include <sys/stat.h> #include <sys/stat.h>
@ -23,6 +26,7 @@
cmWIXFilesSourceWriter::cmWIXFilesSourceWriter(cmCPackLog* logger, cmWIXFilesSourceWriter::cmWIXFilesSourceWriter(cmCPackLog* logger,
std::string const& filename) std::string const& filename)
: cmWIXSourceWriter(logger, filename) : cmWIXSourceWriter(logger, filename)
, GenerateComponentGuids(false)
{ {
} }
@ -126,12 +130,20 @@ std::string cmWIXFilesSourceWriter::EmitComponentFile(
std::string componentId = std::string("CM_C") + id; std::string componentId = std::string("CM_C") + id;
std::string fileId = std::string("CM_F") + id; std::string fileId = std::string("CM_F") + id;
std::string guid = "*";
if (this->GenerateComponentGuids) {
std::string md5 = cmSystemTools::ComputeStringMD5(componentId);
cmUuid uuid;
std::vector<unsigned char> ns;
guid = uuid.FromMd5(ns, md5);
}
BeginElement("DirectoryRef"); BeginElement("DirectoryRef");
AddAttribute("Id", directoryId); AddAttribute("Id", directoryId);
BeginElement("Component"); BeginElement("Component");
AddAttribute("Id", componentId); AddAttribute("Id", componentId);
AddAttribute("Guid", "*"); AddAttribute("Guid", guid);
if (installedFile) { if (installedFile) {
if (installedFile->GetPropertyAsBool("CPACK_NEVER_OVERWRITE")) { if (installedFile->GetPropertyAsBool("CPACK_NEVER_OVERWRITE")) {

View File

@ -47,6 +47,8 @@ public:
std::string const& id, std::string const& id,
std::string const& filePath, cmWIXPatch& patch, std::string const& filePath, cmWIXPatch& patch,
cmInstalledFile const* installedFile); cmInstalledFile const* installedFile);
bool GenerateComponentGuids;
}; };
#endif #endif