2 つのadd_custom_command
節があり、一方が他方に依存しています。
最初のコマンドは、コンパイラを使用して
.osl
ソース ファイルを.oso
オブジェクト ファイルにコンパイルします。oslc
set (oslc ${PROJECT_SOURCE_DIR}/sandbox/bin/oslc) add_custom_command ( OUTPUT "${oso_dir}/${oso_filename}" COMMAND ${CMAKE_COMMAND} -E make_directory "${oso_dir}" COMMAND "${oslc}" -I"${osl_include_path}" -o "${oso_dir}/${oso_filename}" "${osl_src_abs}" MAIN_DEPENDENCY ${osl_src_abs} DEPENDS ${${headers}} ${osl_src_abs} "${oslc}" )
への依存関係に注意してください。このコマンドを実行する前に存在することを確認する必要があるため、
${oslc}
明示的に依存しています。${oslc}
2 番目のコマンドは、別の場所からコンパイラをコピーして、コンパイラを "ビルド" (実際にはデプロイ) し
oslc
ます。add_custom_command ( OUTPUT "${PROJECT_SOURCE_DIR}/sandbox/bin/oslc" COMMAND ${CMAKE_COMMAND} -E copy ${OSL_COMPILER} ${PROJECT_SOURCE_DIR}/sandbox/bin/ )
.osl
このセットアップは機能しますが、入力ファイルが変更されていない場合でも、両方のコマンドが常に実行されるという副作用があります(2 番目のコマンドの後に最初のコマンドが続きます) 。
この動作は Windows に固有のようです。Linux では問題なく動作するようです。
への依存関係が${oslc}
最初のコマンドから削除された場合、2 番目のコマンドは、oslc
コンパイラが見つからない場合でもまったく実行されなくなります。しかし一方で、.osl
ファイルは、最後のビルド以降に変更された場合にのみ、必要に応じて (存在する限りoslc
) 再コンパイルされるようになりました。
この設定に何か問題はありますか?そうでない場合、両方の機能を組み合わせる正しい方法は何ですか:前回のビルド以降にファイルが変更された場合にのみ.osl
ファイルをコンパイルし、コンパイラがまだ存在しない場合はコンパイラ (最初のステップで必要)を「ビルド」しますか?oslc
実際の CMake スクリプトは GitHub で入手できます。