ソース ツリー全体を解析する cmake コマンドを実行したいので、cmake の add_custom_command/add_custom_target コマンドで考えられるすべての依存関係を一覧表示することはできません。
条件なしでコマンドを実行するようにcmakeに指示することは可能ですか? ネットで見つかったすべてのソリューション(SOを含む)を試しましたが、それらはすべて、コマンドが最新のいくつかの既知のファイルに依存していると想定しています。
解決策を見つけましたが、確実に機能しません:
cmake_minimum_required(VERSION 2.6)
project(main)
add_custom_command(
OUTPUT file1
COMMAND echo touching file1
COMMAND touch file1
DEPENDS file2)
add_custom_target(dep ALL DEPENDS file1 file2)
# this command re-touches file2 after dep target is "built"
# and thus forces its rebuild
ADD_CUSTOM_COMMAND(TARGET dep
POST_BUILD
COMMAND echo touching file2
COMMAND touch file2
)
これが出力されます:
queen3@queen3-home:~/testlib$ make
[100%] Generating file1
touching file1
touching file2
[100%] Built target dep
queen3@queen3-home:~/testlib$ make
[100%] Generating file1
touching file1
touching file2
[100%] Built target dep
queen3@queen3-home:~/testlib$ make
touching file2
[100%] Built target dep
queen3@queen3-home:~/testlib$
ご覧のとおり、3 回目の実行では、file2 が以前に変更されていたにもかかわらず、file1 を生成しませんでした。2回ごとに発生することもあれば、3回ごとに発生することもあれば、4回ごとに発生することもあります。バグですか?cmake に依存せずにコマンドを実行する別の方法はありますか?
奇妙ですが、file2 をリタッチするために 2 つのコマンドを追加すると、つまり、ビルド後のコマンドをコピーして貼り付けるだけで、確実に機能します。または、1000回実行するたびに失敗するかもしれませんが、まだわかりません;-)