Пользовательский компилятор CMAKE не перезаписывается - PullRequest
0 голосов
/ 04 июня 2019

В проекте 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 компилятор запускается только в том случае, если исходные файлы новее, чем выходные файлы. Однако компилятор не перезаписывает выходные файлы, поэтому он не работает.

Удаление с файлом (УДАЛИТЬ ...) непосредственно перед тем, как пользовательская команда не работает, поскольку она удаляет все файлы, а не только те, которые требуют перекомпиляции. Кроме того, он удаляется при выполнении cmake, а не во время создания.

Я мог бы определить другую пользовательскую команду с помощью "rm", но это не кроссплатформенная (мне нужно было бы добавить определенные строки для Windows, что мне не нравится).

Есть идеи?

Спасибо!

...