我正在使用v3.14.4和“ Visual Studio 15 2017 Win64”生成器创建CMake项目。在生成期间,还将编译.hlsl文件并将其存储在与.exe相同的目录中。某些原因导致我的hlsl文件VS_SHADER_OBJECT_FILE_NAME
属性的生成器无法正确处理。
这是我的CMake声明:
set_property(SOURCE shader.hlsl PROPERTY VS_SHADER_OBJECT_FILE_NAME
$<$<CONFIG:Release>:Release/shader.dxbc>
$<$<CONFIG:Debug>:Debug/shader.dxbc>)
VS中的结果表明该表达式已基本通过。
$<$<CONFIG:Release>:Release/shader.dxbc>;$<$<CONFIG:Debug>:Debug/shader.dxbc>
我已经成功地将生成器与target_compile_definitions()
语句一起使用,并且还支持set_property()
。是我的用法格式错误还是更好的书写方式?
正如Tsyvarev指出的,VS_SHADER_OBJECT_FILE_NAME
属性不支持生成器表达式。一种解决方案是将编译的着色器复制到每种构建类型的所需目标,在这种情况下,该目录与.exe相同。下面的函数copy_compiled_shader
将SHADERBC_FILE
复制到使用生成器函数确定的新目录。
set_property(SOURCE shader.hlsl PROPERTY VS_SHADER_OBJECT_FILE_NAME shader.dxbc)
function(copy_compiled_shader SHADERBC_FILE)
add_custom_command(
TARGET TestCS
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "Copying the shader ${SHADERBC_FILE}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SHADERBC_FILE} $<TARGET_FILE_DIR:TestCS>/${SHADERBC_FILE}
)
endfunction()
copy_compiled_shader(shader.dxbc)