Я работаю над проектом C ++, где я столкнулся с проблемой, с которой я также сталкивался в прошлом. Наряду с моим настоящим исполняемым файлом у меня есть шейдерные файлы, которые нужно скомпилировать.
В идеале файл с именем hello.vert
в исходном каталоге должен быть скомпилирован во время сборки до hello.vert.spv
в моем выходном каталоге сборки.
Моя попытка
Моя текущая реализация не работает - похоже, выходные файлы не создаются, и если я заменю COMMAND
чем-то вроде "echo himsgstr ", коснитесь исходных файлов, а затем соберите, он также не показывает никакого вывода. По сути, это то, что я создал:
add_executable(test test.cpp)
function(build_shader TARGETOBJ SHADERNAME)
set(FILENAME "${CMAKE_SOURCE_DIR}/${SHADERNAME}")
set(OUTNAME "${CMAKE_BINARY_DIR}/${SHADERNAME}.spv")
add_custom_command(OUTPUT ${OUTNAME}
COMMAND glslc ${FILENAME} -o ${OUTNAME})
add_custom_target(MAKE_${SHADERNAME} ALL DEPENDS ${FILENAME})
add_dependencies(${TARGETOBJ} MAKE_${SHADERNAME})
endfunction()
build_shader(test hello.vert)
build_shader(test hello.frag)
В идеальном мире
В простых make-файлах мое решение будет выглядеть так:
test: hello.vert.spv hello.frag.spv
...
%.spv: %
glslc $< -o $@
В CMake я не смог найти способ обрабатывать определенные типы файлов пользовательским способом - это сделало бы решение таким простым, как:
add_executable(test test.cpp hello.vert hello.frag)
Есть ли здравый, надежный способделать подобные вещи?