build - 在 CMake 中处理自定义文件类型依赖项的理想方法是什么?

标签 build cmake

我正在处理一个 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()

目标 取决于OUTNAMEOUTNAME 依赖于 FILENAME

关于build - 在 CMake 中处理自定义文件类型依赖项的理想方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58530457/

相关文章:

python-3.x - 在 GitLab 中创建一个 pyqt 构建

windows - 如何使用 CMake 指定其中包含空格的路径?

c++ - CMake - 安装第三方 dll 依赖项

linux - HipHop 补丁需要自定义 libevent

cmake - 如何手动将 CMake 路径变量设置为 NOTFOUND?

android - 为网站构建 Android 应用程序

android - 如何解决 Android 工具中的 javac 增量构建未检测到应导致重新编译的更改?

Azure Devops Pipeline 在离线服务器上构建 - NuGet 包?

c++ - Cmake 奇怪的错误 : Syntax Error Unexpected Token ('

javascript - 我可以向构建时创建的脚本标签添加属性吗?