我想使用已经存在的 CPack 和 NSIS 来打包我的 Windows 项目
GeneratorConfig.cmake
文件,我想在其中添加一个额外的命令,将名为 .ini
的 myProject.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 \"$ENV{APPDATA}\\myProject\",
SetOutPath \"$ENV{APPDATA}\\myProject\",
File \"myProject.ini\"
")
任何帮助或建议将不胜感激。
据我所知,您使用的“\”符号不足。
澄清一下:该字符串被评估两次,一次由 CMake 评估,一次由 CPack 评估,并且每次都会发生诸如 \->\ 和 \" -> " 之类的替换。请检查生成的 nsis 项目,了解实际生成的命令是什么以及所有 '"' 是否设置正确。
总结:尝试使用这个:
SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS
"CreateDirectory \\\"$ENV{APPDATA}\\\\myProject\\\",
SetOutPath \\\"$ENV{APPDATA}\\\\myProject\\\",
File \\\"myProject.ini\\\"
")
我想将源目录中
share/
文件夹中的示例配置文件复制到 %AppData%/MyCompany
。
在 Srv19 的帖子的基础上,我最终得到了以下结果,但有一些细微的差别:
set(CPACK_PACKAGE_VENDOR "MyCompany")
# Create the directory :
list(APPEND CPACK_NSIS_EXTRA_INSTALL_COMMANDS "CreateDirectory '$%AppData%\\\\${CPACK_PACKAGE_VENDOR}'")
# Set the NSIS variable OUTDIR :
list(APPEND CPACK_NSIS_EXTRA_INSTALL_COMMANDS "SetOutPath '$%AppData%\\\\${CPACK_PACKAGE_VENDOR}'")
# Add file to be extracted to $OUTDIR :
list(APPEND CPACK_NSIS_EXTRA_INSTALL_COMMANDS "File '${CMAKE_SOURCE_DIR}\\\\share\\\\MyProject.ini'")
# Replace ';' by '\n' in CPACK_NSIS_EXTRA_INSTALL_COMMANDS :
string (REPLACE ";" "\n" CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}")