Каков идеальный способ обработки пользовательских типов файлов в CMake? - PullRequest
1 голос
/ 23 октября 2019

Я работаю над проектом 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)

Есть ли здравый, надежный способделать подобные вещи?

1 Ответ

2 голосов
/ 23 октября 2019

Вы имели в виду:

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}
        DEPENDS ${FILENAME})
    add_custom_target(MAKE_${SHADERNAME} ALL DEPENDS ${OUTNAME})
    add_dependencies(${TARGETOBJ} MAKE_${SHADERNAME})
endfunction()

Значение target зависит от OUTNAME. OUTNAME зависит от FILENAME.

...