LoginSignup
4
0

More than 3 years have passed since last update.

CMake でビルドしたあとにカスタムコマンドを実行するメモ

Last updated at Posted at 2021-03-24

背景

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
4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0