このadd_custom_target(run ALL ...
ソリューションは、構築しているターゲットが1つしかない単純なケースでは機能しますが、アプリやテストなど、複数のトップレベルのターゲットがある場合は機能しません。
単体テストが外部のものに依存しないように、いくつかのテストデータファイルをオブジェクトファイルにパッケージ化しようとしたときに、これと同じ問題が発生しました。add_custom_command
を使用して、いくつかの追加の依存関係の魔法を使用して解決しましset_property
た。
add_custom_command(
OUTPUT testData.cpp
COMMAND reswrap
ARGS testData.src > testData.cpp
DEPENDS testData.src
)
set_property(SOURCE unit-tests.cpp APPEND PROPERTY OBJECT_DEPENDS testData.cpp)
add_executable(app main.cpp)
add_executable(tests unit-tests.cpp)
そのため、unit-tests.cppがコンパイルされる前、およびtestData.srcが変更されるたびに、testData.cppが生成されます。呼び出しているコマンドが本当に遅い場合は、アプリターゲットだけをビルドするときに、そのコマンド(テスト実行可能ファイルのみが必要)が終了するのを待つ必要がないという追加のボーナスが得られます。
上には示されていませんが、を注意深く適用する${PROJECT_BINARY_DIR}, ${PROJECT_SOURCE_DIR} and include_directories()
と、ソースツリーから生成されたファイルをクリーンに保つことができます。