向 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 中为文本文件添加开始菜单条目
InstallDirRegKey 的 CMake/CPack 命令
CPack:如何执行多个 CPACK_NSIS_EXTRA_INSTALL_COMMANDS?