2013-09-23 12 views
6

cmakeとcpackのあるウィンドウでいくつかのプログラムのインストーラを作成したいと思います。 インストールするプログラムを選択できるようにしたいのですが、選択したプログラムはショートカットとしてスタートメニューに表示されます。 ここでは簡単な試みです。各プログラムに対して1つのコンポーネントを実行しましたが、開始メニュー変数の生成方法を理解することはできません。これで、すべてのプログラムは、インストールするように選択されていなくても常にメニューに表示されます。まず、インストールする簡単なプログラムです。正しいスタートメニューのショートカットを生成するcpackの入手方法

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

int main() 
{ 
    std::cout << "prog1" << std::endl; 
    _getch(); 
    return 0; 
} 

、ここでは

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) 

問題は、プログラムが、私はそれが簡単なはずと思っ インストールで選択されているかに応じて、スタートメニューのショートカットを生成することであるCMakeLists.txtファイルですが、それはないようですすることが。これは可能ですか?

アップデート:どのスタートメニューショートカットもhttp://www.cmake.org/Wiki/CMake:Component_Install_With_CPackに生成されていないか、何か間違っていますか?

答えて

11

これは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にコピーします。

  • 更新(http://public.kitware.com/Bug/print_bug_page.php?bug_id=9846から取られた)スニペット以下に類似NSIS.template.inをコピー:

    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" 
    
  • CMakeLists.txtに線の下に追加直前(cpack)が含まれます:

    set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" ${CMAKE_MODULE_PATH})