【问题标题】:What is the ideal way to handle custom file type dependencies in CMake?在 CMake 中处理自定义文件类型依赖关系的理想方法是什么?
【发布时间】: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)

有没有一种理智、可靠的方法来做这种事情?

【问题讨论】:

    标签: build cmake


    【解决方案1】:

    你的意思是:

    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 依赖于OUTNAMEOUTNAME 依赖于 FILENAME

    【讨论】:

    • 哇,很惊讶我没听懂,谢谢!不过,仍然很好奇是否有更好的方法来处理不同的文件类型。
    猜你喜欢
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2010-09-21
    • 2015-05-11
    • 2010-10-24
    • 2019-08-12
    • 1970-01-01
    相关资源
    最近更新 更多