如何让cpack生成正确的开始菜单快捷方式

lgw*_*est 7 c++ nsis cmake cpack

我想用cmake和cpack为windows上的一些程序创建一个安装程序.我希望能够选择要安装的程序,所选程序将作为快捷方式显示在开始菜单中.这是一个简单的尝试.为每个程序完成了一个组件,但无法弄清楚如何生成开始菜单变量.现在,即使未选择安装它们,所有程序也始终在菜单中.首先是一个简单的程序安装.

#include <iostream>
#include <conio.h>

int main()
{
  std::cout << "prog1" << std::endl;
  _getch();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是CMakeLists.txt文件

cmake_minimum_required( VERSION 2.8 )
project ( CompoTest )

add_executable(prog1 prog1.cpp)
add_executable(prog2 prog2.cpp)
add_executable(prog3 prog3.cpp)

install(TARGETS prog1
        RUNTIME DESTINATION bin
        COMPONENT compo1)
install(TARGETS prog2
        RUNTIME DESTINATION bin
        COMPONENT compo2)
install(TARGETS prog3
        RUNTIME DESTINATION bin
        COMPONENT compo3)

set ( CPACK_PACKAGE_VERSION "1.0.0" )

set(CPACK_PACKAGE_EXECUTABLES 
    prog1 "prog 1"
    prog2 "prog 2"
    prog3 "prog 3"
)

set ( CPACK_COMPONENTS_ALL compo1 compo2 compo3 )
include (CPack)
Run Code Online (Sandbox Code Playgroud)

问题是生成开始菜单快捷方式取决于在安装中选择哪个程序我认为它应该很容易,但似乎不是.是否有可能做到这一点.

更新:我发现http://www.cmake.org/Wiki/CMake:Component_Install_With_CPack中的任何示例都没有生成开始菜单快捷方式,或者我做错了什么?

小智 12

这是cpack的一个已知问题.请参阅http://public.kitware.com/Bug/print_bug_page.php?bug_id=9846

您需要使用NSIS模板来创建自定义的开始菜单快捷方式.

脚步 :

  • 从已安装的cmake目录复制NSIS.template.in.(例如C:\ Program Files\CMake 2.8\share\cmake-2.8\Modules\NSIS.template.in)到项目的Cmake Source Dir.

  • 更新复制的NSIS.template.in类似于下面的代码片段(取自http://public.kitware.com/Bug/print_bug_page.php?bug_id=9846):

    if (executable file is in component 'x')  
      if (installing component 'x')  
        CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\x.lnk" "$INSTDIR\x.exe"
    
    if (uninstalling executable x)  
      Delete "$SMPROGRAMS\$MUI_TEMP\x.lnk"
    
    Run Code Online (Sandbox Code Playgroud)
  • 在include(cpack)之前将以下行添加到CMakeLists.txt:

    set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" ${CMAKE_MODULE_PATH})
    
    Run Code Online (Sandbox Code Playgroud)