2012-04-03 21 views
11

cmakeのは、インストールのルールについては、以下のようなものを生成します。cmakeが生成したトップレベルのMakefileにインストール後のコマンドを追加することはできますか?

# Special rule for the target install 
install: preinstall 
     @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." 
     /usr/local/bin/cmake -P cmake_install.cmake 
.PHONY : install 

私がやりたいことは、それはのようになりますのでcmake_install.cmake後に実行されるいくつかのカスタムコマンドが起動されていている。

# Special rule for the target install 
install: preinstall 
     @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." 
     /usr/local/bin/cmake -P cmake_install.cmake 
     post_install_command_1 
     ... 
     post_install_command_n 
.PHONY : install 

私たちが書いたことのために、 "add_custom_command(TARGET ... POST_BUILD ...)"を使って欲しいことをすることができます。しかし、たくさんのサードパーティ製のものがインストールされています。私は本当にそれらのすべてのためのPOST_BUILDカスタムコマンドを追加したくありません(現在19つのプロジェクトがあり、処理が必要なものを特定するのは難しいかもしれませんインストール後ではなくビルド後)。カスタムコマンドが1か所(つまり、インストール処理の最後の部分)でのみ使用され、必要なすべてを行うことがわかっている場所であれば、維持するほうがずっと簡単だと思います。

トップレベルのMakefileのインストールルールにコマンドを追加することはできますか?

答えて

8

installコマンドのSCRIPTまたはCODEの亜種を使用できます。あなたは、プロジェクトのルートディレクトリにスクリプトPostInstall.cmakeに必要なコマンドを入れた場合は、あなたの最も外側のCMakeLists.txtに次の呼び出しを追加します。

install (SCRIPT "${CMAKE_SOURCE_DIR}/PostInstall.cmake") 

installコマンドの順序でcmake_install.cmakeスクリプトに追加され、これコールが追加されなければなりませんCMakeLists.txtの終わりには、他のすべてのインストールが完了した後で実行されます。

+0

ありがとうございました!私はこのようなことを試したことを誓うとうまくいきませんでした。もう一度試してみるとうまくいくようです。私はそれが動作しないように、タイプミス(または何か)があったに違いないと思う。 – joast

+4

これは私のサブディレクトリでのビルドでは機能しません。一番外側のCMakeLists.txtの終わりは、すべてのcmake_install.cmakeがサブディレクトリからインクルードされる前に実行されます。 – rickfoosusa

+0

特に、ルートからサブディレクトリのインストールパスとターゲットを指定するのは難しいですが、最終的には動作します。 – taranaki

3

インストール後の手順を追加するには、トップレベルのCMakeLists.txtにディレクトリを追加する必要があります。インストールの最後に実行されるインストール後の手順を設定するには、その中にCMakeLists.txtというディレクトリが必要です。

最初の手順は、インストール後スクリプトで使用する変数と値を追加することです。ビルド中に使用可能な変数はインストール後に利用できないため、必要なものはすべてここで設定する必要があります。

トップレベルのCMakeLists.txtでは、以前のすべてのadd_subdirectoryコマンドが実行された後、このようなものを追加します。

# Workaround for the lack of post_install steps. 
# add_subdirectory is executed in order, this one must be last. 
if(CMAKE_PROGRAM_PREFIX) 
    # Make sure this is the LAST directory added. 
    add_subdirectory(${CMAKE_SOURCE_DIR}/cmake/postinstall) 
    # Add any variables you need during post install. 
    install(CODE "set(CMAKE_PROGRAM_PREFIX \"${CMAKE_PROGRAM_PREFIX}\")") 
    # Add any properties to your post install. 
    get_property(PROGRAM_PREFIX_FILES GLOBAL PROPERTY PROGRAM_PREFIX_FILES) 
    install(CODE "set(PROGRAM_PREFIX_FILES \"${PROGRAM_PREFIX_FILES}\")") 
endif() 

ここで変数とプロパティを変数に変換し、インストール後に使用できるようにしました。

次に、postinstallディレクトリにCMakeLists.txtファイルが必要です。 Cmakeはビルドの最後にこのファイルを実行します。その時点で、インストール後に作業を行うSCRIPTをインストールします。

# CMake will execute this last in the build. 
# Install the script that does the post install work. 
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/postinstall/ProgramPrefix.cmake") 

ここで、ProgramPrefix.cmakeでインストール後の管理を行います。 CMakeは以前に設定した変数を追加します。

# Make sure this was requested. 
if(CMAKE_PROGRAM_PREFIX) 
    # CMake builds a manifest of all files it has installed. 
    foreach(file ${CMAKE_INSTALL_MANIFEST_FILES}) 
     # Make a list of installed files to compare. 
     get_filename_component(nm ${file} NAME) 
     list(APPEND fileindex ${nm}) 
    endforeach() 

    # Process program prefix files. 
    foreach(nm ${PROGRAM_PREFIX_FILES}) 
     list(FIND fileindex ${nm} efound) 
     # Did we match a manifest file with our list of files? 
     if(NOT efound LESS 0) 
      # Process the file. 
      program_prefix_file(${efound}) 
     endif() 
    endforeach() 
endif() 

あり、実際のプログラムの接頭辞を行うにはもう少し作業があるが、このフレームワークは、すべてのものがインストールされた後、あなたはcmakeのコマンドを実行できるようになります。

+0

私はプログラムのプレフィックスについては分かりません。それは関係がありますか?または、インストール後にスクリプトを実行する方法のランダムなコード例だけですか? – Joakim

+0

私は、autoconfがautoconfとcmakeの両方のビルドをサポートしているツリーの中にあるような、プログラム接頭辞の機能を追加したかったのです。プログラム接頭辞は単なる例です。 cmakeのインストール後のステップは何でも使用できます。 – rickfoosusa

関連する問題