在CMAKE项目中,我需要为文件类型(.osl)定义一个自定义命令,该文件类型由工具(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添加特定的行,我不喜欢)。
有什么主意吗?
谢谢!