2013-04-02 16 views
5

CMake(バージョン> = 2.8.7)で何らかの方法でマクロまたはコマンドを最後のステップとして実行して設定フェーズを完了できますか?'設定'ステップが完了する前に最後のステップとしてCMakeでコマンドまたはマクロを実行

次の行が画面に印刷され得る前に、機能を実行する必要があります。

-- Configuring done 
-- Generating done 

今まで私がadd_custom_commandでこれを達成するために、依存関係として使用することができCMakeのターゲットを見つけることができませんでしたadd_custom_targetまたはadd_dependencies

EDIT: 他のすべてのCMakeコマンドを実行した後、いくつかのCMakeマクロをエクスポートするライブラリがあり、これらのマクロのいくつかは各CMakeLists.txtファイルの最後に実行する必要があります。 CMakeLists.txtファイルの最後に追加コマンドを追加することなく、ファイルmacros.cmakeCMakeLists.txtファイルに含めることで、理想的な動作を実現できます。

CMakeLists.txtの最後に明示的に呼び出す必要がある1つのマクロ内のすべての機能を収集することによってもこれを達成できます。 しかし、すでにいくつかの従属ライブラリが適応される必要があり、この問題の解決策はこの追加の作業を省略します。 また、マクロを追加することを忘れたり、最後のステートメントであるという要件を簡単に破ることができます。

macros.cmake

macro(FINAL_MACRO) 
    message(STATUS "Last step before finishing Configure phase") 
endmacro() 

# HERE: something like add_custom_target(final_steps) 
# followed by something like add_dependencies(final_steps cmake_configure_finished) 

例トップレベルCMakeLists.txt

cmake_minimum_required(VERSION 2.8.7) 
include(macros.cmake) 

add_subdirectory(source) 
add_subdirectory(interfaces) 

# here FINAL_MACRO should get executed without explicitely writing it down 

我々は彼らのCMakeLists.txtファイルの末尾に特別なマクロを呼び出すために、すべてのユーザーに要求する必要があります他の選択肢がない場合。

答えて

2

OK - この回答は、文書化されていないCMakeの動作を利用しているため、少し壊れやすいと感じています。しかし、それはうまくいくようです。

構成プロセスの最後に、CMakeLists.txtファイルのすべてのコマンドが処理された後、CMakeはCMAKE_BACKWARDS_COMPATIBILITYの値をチェックします。この変数がvariable_watchコマンドで監視されている場合は、ここでトリガーされます。

だから、機能のカップルにこの機能をラップすることができます:単にファイル内の任意の場所にSetupEOFHook()を呼び出し、任意のCMakeListsファイルでこれを使用するには

function(EOFHook Variable Access) 
    if(${Variable} STREQUAL CMAKE_BACKWARDS_COMPATIBILITY AND 
    (${Access} STREQUAL UNKNOWN_READ_ACCESS OR ${Access} STREQUAL READ_ACCESS)) 
    execute_process(COMMAND ${CMAKE_COMMAND} -E echo "In EOF hook command") 
    ... do whatever else is required ... 
    endif() 
endfunction() 

function(SetupEOFHook) 
    variable_watch(CMAKE_BACKWARDS_COMPATIBILITY EOFHook) 
endfunction() 

これは少し危険です。変数がCMakeLists.txt内の他の場所でも読み取られている場合などです。

message(${CMAKE_BACKWARDS_COMPATIBILITY}) 

を経由して、それがここに終わりEOFHook機能をトリガします。あなたは、カウンタを追加し、それが一度だけ呼び出されているかどうかチェックすることで、関数に複雑さを加えることができます。message(FATAL_ERROR ...)

+0

この興味深い発見をありがとうございました。これは、望ましい動作を実現します。しかし、私はそれが確かに少し壊れやすいと感じることに同意します。だから、CMakeがこのようなことをする正式な方法を提供するまで、最終的な関数/マクロの明示的な実行を要求するのが最良の解決策です。 – MKroehnert

+0

@MKroehnert - はい、もし私だったら、すべてのCMakeLists.txtの最後に単一の関数/マクロ呼び出しを追加することになります。あなたはまだそれを試して、それを実施することができます。クローズ機能を持つとプリプロセッサの定義が解除され、ビルドが動作しなくなります。ビットは "ハッキー"でも、隠されたCMakeの内部プロセスに応じて悪くはありませんか? – Fraser

+0

あなたの提案に感謝します。 – MKroehnert

1

CMakeコマンドexecute_processは、ビルドフェーズではなくconfigureフェーズで実行されるため、これをCMakeLists.txtファイルの最後に置くと、最後に実行されます。

+0

ありがとうございました。しかし、私は少し違うものを探しています。残念ながら、これは最初の質問では述べられていませんでした(編集を参照)。 – MKroehnert

+0

申し訳ありません - 私はまだそれを取得しません。メインのCMakeListsファイルの途中で 'include(macros.cmake) 'を途中で実行し、CMakeListsファイルの最後に' macro'や 'function'を実行するように聞こえるようですが、明示的に' macro'ファイルの最後に '/' function'を付けますか?少し試してみてください、あるいはあなたのユースケースを説明できますか? – Fraser

+0

私は詳細と例を用いて質問を更新しました。 – MKroehnert

0

私が知っていることはありません(私は徹底的に調査しました)。しかし、私は間違っていることが証明されたい。

関連する問題