在CMake + CPack + NSIS中创建Windows桌面图标

时间:2010-04-14 20:24:17

标签: windows-installer cmake nsis

我在CMake 2.8.1中使用NSIS包生成器来分发Qt应用程序。一切都运行正常......除了使用CPACK_CREATE_DESKTOP_LINKS创建到应用程序的桌面链接。

我查看了CMake source(包括它自己的“bootstrap”安装定义的windows),据我所知,我做的是同样的事情。

以下是我的CMakeLists.txt文件的相关部分。


set(CPACK_GENERATOR NSIS)
set(CPACK_NSIS_PACKAGE_NAME "${EWS_APP_NAME}")
set(CPACK_NSIS_DISPLAY_NAME "${EWS_APP_NAME}")
set(CPACK_NSIS_CONTACT "${EWS_EMAIL}")
set(CPACK_PACKAGE_EXECUTABLES "${EXE_TARGET_NAME}" "${EWS_APP_NAME}")
set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CMAKE_PROJECT_NAME}-${EWS_VERSION}")

# this works
set(CPACK_NSIS_MENU_LINKS "${EWS_WEBSITE}" "Homepage for ${EWS_APP_NAME}")

# this doesn't
set(CPACK_CREATE_DESKTOP_LINKS "${EXE_TARGET_NAME}")

# Icon in the add/remove control panel. Must be an .exe file 
set(CPACK_NSIS_INSTALLED_ICON_NAME bin\\\\${EXE_TARGET_NAME}.exe)

set(CPACK_NSIS_URL_INFO_ABOUT "${EWS_WEBSITE}")
set(CPACK_NSIS_HELP_LINK "${EWS_WEBSITE}")

任何想法或调试技巧都表示赞赏!

5 个答案:

答案 0 :(得分:9)

尝试将此添加到您的CMakeLists.txt

set (CPACK_NSIS_MODIFY_PATH "ON")

我认为应该在许可证之后添加一个页面,该页面提供了将安装目录添加到路径的选项,并添加了创建桌面链接的选项。

答案 1 :(得分:3)

我想通过一种解决方法是使用CPACK_NSIS_EXTRA_INSTALL_COMMANDSCPACK_NSIS_EXTRA_UNINSTALL_COMMANDS直接插入链接创建/删除命令。

set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "
    CreateShortCut \\\"$DESKTOP\\\\${EWS_APP_NAME}.lnk\\\" \\\"$INSTDIR\\\\bin\\\\${EXE_TARGET_NAME}.exe\\\"
")

set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "
    Delete \\\"$DESKTOP\\\\${EWS_APP_NAME}.lnk\\\"
")

我更倾向于使用更一般的(和跨平台?)CPACK_CREATE_DESKTOP_LINKS设置,因此任何后续想法都会受到赞赏。但这很有效。

答案 2 :(得分:1)

对于遇到此主题的其他人,可以使用 CPACK_NSIS_CREATE_ICONS_EXTRA CPACK_NSIS_DELETE_ICONS_EXTRA CMake变量来创建任意快捷方式(开始菜单,桌面,等等。)。事物的删除方面可能有一个小问题,但它仍然是一种相对容易和灵活的方式来获得你想要的捷径。额外的好处是,如果需要,您还可以添加命令行参数。 This short article解释了如何使用这些变量来创建和删除“开始”菜单项,并包含指向其他有用NSIS变量的文档的链接。使用桌面快捷方式的方法与其中提供的信息一起应该很容易。

答案 3 :(得分:1)

我正在使用以下宏将程序文件菜单中的链接添加到桌面

macro(prepareNSIS_Link linkName appName params)
 #prepare start menu links
 LIST(APPEND CPACK_NSIS_CREATE_ICONS_EXTRA "  CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\${linkName}.lnk' '$INSTDIR\\\\bin\\\\${appName}.exe' '${params}'")
 LIST(APPEND CPACK_NSIS_DELETE_ICONS_EXTRA "  Delete '$SMPROGRAMS\\\\$START_MENU\\\\${linkName}.lnk'")

 #prepare desktop links
 LIST(APPEND CPACK_NSIS_CREATE_ICONS_EXTRA  "  CreateShortCut '$DESKTOP\\\\${linkName}.lnk' '$INSTDIR\\\\bin\\\\${appName}.exe' '${params}'")
 LIST(APPEND CPACK_NSIS_DELETE_ICONS_EXTRA  "  Delete '$DESKTOP\\\\${linkName}.lnk'")
endmacro()

要创建指向[installFolder]/bin/app.exe -some -parameters的链接,请将其命名为:

prepareNSIS_Link("My application" "app" "-some -parameters")

设置完所有链接后,请用新行替换分号:

  string (REPLACE ";" "\n" CPACK_NSIS_CREATE_ICONS_EXTRA "${CPACK_NSIS_CREATE_ICONS_EXTRA}")
  string (REPLACE ";" "\n" CPACK_NSIS_DELETE_ICONS_EXTRA "${CPACK_NSIS_DELETE_ICONS_EXTRA}")

答案 4 :(得分:0)

您很可能不需要引用$ {EXE_TARGET_NAME},因为它是一个字符串。