向 cpack 添加额外的命令 - NSIS 打包程序/安装程序

Posted

技术标签:

【中文标题】向 cpack 添加额外的命令 - NSIS 打包程序/安装程序【英文标题】:Adding extra command to cpack - NSIS packager/installer 【发布时间】:2014-10-23 14:55:39 【问题描述】:

我想使用现有的 CPack 和 NSIS 为我的 windows 项目打包 GeneratorConfig.cmake 文件,我想在其中添加一个额外的命令,它将一个名为 myProject.ini.ini 文件复制到 %APPDATA%/myProject/myProject.ini 中。

这是 GeneratorConfig.cmake

SET(INSTALL_AN_ALREADY_EXISTING_DIR ".")
##########################################################################
## Begin NSIS Specific options
##------------------------------------------------------------------------
if(CPACK_GENERATOR MATCHES NSIS)
# Additional NSIS commands to uninstall start menu shortcuts
SET(CPACK_NSIS_DELETE_ICONS_EXTRA
  "Delete \"$SMPROGRAMS\\$MUI_TEMP\\$PROJECT_NAME.lnk\" 
   StrCmp \"$INSTALL_DESKTOP\" \"1\" 0 +2
   Delete \"$DESKTOP\\$PROJECT_NAME.lnk\" ")
# The display name string that appears in the Windows Add/Remove Program control panel
SET(CPACK_NSIS_DISPLAY_NAME "$PROJECT_NAME $PROJECT_VER_MAJOR.$PROJECT_VER_MINOR")
SET(CPACK_NSIS_DISPLAY_NAME_SET "TRUE")

# Extra NSIS commands that will be added to the end of the install Section, after your
# install tree is available on the target system.
SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS 
    "CreateShortCut \"$SMPROGRAMS\\$STARTMENU_FOLDER\\$PROJECT_NAME.lnk\" \"$INSTDIR\\.\\bin\\$PROJECT_EXE \" -previousworkingdir \"$INSTDIR\\.\\bin\\app_icon.ico\"  
     StrCmp \"$INSTALL_DESKTOP\" \"1\" 0 +2
     CreateShortCut \"$DESKTOP\\$PROJECT_NAME.lnk\" \"$INSTDIR\\.\\bin\\$PROJECT_EXE \" -previousworkingdir \"$INSTDIR\\.\\bin\\app_icon.ico\" 
     ")

# Extra commands to fix permissions of bin/licenses folder
SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS 
   "$CPACK_NSIS_EXTRA_INSTALL_COMMANDS
    ExecWait 'icacls \\\"$INSTDIR\\\\bin\\\\licenses\\\" /grant:r Users:\\\(OI\\\)\\\(CI\\\)\\\(F\\\)'
    ")

# A path to the executable that contains the installer icon.
SET(CPACK_NSIS_INSTALLED_ICON_NAME "$PROJECT__DIR\\bin\\$PROJECT_EXE")

# The default installation directory presented to the end user by the NSIS installer
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")

# Title displayed at the top of the installer
SET(CPACK_NSIS_PACKAGE_NAME "$PROJECT_NAME $PROJECT_VER_MAJOR.$PROJECT_VER_MINOR")

SET(CPACK_NSIS_PAGE_COMPONENTS " ")

SET(CPACK_NSIS_MUI_FINISHPAGE_RUN $PROJECT_EXE)
endif(CPACK_GENERATOR MATCHES NSIS)
##------------------------------------------------------------------------
## End NSIS Specific options
##########################################################################

我尝试使用下面的代码来执行此操作,但这会构建包但不会 在任何地方复制myProject.ini

SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS 
  "CreateDirectory \"$ENVAPPDATA\\myProject\",
   SetOutPath \"$ENVAPPDATA\\myProject\",
   File \"myProject.ini\" 
   ")

任何帮助或建议将不胜感激。

【问题讨论】:

我也有类似的问题。当你解决了这个问题后,你能发布解决方案吗? 【参考方案1】:

据我所知,您使用的“\”符号不足。

澄清一下:该字符串被评估两次,一次由 CMake 评估,一次由 CPack 评估,并且每次发生诸如 \->\ 和 \" -> " 之类的替换时。请检查生成的 nsis 项目,了解实际生成的命令是什么,是否所有的 '"' 设置正确。

总结一下:试试这个:

SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS 
  "CreateDirectory \\\"$ENVAPPDATA\\\\myProject\\\",
   SetOutPath \\\"$ENVAPPDATA\\\\myProject\\\",
   File \\\"myProject.ini\\\" 
   ")

【讨论】:

以上是关于向 cpack 添加额外的命令 - NSIS 打包程序/安装程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CPACK 和 NSIS 中为文本文件添加开始菜单条目

在 CMake 中包含 NSIS 脚本

InstallDirRegKey 的 CMake/CPack 命令

CPack:如何执行多个 CPACK_NSIS_EXTRA_INSTALL_COMMANDS?

如何通过 CMake/CPack 在 NSIS 中设置向导图像?

使用 CPACK 自定义 NSIS 安装程序