C针对包含/依赖项调用GLSLC [英] CMake invocation of GLSLC with respect to includes/dependencies
本文介绍了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屋!
查看全文