背景
CMake でターゲット(e.g. .exe, .so)がビルドできたらカスタムコマンドを実行したい.
実行できるかの確認, 簡単なテスト, .so の依存関係チェックなど
(add_test として実行するには適さないような処理)
方法
add_custom_command
+ POST_BUILD
でいけました.
(add_custom_target
ではないので注意)
注意点
add_custom_command
の TARGET はカレントの CMake で定義したものでないとダメとあります.
関数でターゲットを処理するようなもの, たとえば pybind11 でモジュール定義(pybind11_add_module
) とは組み合わせることができました.
pybind11_add_module(mytarget sources.cc)
# OK
add_custom_command(TARGET mytarget POST_BUILD COMMAND mycmd VERBATIM)
また, 一旦ターゲットがビルドできた場合(e.g. ソースコードに変更なくて .exe, .so にも変更無い場合)にはポストビルドは実行されません.
したがって .exe に変更は無いが設定ファイルを変えて make
しなおしてポストビルドをトリガーするというのはできないです.
毎回トリガーしたい場合は, ALL
ターゲットに追加するか, もしくは add_custom_target(mytest ...)
で make mytest
などとして明示的にコマンド呼び出しするしかなさそうです.
おまけ
.so に依存したファイルを, dest 先のファイルが変更しているときだけコピーするみたいなのは -E copy_if_different
と組み合わせて実現できます.
# Copy libc++.dll
add_custom_command(TARGET mymod POST_BUILD # Adds a post-build event to MyTest
COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake - E copy_if_different..."
"${LLVM_MINGW_ROOT_ABSPATH}/x86_64-w64-mingw32/bin/libc++.dll" # src
$<TARGET_FILE_DIR:mymod>) # dest