在 CMAKE 项目中,我需要为文件类型 (.osl) 定义一个自定义命令,该文件类型 (.osl) 由工具 (oslc) 编译,该工具 (oslc) 编译为另一种文件类型 (.oso)
我设法通过一个可以在源文件列表上运行的函数来做到这一点:
find_program(OSLC_EXECUTABLE oslc)
function(compile_osl out_var)
set(result)
foreach(osl_f ${ARGN})
file(RELATIVE_PATH osl_f_base ${CMAKE_CURRENT_SOURCE_DIR} ${osl_f})
string(REGEX REPLACE "\\.osl$" ".oso" oso_f ${osl_f_base})
set(oso_f "${CMAKE_CURRENT_BINARY_DIR}/${oso_f}")
get_filename_component(oso_f_dir ${oso_f} DIRECTORY)
file(MAKE_DIRECTORY ${oso_f_dir})
add_custom_command(OUTPUT ${oso_f}
COMMAND ${OSLC_EXECUTABLE} ${osl_f} -o ${oso_f}
DEPENDS ${osl_f}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Creating compiled OSL file ${oso_f}"
VERBATIM
)
list(APPEND result ${oso_f})
endforeach()
set(${out_var} "${result}" PARENT_SCOPE)
endfunction()
由于该DEPENDS
指令,编译器仅在源比输出文件更新时运行。但是,编译器不会覆盖输出文件,因此它不起作用。
在自定义命令不起作用之前使用 file(REMOVE ...) 删除,因为它会删除所有文件,而不仅仅是需要重新编译的文件。此外,它在 cmake 执行时删除,而不是在 make 时删除。
我也许可以用“rm”定义另一个自定义命令,但这不是跨平台的(我需要为 Windows 添加特定的行,我不喜欢)。
任何想法?
谢谢!