我们有两个add_custom_command子句,其中一个依赖于另一个:
.osl编译器将.oso源文件编译为.oso对象文件:
set (oslc ${PROJECT_SOURCE_DIR}/sandbox/bin/oslc) add_custom_command (输出"${oso_dir}/${oso_filename}“命令${CMAKE_COMMAND} -E make_directory "${oso_dir}”命令"${oslc}“-I"${osl_include_path}”-o "${oso_dir}/${oso_filename}“"${osl_src_abs}”主_DEPENDENCY ${osl_src_abs}取决于${ ${osl_src_abs} }${osl_src_abs} "${oslc}“)
注意对${oslc}的依赖:我们显式地依赖于${oslc},因为我们需要在执行这个命令之前确保它的存在。oslc编译器复制到其他地方:
add_custom_command (输出" ${PROJECT_SOURCE_DIR}/sandbox/bin/ oslc“命令${CMAKE_COMMAND} -E copy ${OSL_COMPILER} ${PROJECT_SOURCE_DIR}/sandbox/bin/)在此设置工作时,其副作用是两个命令都是are执行(第二个命令后面跟着第一个命令),即使.osl输入文件没有被修改。
这种行为似乎是Windows特有的。它在Linux上似乎运行得很好。
如果从第一个命令中删除了对${oslc}的依赖,那么即使在缺少oslc编译器时,也不再执行第二个命令;但另一方面,.osl文件现在只有在自上次构建后更改时才重新编译(只要存在oslc )。
这个设置有什么问题吗?如果没有,那么结合这两个特性的正确方法是什么:只在上次构建后对.osl文件进行编译,在第一步不存在时“构建”oslc编译器(第一步所要求的)?
实际的CMake脚本可以在GitHub上使用:
发布于 2016-12-02 15:41:47
一个简单的解决方案,至少对于Windows,是将第二个命令更改为
add_custom_command (
TARGET appleseed.shaders
PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${OSL_COMPILER} ${PROJECT_SOURCE_DIR}/sandbox/bin/
)(注意PRE_BUILD关键字)
并从第一个命令中移除对${oslc}的显式依赖。
https://stackoverflow.com/questions/40930224
复制相似问题