7

多くのサブプロジェクトを含む CMake プロジェクトがあります。それらはそれぞれ、私が提供する関数を使用して、(add_custom_command を呼び出して) 特定の情報を含む小さなテキスト ファイルを生成できます。最後のステップで、これらすべてのファイルを 1 つの大きなテキスト ファイルに結合したいと思います。

作成されたファイルを (すべて 1 か所で) 検索してマージするカスタム コマンドを作成しました。

問題は、提供されるファイルの数が実際にはわからないのに、この最終ステップをサブプロジェクトで行われるすべての小さなステップに依存させたいということです。

私の最終的なコマンドは次のようになります。

add_custom_command(OUTPUT combination.txt
                   COMMAND create combination.txt from all files from /path/)

私の create-small-text-file-for-each-subproject コマンドは次のようになります。

add_custom_command(OUTPUT /path/${sub_project_name}.txt
                   COMMAND create /path/${sub_project_name}.txt)

そして、これらの小さなファイルを作成するときに、「combination.txt」を /path/${sub_project_name}.txt に依存させるようなことをしたいと思います

だから私はできればいいのに:

add_dependency(combination.txt /path/${sub_project_name}.txt)

ただし、これはターゲットに対してのみ機能します。

また、OBJECT_DEPENDS で set_source_files_properties を使用しようとしましたが、動作しないようです (おそらく、add_target の cpp ファイルで使用するつもりですか?)

私が見る最後の方法は、キャッシュ変数を使用して、これらの小さなファイルパスをすべて蓄積し、次のように使用することです。

add_custom_command(OUTPUT combination.txt
                   COMMAND create combination.txt from all files from /path/
                   DEPENDS ${all_small_files_list})

しかし、これは私がやりたい最後のことです。

4

1 に答える 1

5

を使用する代わりに、正しい依存関係定義add_custom_commandを使用できますadd_custom_target(そのため、毎回ビルドされるわけではありません)。

add_custom_target(project
                   COMMAND touch project.txt)

add_custom_target(project2
                   COMMAND touch project2.txt)

add_custom_target(combination
                   COMMAND cat project.txt project2.txt > combination.txt)

add_dependencies(combination project2)
add_dependencies(combination project)

add_executable(t t.c)
add_dependencies(t combination.txt)

繰り返しますが、実際の依存関係チェーンを作成するためにDEPENDS引数を使用していることを確認してください。add_custom_targetこれにより、プロジェクト ターゲット、つまり組み合わせターゲットが古くなります。

更新:私は時期尚早でした。実際、cmake (少なくとも 2.8.9 まで) は、依存関係に対して次のように機能します。カスタム コマンド IOW (生成された) ファイルadd_dependenciesの依存関係を追加することはできません。OUTPUTでは、 によって作成されたadd_dependenciesとおりにのみ追加できます。ただし、-ディレクティブを使用しての出力に依存することができます。つまり、これは機能します:targetadd_custom_targetadd_custom_targetadd_custom_commandDEPENDS

add_custom_command(OUTPUT project.txt
                   COMMAND uptime >> project.txt MAIN_DEPENDENCY t2.c)
add_custom_target(project DEPENDS project.txt)

add_custom_target(combination
                   COMMAND cat project.txt project2.txt > combination.txt)
add_dependencies(combination project)

MAIN_DEPENDENCYこれにより、コンビネーション ターゲットにはまたはがないため、常に再生成されますDEPENDSが、 の使用add_dependenciesは許可されます。

于 2012-10-16T12:29:08.013 に答える