C针对包含/依赖项调用GLSLC [英] CMake invocation of GLSLC with respect to includes/dependencies

查看:6
本文介绍了C针对包含/依赖项调用GLSLC的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用glslc将带有#include的GLSL着色器(不是核心规范IIRC的一部分,但在shaderc中受支持,这是glslc背后的引擎,随LunarG Vulkan SDK一起分发)编译成Vulkan和GL 4.5的SPIR-V。glslc发出包含依赖信息的GCC样式的desfile([my_shader].[ext].d)文件。

我的项目是用cmake/nimpa/msvc 2017构建的。

今天,当着色器在磁盘上发生更改时,我使用cmakecustom_command调用glslc,作为到我的主要目标的构建后步骤。但是,这不会捕获包含文件中的更改(根本不知道.d文件或其内容),因此在更改包含的GLSL文件时重新生成着色器可能会使我和我的团队中的其他人出错。

看起来忍者可以调用任意编译器,而且由于忍者知道如何处理深度文件,我应该能够强制忍者运行glslc--不确定其他构建系统,因为现在我们对忍者是标准化的。

那么,我如何告诉cmake将忍者配置为对特定目标使用glslc?或者,有没有一种典型的方式来完成这项工作?看起来在2016年左右,cmake pull request to add support for glslc as a compiler没有进入cmake,所以无论我做什么都将是一个变通办法。

推荐答案

CMake在与忍者结合使用时能够理解DepFiles。

DEPFILE

指定忍者生成器的.d描述文件。.d文件包含通常由自定义命令本身发出的依赖项。将DEPFILE与忍者以外的其他生成器一起使用是错误的。

add_custom_command(
    OUTPUT ${source}.h
    DEPENDS ${source}
    COMMAND
        glslc
        -MD -MF ${source}.d
        -o ${source}.h -mfmt=num
        --target-env=opengl
        ${CMAKE_CURRENT_SOURCE_DIR}/${source}
    DEPFILE ${source}.d
)
  -M                Generate make dependencies. Implies -E and -w.
  -MM               An alias for -M.
  -MD               Generate make dependencies and compile.
  -MF <file>        Write dependency output to the given file.
  -MT <target>      Specify the target of the rule emitted by dependency
                    generation.

编辑:变得更花哨

find_package(Vulkan COMPONENTS glslc)
find_program(glslc_executable NAMES glslc HINTS Vulkan::glslc)

function(compile_shader target)
    cmake_parse_arguments(PARSE_ARGV 1 arg "" "ENV;FORMAT" "SOURCES")
    foreach(source ${arg_SOURCES})
        add_custom_command(
            OUTPUT ${source}.${arg_FORMAT}
            DEPENDS ${source}
            DEPFILE ${source}.d
            COMMAND
                ${glslc_executable}
                $<$<BOOL:${arg_ENV}>:--target-env=${arg_ENV}>
                $<$<BOOL:${arg_FORMAT}>:-mfmt=${arg_FORMAT}>
                -MD -MF ${source}.d
                -o ${source}.${arg_FORMAT}
                ${CMAKE_CURRENT_SOURCE_DIR}/${source}
        )
        target_sources(${target} PRIVATE ${source}.${arg_FORMAT})
    endforeach()
endfunction()
add_executable(dummy dummy.c)
compile_shader(dummy
    ENV opengl
    FORMAT num
    SOURCES
        dummy.vert
        dummy.frag
)

这篇关于C针对包含/依赖项调用GLSLC的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆