2 つのadd_custom_command節があり、一方が他方に依存しています。
最初のコマンドは、コンパイラを使用して
.oslソース ファイルを.osoオブジェクト ファイルにコンパイルします。oslcset (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 で入手できます。