2016-12-02 151 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}