1

2 つのadd_custom_command節があり、一方が他方に依存しています。

  1. 最初のコマンドは、コンパイラを使用して.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. 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 で入手できます。

4

1 に答える 1

0

少なくとも Windows の場合の簡単な解決策は、2 番目のコマンドを次のように変更することです。

add_custom_command (
    TARGET appleseed.shaders
    PRE_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy ${OSL_COMPILER} ${PROJECT_SOURCE_DIR}/sandbox/bin/
)

PRE_BUILD(キーワードに注意してください)

${oslc}最初のコマンドから明示的な依存関係を削除します。

于 2016-12-02T15:41:47.270 に答える