【问题标题】:CMake set_property command with generator expressions using build typeCMake set_property 命令与生成器表达式使用构建类型
【发布时间】:2019-11-21 07:09:36
【问题描述】:

我正在使用 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()。我的用法是错误的还是用不同的方式写得更好?

【问题讨论】:

  • 是否支持生成器表达式取决于属性(名称和类型)。由于documentation for the VS_SHADER_OBJECT_FILE_NAME property 没有描述生成器表达式的用法,因此可能会假设此属性不支持生成器表达式。比较例如documentation for COMPILE_DEFINITIONS property,支持生成器表达式。
  • 我明白并将在今后牢记这一点。现在我已经添加了一个自定义命令,它将编译后的着色器放到我想要的位置。
  • @PaulKippes 如果您找到了问题的解决方案,请将解决方案发布为您问题的答案。请不要将答案嵌入问题帖子中。这样,其他有类似问题的人就可以找到解决方案,并了解是什么解决了问题。

标签: visual-studio cmake hlsl


【解决方案1】:

正如 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)

【讨论】:

    猜你喜欢
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多