【发布时间】:2019-10-24 04:51:04
【问题描述】:
我正在处理一个 C++ 项目,在该项目中遇到了我过去也遇到过的问题。除了我的实际可执行文件,我还有需要编译的着色器文件。
理想情况下,源目录中名为 hello.vert 的文件将在构建时编译为我的构建输出目录中的 hello.vert.spv。
我的尝试
我当前的实现不起作用 - 似乎没有创建输出文件,如果我用“echo hi”之类的东西替换COMMAND,触摸源文件然后构建,它也不显示任何输出.这基本上是我创建的:
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)
在理想世界中
在普通的 makefile 中,我的解决方案如下所示:
test: hello.vert.spv hello.frag.spv
...
%.spv: %
glslc $< -o $@
在 CMake 中,我无法找到以自定义方式处理某些文件类型的方法 - 这将使解决方案变得如此简单:
add_executable(test test.cpp hello.vert hello.frag)
有没有一种理智、可靠的方法来做这种事情?
【问题讨论】: