使用 CPACK 自定义 NSIS 安装程序

Posted

技术标签:

【中文标题】使用 CPACK 自定义 NSIS 安装程序【英文标题】:Customizing NSIS installer using CPACK 【发布时间】:2014-01-15 17:48:24 【问题描述】:

我正在尝试使用 CMAKE 和 CPACK 自定义 NSIS 安装程序。 特别是我想在生成的 project.nsi 中包含一个外部脚本。

类似:

!include "@SCRIPT_PATH@\@SCRIPT_NAME@.nsh"

为此,我遵循此处显示的示例:https://gitlab.kitware.com/cmake/community/-/wikis/doc/cpack/NSISAdvancedTips

我已复制模板脚本文件 (NSIS.template.in) 并添加了所需的命令。 我现在需要相应地配置两个变量“@SCRIPT_PATH@ 和 @SCRIPT_NAME@。

我尝试将它们设置为标准 CMAKE 变量

SET(SCRIPT_PATH "somePath")
SET(SCRIPT_NAME "someName")

但是模板变量被 CPACK 简单地留空

有什么线索吗?

【问题讨论】:

【参考方案1】:

我找到了一个可行的解决方案。

首先在主 NSIS.template.in 中添加一个占位符,以便在其中插入新命令,例如:

@NSIS_ADDITIONAL_SCRIPT@

然后您需要配置一个模板文件,其中包含将传递给 CPACK 构建的选项。

CPackOptions.cmake 包含以下内容:

SET(NSIS_ADDITIONAL_SCRIPT $NSIS_ADDITIONAL_SCRIPT)

然后在您的 CMAKE 脚本中,在包含 CPACK 之前,您需要设置 NSIS_ADDITIONAL_SCRIPT 变量(为了在窗口系统上具有正确的反斜杠集,路径被重新设计)

SET(scriptPath "[path to the script location]" )
FILE(TO_NATIVE_PATH $scriptPath scriptPath )
STRING(REPLACE "\\" "\\\\" scriptPath  $scriptPath ) 

最后配置 CPackOption.cmake 文件(注意斜线和逗号的正确数量)

SET(NSIS_ADDITIONAL_SCRIPT " \"!include \\\"$scriptPath\\\" \\n  \" ")
CONFIGURE_FILE( $CMAKE_SOURCE_DIR/CMakeConf/CPackOptions.cmake $PROJECT_BINARY_DIR/CPackOptions.cmake)

如果你做的一切都正确:

通过配置和生成 CMAKE 脚本,您将在项目构建文件夹中找到文件 CPackOptions.cmake。 CPACK 将使用此配置文件来填充添加到 NSIStemplate.in 中的变量。 最终生成的 project.nsi 将包含额外的 !include 指令

【讨论】:

这适用于 cmake 3.20 吗?我试过了,但是 template.in 文件中的变量将被删除并保持空白

以上是关于使用 CPACK 自定义 NSIS 安装程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在重新安装期间显示带有 CPack NSIS 的卸载程序窗口?

CPack:如何执行多个 CPACK_NSIS_EXTRA_INSTALL_COMMANDS?

NSIS 安装程序应用程序名称未正确显示

如何在 NSIS 安装(CMake)中设置图标

cpack:如何在安装过程中将程序与文件扩展名关联?

CPack 不包含 mfc100.dll