blob: e057e6c0eefe66e471850d4b53cad16f79a9b217 [file] [log] [blame]
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#pragma once
#include <map>
#include <string>
#include <vector>
#include "cmCPackGenerator.h"
#include "cmValue.h"
using cmCPackInnoSetupKeyValuePairs = std::map<std::string, std::string>;
class cmCPackComponentGroup;
class cmCPackComponent;
/** \class cmCPackInnoSetupGenerator
* \brief A generator for Inno Setup
*
* https://jrsoftware.org/isinfo.php
*/
class cmCPackInnoSetupGenerator : public cmCPackGenerator
{
public:
cmCPackTypeMacro(cmCPackInnoSetupGenerator, cmCPackGenerator);
/**
* Construct generator
*/
cmCPackInnoSetupGenerator();
~cmCPackInnoSetupGenerator() override;
static bool CanGenerate();
protected:
int InitializeInternal() override;
int PackageFiles() override;
inline const char* GetOutputExtension() override { return ".exe"; }
inline cmCPackGenerator::CPackSetDestdirSupport SupportsSetDestdir()
const override
{
return cmCPackGenerator::SETDESTDIR_UNSUPPORTED;
}
inline bool SupportsAbsoluteDestination() const override { return false; }
inline bool SupportsComponentInstallation() const override { return true; }
private:
enum class PathType
{
Windows,
Native,
};
bool ProcessSetupSection();
bool ProcessFiles();
bool ProcessComponents();
bool ConfigureISScript();
bool Compile();
bool BuildDownloadedComponentArchive(cmCPackComponent* component,
const std::string& uploadDirectory,
std::string* hash);
/**
* Returns the option's value or an empty string if the option isn't set.
*/
cmValue RequireOption(const std::string& key);
std::string CustomComponentInstallDirectory(
const cmCPackComponent* component);
/**
* Translates boolean expressions into "yes" or "no", as required in
* Inno Setup (only if "CPACK_INNOSETUP_USE_CMAKE_BOOL_FORMAT" is on).
*/
std::string TranslateBool(const std::string& value);
/**
* Creates a typical line of key and value pairs using the given map.
*
* (e.g.: Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}";
* GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked)
*/
std::string ISKeyValueLine(const cmCPackInnoSetupKeyValuePairs& params);
std::string CreateRecursiveComponentPath(cmCPackComponentGroup* group,
const std::string& path = "");
void CreateRecursiveComponentGroups(cmCPackComponentGroup* group);
/**
* These functions add quotes if the given value hasn't already quotes.
* Paths are converted into the format used by Windows before.
*/
std::string Quote(const std::string& string);
std::string QuotePath(const std::string& path,
PathType type = PathType::Windows);
/**
* This function replaces the following 5 characters with their %-encoding:
* '|' '}' ',' '%' '"'
* Required for Inno Setup constants like {cm:...}
*/
std::string PrepareForConstant(const std::string& string);
std::vector<std::string> includeDirectives;
cmCPackInnoSetupKeyValuePairs setupDirectives;
bool toplevelProgramFolder;
std::vector<std::string> languageInstructions;
std::vector<std::string> fileInstructions;
std::vector<std::string> dirInstructions;
std::vector<std::string> typeInstructions;
std::vector<std::string> componentInstructions;
std::vector<std::string> iconInstructions;
std::vector<std::string> desktopIconComponents;
std::vector<std::string> runInstructions;
std::vector<std::string> codeIncludes;
};