2016-12-02 136 views
1

我們有兩個add_custom_command子句,其中一個則取決於其它:add_custom_command根據另一個add_custom_command

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}" 
) 

  1. 第一條命令使用oslc編譯器編譯的.osl源文件到一個.oso對象文件

    請注意對${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未被修改,兩個命令都是總是執行執行(第二個命令後跟第一個命令)。

看來,這種行爲是特定於Windows。它似乎在Linux上正常工作。

如果依賴性${oslc}從第一命令移除,所述第二命令不再在所有執行,即使當oslc編譯器是缺失;但另一方面,.osl文件現在僅在根據需要(只要存在oslc)從最後一次構建後更改後才重新編譯。

這個設置有什麼問題嗎?如果沒有,結合這兩個功能的正確方法是什麼:編譯.osl文件時只有,它們在上次編譯後發生了更改,並且在編譯器(第一步所需的)尚未存在時「編譯」oslc

實際CMake的腳本可以在GitHub上:

+0

我希望第二個命令也有'DEPENDS'。它應該取決於第一個命令的一些輸出。你必須弄清楚爲什麼第一個命令總是被構建。你爲什麼使用MAIN_DEPENDENCY?爲什麼有一個DEPENDS quotatiosmarks的論點? – usr1234567

+0

oslc是一個可執行文件,對不對?你不應該依賴它,你應該檢查它(FindOslc或類似的),然後將整個add_custom_command包裝在OSCL_FOUND中。 – usr1234567

+0

@ usr1234567第二個命令沒有'DEPENDS',因爲它不依賴任何東西。只需要在輸出('oslc'編譯器)丟失時運行。它用引號括起來,因爲'oslc'的完整路徑可能在Windows上包含空格。 –

回答

0

一個簡單的解決方案,至少在Windows,是改變第二個命令

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

(注意PRE_BUILD關鍵字)

,並從所述第一命令刪除顯式依賴性${oslc}

相關問題