add_custom_command 取决于另一个 add_custom_command
add_custom_command depending on another add_custom_command
我们有两个 add_custom_command
子句,其中一个依赖于另一个:
第一个命令使用 oslc
编译器将 .osl
源文件编译成 .oso
目标文件:
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}
因为我们需要确保它存在才能执行此命令。
第二个命令"builds"(实际上,部署)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
个文件 当它们自上次构建以来发生变化时,"building" oslc
编译器(第一步需要)当它尚不存在时?
实际的 CMake 脚本可在 GitHub:
一个简单的解决方案,至少对于 Windows,是将第二个命令更改为
add_custom_command (
TARGET appleseed.shaders
PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${OSL_COMPILER} ${PROJECT_SOURCE_DIR}/sandbox/bin/
)
(注意 PRE_BUILD
关键字)
并从第一个命令中删除对 ${oslc}
的显式依赖。
我们有两个 add_custom_command
子句,其中一个依赖于另一个:
第一个命令使用
oslc
编译器将.osl
源文件编译成.oso
目标文件: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}
因为我们需要确保它存在才能执行此命令。第二个命令"builds"(实际上,部署)
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
个文件 当它们自上次构建以来发生变化时,"building" oslc
编译器(第一步需要)当它尚不存在时?
实际的 CMake 脚本可在 GitHub:
一个简单的解决方案,至少对于 Windows,是将第二个命令更改为
add_custom_command (
TARGET appleseed.shaders
PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${OSL_COMPILER} ${PROJECT_SOURCE_DIR}/sandbox/bin/
)
(注意 PRE_BUILD
关键字)
并从第一个命令中删除对 ${oslc}
的显式依赖。