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:
parent
5a62e0c172
commit
17bbf6af1e
|
@ -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.
|
|
@ -248,6 +248,23 @@
|
|||
# Sets the description of the root install feature in the WIX installer. Same as
|
||||
# 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.
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <cmGeneratedFileStream.h>
|
||||
#include <cmInstalledFile.h>
|
||||
#include <cmSystemTools.h>
|
||||
#include <cmUuid.h>
|
||||
|
||||
#include "cmWIXDirectoriesSourceWriter.h"
|
||||
#include "cmWIXFeaturesSourceWriter.h"
|
||||
|
@ -441,6 +442,11 @@ bool cmCPackWIXGenerator::CreateWiXSourceFiles()
|
|||
cmWIXFilesSourceWriter fileDefinitions(this->Logger,
|
||||
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");
|
||||
|
||||
std::string featureDefinitionsFilename =
|
||||
|
@ -566,6 +572,9 @@ bool cmCPackWIXGenerator::CreateWiXSourceFiles()
|
|||
|
||||
std::string cmCPackWIXGenerator::GetProgramFilesFolderId() const
|
||||
{
|
||||
if (cmSystemTools::IsOn(GetOption("CPACK_WIX_SKIP_PROGRAM_FOLDER"))) {
|
||||
return "";
|
||||
}
|
||||
if (GetArchitecture() == "x86") {
|
||||
return "ProgramFilesFolder";
|
||||
} else {
|
||||
|
|
|
@ -52,8 +52,12 @@ size_t cmWIXDirectoriesSourceWriter::BeginInstallationPrefixDirectory(
|
|||
std::string const& programFilesFolderId,
|
||||
std::string const& installRootString)
|
||||
{
|
||||
BeginElement("Directory");
|
||||
AddAttribute("Id", programFilesFolderId);
|
||||
size_t offset = 1;
|
||||
if (!programFilesFolderId.empty()) {
|
||||
BeginElement("Directory");
|
||||
AddAttribute("Id", programFilesFolderId);
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
std::vector<std::string> installRoot;
|
||||
|
||||
|
@ -77,7 +81,7 @@ size_t cmWIXDirectoriesSourceWriter::BeginInstallationPrefixDirectory(
|
|||
AddAttribute("Name", installRoot[i]);
|
||||
}
|
||||
|
||||
return installRoot.size();
|
||||
return installRoot.size() - offset;
|
||||
}
|
||||
|
||||
void cmWIXDirectoriesSourceWriter::EndInstallationPrefixDirectory(size_t size)
|
||||
|
|
|
@ -16,6 +16,9 @@
|
|||
|
||||
#include <cmInstalledFile.h>
|
||||
|
||||
#include <cmSystemTools.h>
|
||||
#include <cmUuid.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
// include sys/stat.h after sys/types.h
|
||||
#include <sys/stat.h>
|
||||
|
@ -23,6 +26,7 @@
|
|||
cmWIXFilesSourceWriter::cmWIXFilesSourceWriter(cmCPackLog* logger,
|
||||
std::string const& filename)
|
||||
: cmWIXSourceWriter(logger, filename)
|
||||
, GenerateComponentGuids(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -126,12 +130,20 @@ std::string cmWIXFilesSourceWriter::EmitComponentFile(
|
|||
std::string componentId = std::string("CM_C") + 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");
|
||||
AddAttribute("Id", directoryId);
|
||||
|
||||
BeginElement("Component");
|
||||
AddAttribute("Id", componentId);
|
||||
AddAttribute("Guid", "*");
|
||||
AddAttribute("Guid", guid);
|
||||
|
||||
if (installedFile) {
|
||||
if (installedFile->GetPropertyAsBool("CPACK_NEVER_OVERWRITE")) {
|
||||
|
|
|
@ -47,6 +47,8 @@ public:
|
|||
std::string const& id,
|
||||
std::string const& filePath, cmWIXPatch& patch,
|
||||
cmInstalledFile const* installedFile);
|
||||
|
||||
bool GenerateComponentGuids;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue