我们有两个add_custom_command
子句,其中一个依赖于另一个:
第一个命令使用.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}
,因为我们需要确保它存在才能执行此命令。
第二个命令“构建”(实际上,部署)oslc
编译器通过从其他地方复制它:
add_custom_command (
OUTPUT "${PROJECT_SOURCE_DIR}/sandbox/bin/oslc"
COMMAND ${CMAKE_COMMAND} -E copy ${OSL_COMPILER} ${PROJECT_SOURCE_DIR}/sandbox/bin/
)
虽然这个设置有效,但是它的副作用是两个命令始终执行(第二个命令后跟第一个命令),即使{{1}输入文件尚未修改。
似乎此行为特定于Windows。它似乎在Linux上运行良好。
如果从第一个命令中删除了对.osl
的依赖关系,则根本不再执行第二个命令,即使缺少${oslc}
编译器也是如此;但另一方面,oslc
文件现在只在根据需要自上次构建后发生变化时才重新编译(只要.osl
存在)。
此设置有什么问题吗?如果没有,将两种功能组合在一起的正确方法是:仅在更改oslc
个文件 时进行更改自上次构建以来,并且“构建”.osl
编译器(第一步所需),当它还不存在时?
GitHub上提供了实际的CMake脚本:
答案 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}
的显式依赖项。