我正在处理一个 C++ 项目,我遇到了一个我过去也遇到过的问题。除了实际的可执行文件外,我还有需要编译的着色器文件。
理想情况下,源目录中名为 hello.vert
的文件将在构建时编译为我的构建输出目录中的 hello.vert.spv
。
我的尝试
我当前的实现不起作用 - 似乎没有创建输出文件,如果我将 COMMAND
替换为“echo hi”之类的东西,触摸源文件然后构建,它确实如此也不显示任何输出。这基本上是我创建的:
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)
有没有一种理智、可靠的方法来做这类事情?
最佳答案
你的意思是:
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()
目标
取决于OUTNAME
。 OUTNAME
依赖于 FILENAME
。
关于build - 在 CMake 中处理自定义文件类型依赖项的理想方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58530457/