1

我们有两个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/
    )
    

虽然此设置有效,但它的副作用是始终执行两个命令(第二个命令后跟第一个命令),即使.osl输入文件没有被修改。

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

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

这个设置有什么问题吗?如果不是,那么结合这两个功能的正确方法是什么:在文件自上次构建以来发生更改时编译.osl文件,并在编译器尚不存在时“构建”编译器(第一步需要)?oslc

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

4

1 回答 1

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}并从第一个命令中删除显式依赖。

于 2016-12-02T15:41:47.270 回答