Я сейчас пытаюсь скомпилировать шейдеры с помощью 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 файлы компилируются просто отлично, но они запускаются каждый раз, когда я нажимаю сборку, что не занимает слишком много времени, но я бы с удовольствием чтобы сократить это, если это возможно.
Я много раз консультировался с add_custom_command , и мне кажется, что я не могу добавить часть DEPENDS, когда определяется шаг сборки. Что по описанию именно то, что мне нужно здесь. Не могли бы вы помочь мне здесь, пожалуйста?