CMake set_property 命令与使用构建类型的生成器表达式

CMake set_property command with generator expressions using build type

我正在使用 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)