0

在 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 添加特定的行,我不喜欢)。

任何想法?

谢谢!

4

0 回答 0