我们有两个add_custom_command
子句,其中一个则取决于其它:add_custom_command根据另一个add_custom_command
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
编译器编译的.osl
源文件到一个.oso
对象文件请注意对
${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/ )
虽然这种设置的作品,它有副作用,就是即使输入文件.osl
未被修改,两个命令都是总是执行执行(第二个命令后跟第一个命令)。
看来,这种行为是特定于Windows。它似乎在Linux上正常工作。
如果依赖性${oslc}
从第一命令移除,所述第二命令不再在所有执行,即使当oslc
编译器是缺失;但另一方面,.osl
文件现在仅在根据需要(只要存在oslc
)从最后一次构建后更改后才重新编译。
这个设置有什么问题吗?如果没有,结合这两个功能的正确方法是什么:编译.osl
文件时只有,它们在上次编译后发生了更改,并且在编译器(第一步所需的)尚未存在时“编译”oslc
?
实际CMake的脚本可以在GitHub上:
我希望第二个命令也有'DEPENDS'。它应该取决于第一个命令的一些输出。你必须弄清楚为什么第一个命令总是被构建。你为什么使用MAIN_DEPENDENCY?为什么有一个DEPENDS quotatiosmarks的论点? – usr1234567
oslc是一个可执行文件,对不对?你不应该依赖它,你应该检查它(FindOslc或类似的),然后将整个add_custom_command包装在OSCL_FOUND中。 – usr1234567
@ usr1234567第二个命令没有'DEPENDS',因为它不依赖任何东西。只需要在输出('oslc'编译器)丢失时运行。它用引号括起来,因为'oslc'的完整路径可能在Windows上包含空格。 –