CPack Inno Setup 生成器

在 3.27 版本中新增。

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

本文档介绍了 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

设置特定变量

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 会使用一个演示文件。如果您希望安装程序完全忽略许可证文件,可以启用此选项。

强制项:

默认值

关闭

CPACK_INNOSETUP_IGNORE_README_PAGE

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

强制项:

默认值

ON

CPACK_INNOSETUP_PASSWORD

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

强制项:

CPACK_INNOSETUP_USE_MODERN_WIZARD

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

强制项:

默认值

OFF,因为兼容性原因

CPACK_INNOSETUP_ICON_FILE

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

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

强制项:

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

强制项:

文件特定变量

虽然通过 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")
强制项:

此变量应包含一个 分号分隔的列表,包含 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")
强制项:

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

强制项:

默认值

关闭

CPACK_INNOSETUP_RUN_EXECUTABLES

一个 分号分隔的列表,包含在 CPACK_PACKAGE_EXECUTABLES 中指定的可执行文件,用户可以在安装程序完成后运行它们。

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

强制项:

组件特定变量

该生成器支持组件以及下载的组件。但是,组件的一些功能尚不支持(尤其是组件依赖项)。这些变量目前被忽略。

CPack 会因技术原因在 Inno Setup 中更改组件的名称(如果它有一个父组)。如果您的组件名为 component 且其父组为 group,请考虑在 Inno Setup 脚本中使用 group\component 作为组件名称。

这里有一些组件的附加变量

CPACK_INNOSETUP_<compName>_INSTALL_DIRECTORY

如果您不希望组件 compName 安装在 {app} 下,您需要在此指定其安装目录。

强制项:

CPACK_INNOSETUP_VERIFY_DOWNLOADS

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

如果此选项开启,将在编译和下载时计算下载的压缩文件的哈希值。只有当它们匹配时,安装程序才会继续。

强制项:

默认值

ON

编译和脚本特定变量

CPACK_INNOSETUP_EXECUTABLE

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

强制项:

默认值

ISCC

CPACK_INNOSETUP_EXECUTABLE_ARGUMENTS

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

例如: /Qp;/Smysigntool=$p

请注意 转义问题

强制项:

CPACK_INNOSETUP_DEFINE_<macro>

此组允许将自定义的 define 指令作为命令行选项添加到 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}

请注意 转义问题

强制项:

CPACK_INNOSETUP_EXTRA_SCRIPTS

一个 分号分隔的列表,包含要处理的额外 .iss 脚本文件的路径。

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

您可以在文件中添加任何节来扩展安装程序(例如,添加额外的任务或注册表项)。在扩展 [Setup] 部分时,请优先使用 CPACK_INNOSETUP_SETUP_<directive>

强制项:

CPACK_INNOSETUP_CODE_FILES

一个 分号分隔的列表,包含要处理的额外 Pascal 文件的路径。

此变量实际上与 CPACK_INNOSETUP_EXTRA_SCRIPTS 相同,只不过您不必在文件顶部添加 [Code]。切勿更改代码文件中的当前节。这会导致未定义的行为!请将它们视为普通的 Pascal 脚本。

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

强制项: