В проекте 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, что мне не нравится).
Есть идеи?
Спасибо!