【发布时间】:2020-07-07 17:36:36
【问题描述】:
我目前正在尝试使用 CMake 编译着色器,但仅限于它们被更改时。我认为它可以正确完成,但我在 CMake 方面并没有真正的经验来实现这一点。
我的文件夹结构:
Root
+ NetcodeClient
| + Shaders
| | + CMakeLists.txt
| + CMakeLists.txt
+ CMakeLists.txt
顶层Root/CMakeLists.txt 里面有project() 调用,我在那里定义了以下宏(我将只包括顶点着色器,因为其余的只是复制意大利面):
macro(NETCODE_COMPILE_SHADER ownerTarget fileName shaderType entryPoint)
get_filename_component(strippedFileName ${fileName} NAME_WE)
add_custom_command(TARGET ${ownerTarget}
POST_BUILD
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${fileName}
COMMAND ${FXC} /T \"${shaderType}\" /E\"${entryPoint}\" /Od /Zi /Fo \"${CMAKE_BINARY_DIR}/Shaders/${strippedFileName}.cso\" ${CMAKE_CURRENT_SOURCE_DIR}/${fileName}
BYPRODUCTS ${CMAKE_BINARY_DIR}/Shaders/${strippedFileName}.cso
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
endmacro()
macro(NETCODE_COMPILE_VS ownerTarget fileName)
NETCODE_COMPILE_SHADER(${ownerTarget} ${fileName} "vs_5_0" "main")
endmacro()
[...]
add_subdirectory("NetcodeClient")
我在 Root/NetcodeClient/Shaders/CMakeLists.txt 目标中使用的代码如下所示:
set(NETCODE_VS
"envMapPass_Vertex.hlsl"
"gbufferPass_Vertex.hlsl"
"lightingPass_Vertex.hlsl"
"skinningPass_Vertex.hlsl"
"sprite_Vertex.hlsl"
"ssaoPass_Vertex.hlsl"
)
add_custom_target(NetcodeClientShaders DEPENDS ${NETCODE_VS})
foreach(var ${NETCODE_VS})
NETCODE_COMPILE_VS(NetcodeClientShaders ${var})
endforeach(var)
然后最后在Root/NetcodeClient/CMakeLists.txt我做了以下,只是为了连接依赖:
add_subdirectory(Shaders)
add_dependencies(NetcodeClient NetcodeClientShaders)
.cso 文件编译得很好,但每次我按下 build 时它都会运行,这不会花费太多时间,但如果可能的话,我很想减少它。
我咨询了add_custom_command 很多,我认为在定义构建步骤时我无法添加 DEPENDS 部分。根据描述,这正是我在这里所需要的。请你帮我看看好吗?
【问题讨论】:
标签: visual-studio build cmake