2012-10-16 11 views
5

私は多くのサブプロジェクトを持つCMakeプロジェクトを持っています。 それぞれは、(add_custom_commandを呼び出すことによって)いくつかの特定の情報を持つ小さなテキストファイルを生成するために私が提供する関数を使用することができます。 最後のステップでは、これらのファイルを1つの大きなテキストファイルにまとめたいと思います。CMake:add_custom_commandへの依存性を動的に追加

私は作成したファイルを(一箇所に)検索してマージするカスタムコマンドを作成しました。

問題は、最終的なステップをサブプロジェクトで行われるすべての小さなステップに依存させたいのですが、実際にいくつのファイルが提供されるのかは分かりません。

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

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

と私の作成 - 小さなテキスト・ファイルのfor-each-サブコマンドは次のようになります。

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) 

ただし、これはターゲットでのみ有効です。

私が見る私も(多分そのadd_targetのCPPファイルで使用するつもり?)OBJECT_DEPENDSでset_source_files_propertiesを使用しようとしましたが、動作しないように思わまし

それは仕事を取得する最後の方法です

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

が、これは私がやりたい最後のものである:すべてのそれらの小さなファイルのパスを蓄積し、このようにそれを使用するキャッシュ変数を使用します。

答えて

4

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) 

再び:あなたは、プロジェクトの目標ので、統合対象は、日付の抜けるように、実際の依存関係のチェーンを作成するためにadd_custom_targetDEPENDS引数を使用していることを確認してください。

更新日:私は時期尚早でした。実際、cmake(少なくとも2.8.9まで)は、依存関係に関して以下のように動作します。add_dependenciesを呼び出すと、IOWの(生成された)カスタムコマンドのOUTPUTである依存関係を追加できません。 add_dependenciesではadd_custom_targetで作成されたtargetのみ追加できます。ただし、add_custom_targetの場合は、DEPENDSディレクティブを使用して、出力がadd_custom_commandに依存することができます。それは、これはそれを動作させ、言った:

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の使用が許可されるようになります。

+0

期待通りに動作しません。 makeを呼び出すたびに、すべてのターゲット(組み合わせ、プロジェクト、プロジェクト2)が再構築されるため、ファイルが再生成されます。 これはできるだけいいとは限りません;) 私の予想される動作は、必要でない限りファイルを再生成しないことです。 CMakeのdocsによると、add_custom_targetは毎回構築されています。 私は、add_custom_commandとして働いていたソリューションを望みました。依存関係が変更された場合にのみビルドされます。 –

+0

project.txtを生成するために依存関係として何を使用しますか?私はcmake-docが何を言いたいのかというと、custom_targetは再構築する必要があるかどうか常にチェックされています。少なくとも、私のように動作するようです。 –

+0

さて、私たちはそれをどうやって正しく読んだら、時期尚早であることを認めなければなりません。答えの私の更新を見てください。 –

関連する問題