CMAKE自定义编译器不会覆盖

时间:2019-06-04 15:00:37

标签: cmake incremental-build add-custom-command

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

有什么主意吗?

谢谢!

0 个答案:

没有答案