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 之一。此变量指定安装程序的目标架构。这也会影响正在使用的 Program Files 文件夹或注册表项。

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

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

强制性:

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")
强制性:

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

强制性:

默认:

OFF

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>

此组允许将自定义定义指令作为命令行选项添加到 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 脚本即可。

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

强制性: