CPack Inno Setup 生成器

在 3.27 版本中新增。

Inno Setup 是 Jordan Russell 和 Martijn Laan(https://jrsoftware.org/isinfo.php)开发的用于 Windows 程序的免费安装程序。

本文档解释 Inno Setup 生成器特定的选项。

生成器提供了许多选项,例如组件。遗憾的是,并非所有功能(例如组件依赖性)都得到 Inno Setup 当前的支持,生成器暂时会忽略这些功能。

CPack 需要 Inno Setup 6 或更高版本。

在 3.30 版本中新增: 生成器现可用于非 Windows 主机,但需要 Wine 来运行 Inno Setup 工具。

CPack Inno Setup 生成器的专用变量

你可以使用以下变量来更改 CPack INNOSETUP 生成器的行为

常规

Inno Setup 生成器不需要设置以下所有变量才能运行。如果下面将某个变量标记为强制,但未设置,则采用其默认值。

这些变量还包含 Inno Setup 常量,如 {app}。请参阅 Inno Setup 的文档了解详细信息。

如果系统提示你提供某个文件的路径,你始终可以给出一个绝对路径,或者在大多数情况下,给出一个 install() 指令安置的所有文件的顶级目录的相对路径。

CPack 会尝试为你转义引号及其他特殊字符。不过,使用特殊字符可能会导致问题。

以下变量简化了在 CMake 中使用 Inno Setup

CPACK_INNOSETUP_USE_CMAKE_BOOL_FORMAT

Inno Setup 只将 yesno 用作布尔格式,而 CMake 则使用 ONOFF 等许多其他替代格式。如果打开此选项,会启用自动转换。

考虑以下示例

set(CMAKE_INNOSETUP_SETUP_AllowNoIcons OFF)

如果打开此选项,将在输出脚本中创建以下行: AllowNoIcons=no。否则,将创建以下错误行: AllowNoIcons=OFF

转换在每个 Inno Setup 专用变量中启用。

强制:

默认:

ON

Setup 专用变量

CPACK_INNOSETUP_ARCHITECTURE

使用 x86x64arm64ia64 中的一种。此变量指定安装程序的目标架构。它还会影响使用的程序文件文件夹或注册表项。

CPack 尝试使用试编译(参见 CMAKE_SIZEOF_VOID_P)确定正确的值,但此选项也可以手动指定(尤其是在使用 ia64 或跨平台编译时)。

强制:

默认:

根据试编译结果,可能是 x86x64

CPACK_INNOSETUP_INSTALL_ROOT

如果您不希望安装程序在 Program Files 下创建安装目录,则您必须在此指定安装目录。

安装的完整目录将为:${CPACK_INNOSETUP_INSTALL_ROOT}/${CPACK_PACKAGE_INSTALL_DIRECTORY}

强制:

默认:

{autopf}

CPACK_INNOSETUP_ALLOW_CUSTOM_DIRECTORY

如果启用,则安装程序允许用户通过提供额外的向导页修改安装目录。

强制:

默认:

ON

CPACK_INNOSETUP_PROGRAM_MENU_FOLDER

正在创建的开始菜单文件夹的初始名称。

如果此变量设置为 .,则不会创建单独的文件夹,应用程序快捷方式将出现在顶层开始菜单文件夹中。

强制:

默认:

CPACK_PACKAGE_NAME 的值

CPACK_INNOSETUP_LANGUAGES

您希望 Inno Setup 包含的语言的 分号分隔列表

当前可用:armenianbrazilianPortuguesebulgariancatalancorsicanczechdanishdutchenglishfinnishfrenchgermanhebrewicelandicitalianjapanesenorwegianpolishportugueserussianslovakslovenianspanishturkishukrainian。此列表可能会根据 Inno Setup 的版本而有所不同。

强制:

默认:

english

CPACK_INNOSETUP_IGNORE_LICENSE_PAGE

如果您未使用 CPACK_RESOURCE_FILE_LICENSE 指定许可文件,CPack 会使用一个文件作为演示目的。如果您希望安装程序完全忽略许可文件,可以使用此选项。

强制:

默认:

OFF

CPACK_INNOSETUP_IGNORE_README_PAGE

如果您未使用 CPACK_RESOURCE_FILE_README 指定自述文件,CPack 会使用一个文件作为演示目的。如果您希望安装程序完全忽略自述文件,可以使用此选项。使用自定义自述文件时,确保禁用此选项。

强制:

默认:

ON

CPACK_INNOSETUP_PASSWORD

使用指定密码启用密码保护和文件加密。

强制:

No

CPACK_INNOSETUP_USE_MODERN_WIZARD

启用 Inno Setup 提供的现代外观。如果此选项关闭,则会使用经典样式。也会影响图像和图标文件。

强制:

默认:

OFF 出于兼容性原因

CPACK_INNOSETUP_ICON_FILE

指向自定义安装程序 .ico 文件的路径。

使用 CPACK_PACKAGE_ICON 自定义向导中显示的位图文件。

强制:

No

CPACK_INNOSETUP_SETUP_<directive>

此组允许调整由 Inno Setup 提供的 [Setup] 部分指令(其中 directive 为其名称)。

以下是一些示例

set(CPACK_INNOSETUP_SETUP_WizardSmallImageFile "my_bitmap.bmp")
set(CPACK_INNOSETUP_SETUP_AllowNoIcons OFF) # This requires CPACK_INNOSETUP_USE_CMAKE_BOOL_FORMAT to be on

所有这些变量的优先级都高于其他变量。请考虑以下示例

set(CPACK_INNOSETUP_SETUP_Password "admin")
set(CPACK_INNOSETUP_PASSWORD "secret")

密码最终会是 admin,原因在于 CPACK_INNOSETUP_PASSWORD 的优先级低于 CPACK_INNOSETUP_SETUP_Password

强制:

No

文件特定变量

尽管通过 install() 指令安装的所有文件都会自动处理并添加到安装程序,但有一些变量用于自定义安装流程。

在快捷方式(例如 CPACK_CREATE_DESKTOP_LINKS)或 [Run] 项中使用可执行文件(仅 .exe.com)之前,必须将原始文件名(不带路径和扩展名)添加到 CPACK_PACKAGE_EXECUTABLES 并为其创建开始菜单快捷方式。

如果两个文件具有相同的原始名称(例如 a/executable.exeb/executable.com),则部分中会创建两个该项。这将导致行为未定义,因此不建议这样做。

CPACK_INNOSETUP_CUSTOM_INSTALL_INSTRUCTIONS

此变量应包含对 pathinstruction 对的分号分隔列表,可用于自定义自动为每个文件或目录创建的安装命令。

CPack 为每个文件创建以下 Inno Setup 指令...

Source: "absolute\path\to\my_file.txt"; DestDir: "{app}"; Flags: ignoreversion

...并为每个目录创建以下行

Name: "{app}\my_folder"

你可能想要更改 my_file.txt 的目标目录或标志。由于我们还可以提供相对路径,因此你想要的行如下所示

Source: "my_file.txt"; DestDir: "{userdocs}"; Flags: ignoreversion uninsneveruninstall

使用方法是:使用 my_file.txt 作为 path,并使用 Source: "my_file.txt"; DestDir: "{userdocs}"; Flags: ignoreversion uninsneveruninstall 作为 instruction

您要解决 转义问题。因此,CMake 命令应该是

set(CPACK_INNOSETUP_CUSTOM_INSTALL_INSTRUCTIONS "my_file.txt;Source: \\\"my_file.txt\\\"\\; DestDir: \\\"{userdocs}\\\"\\; Flags: ignoreversion uninsneveruninstall")

为了提高可读性,您应该通过使用 CPACK_VERBATIM_VARIABLES 或将说明放入单独的 CPack 项目配置文件中,来解决转义问题。

如果您自定义特定文件的安装说明,您将丢失与它的组件的连接。要解决此问题,请手动添加 Components: <component>。您还需要在自定义部分中自己添加它的快捷方式和 [Run] 项,因为 CPACK_PACKAGE_EXECUTABLES 将不再找到可执行文件。

以下是另一个示例(注意:您必须解决转义问题才能使示例正常工作)

set(CPACK_INNOSETUP_CUSTOM_INSTALL_INSTRUCTIONS
    "component1/my_folder" "Name: \"{userdocs}\\my_folder\"\; Components: component1"
    "component2/my_folder2/my_file.txt" "Source: \"component2\\my_folder2\\my_file.txt\"\; DestDir: \"{app}\\my_folder2\\my_file.txt\"\; Flags: ignoreversion uninsneveruninstall\; Components: component2")
强制:

No

此变量应包含 分号分隔列表 的对 linklink name,并可用于在可执行文件的开始菜单文件夹中添加快捷方式(参见 CPACK_PACKAGE_EXECUTABLES)。虽然 link name 是标签,link 可以是 URL 或相对于安装目录的路径。

这里是一个示例

set(CPACK_INNOSETUP_MENU_LINKS
    "doc/cmake-@CMake_VERSION_MAJOR@.@CMake_VERSION_MINOR@/cmake.html"
    "CMake Help" "https://cmake.com.cn" "CMake Web Site")
强制:

No

如果启用此选项,会自动将指向应用程序卸载程序的快捷方式添加到开始菜单文件夹。

强制:

默认:

OFF

CPACK_INNOSETUP_RUN_EXECUTABLES

安装程序完成后用户可以运行的 分号分隔列表 中指定的 CPACK_PACKAGE_EXECUTABLES 中的可执行文件。

它们内部添加到 [Run] 部分。

强制:

No

特定于组件的变量

该生成器支持组件和下载的组件。但是,有一些组件特性尚不支持(尤其是组件依赖关系)。这些变量目前被忽略。

基于技术原因,如果 CPack 组件在 Inno Setup 中有父组,则它的名称将发生更改。如果您有组件 component 及其父组 group,请考虑在 Inno Setup 脚本中使用 group\component 作为组件名称。

以下是组件的一些其他变量

CPACK_INNOSETUP_<compName>_INSTALL_DIRECTORY

如果你不希望 compName 组件安装在 {app} 下,你必须在此处指定其安装目录。

强制:

No

CPACK_INNOSETUP_VERIFY_DOWNLOADS

此选项仅影响已下载的组件。

如果启用此选项,将在编译和下载期间计算已下载归档的哈希值。仅当哈希值匹配时,安装程序才会继续进行。

强制:

默认:

ON

特定于编译和脚本的变量

CPACK_INNOSETUP_EXECUTABLE

Inno Setup 脚本编译器命令的文件名。

强制:

默认:

ISCC

CPACK_INNOSETUP_EXECUTABLE_ARGUMENTS

一个 用分号分隔的列表,其中包含 Inno Setup 脚本编译器命令的额外命令行选项。

例如:/Qp;/Smysigntool=$p

注意 转义问题

强制:

No

CPACK_INNOSETUP_DEFINE_<macro>

此组允许将自定义定义指令添加为命令行选项,传递给 Inno Setup 预处理器命令。每个条目模仿 #define public <macro> 指令。其宏可从任何地方访问(public),因此也可在额外的脚本文件中使用该宏。

宏名称不得包含任何特殊字符。有关详细规则,请参阅 Inno Setup 预处理器文档。

考虑以下示例

# The following line emulates: #define public MyMacro "Hello, World!"
set(CPACK_INNOSETUP_DEFINE_MyMacro "Hello, World!")

这时,你可以在任何地方使用 MyMacro。例如在以下额外脚本中:

AppComments={#emit "'My Macro' has the value: " + MyMacro}

注意 转义问题

强制:

No

CPACK_INNOSETUP_EXTRA_SCRIPTS

一个 用分号分隔的列表,其中包含要处理的其他 .iss 脚本文件的路径。

它们在输出脚本文件的顶部使用 #include 指令进行内部包含。

你可以在文件中添加任何部分来扩展安装程序(例如添加其他任务或注册表项)。在扩展 [Setup] 章节时,最好使用 CPACK_INNOSETUP_SETUP_<directive>

强制:

No

CPACK_INNOSETUP_CODE_FILES

用分号分隔的列表,包含要处理的其他 Pascal 文件的路径。

此变量实际上与 CPACK_INNOSETUP_EXTRA_SCRIPTS 相同,除了不必在文件顶部添加 [Code]。切勿更改代码文件中的当前部分。这样会导致行为未定义!相反,将它们视为正常的 Pascal 脚本。

代码文件包含在输出脚本的最底部。

强制:

No