add_custom_command取决于另一个add_custom_command

时间:2016-12-02 10:39:23

标签: cmake

我们有两个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. 第二个命令“构建”(实际上,部署oslc编译器通过从其他地方复制它:

    add_custom_command (
        OUTPUT "${PROJECT_SOURCE_DIR}/sandbox/bin/oslc"
        COMMAND ${CMAKE_COMMAND} -E copy ${OSL_COMPILER} ${PROJECT_SOURCE_DIR}/sandbox/bin/
    )
    
  3. 虽然这个设置有效,但是它的副作用是两个命令始终执行(第二个命令后跟第一个命令),即使{{1}输入文件尚未修改。

    似乎此行为特定于Windows。它似乎在Linux上运行良好。

    如果从第一个命令中删除了对.osl的依赖关系,则根本不再执行第二个命令,即使缺少${oslc}编译器也是如此;但另一方面,oslc文件现在只在根据需要自上次构建后发生变化时才重新编译(只要.osl存在)。

    此设置有什么问题吗?如果没有,将两种功能组合在一起的正确方法是:仅在更改oslc个文件 时进行更改自上次构建以来,并且“构建”.osl编译器(第一步所需),当它还不存在时?

    GitHub上提供了实际的CMake脚本:

1 个答案:

答案 0 :(得分: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}的显式依赖项。