【问题标题】:CMake custom post build step command always executesCMake 自定义后期构建步骤命令始终执行
【发布时间】: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


    【解决方案1】:

    使用add_custom_command创建像GNU make一样的make规则,收集所有输出并使用add_custom_target创建CMake目标。

    # generate shader output
    function(netcode_compile_shader var_binary_path source_path shader_type entry_point)
      get_filename_component(source_filename ${source_path} NAME_WE)
      get_filename_component(source_path "${source_path}" ABSOLUTE)
      set(binary_path "${CMAKE_CURRENT_BINARY_DIR}/${source_filename}.cso")
      add_custom_command(OUTPUT ${binary_path}
        COMMENT "Generating ${binary_path}..."
        COMMAND ${FXC} /T \"${shader_type}\" /E\"${entry_point}\" /Od /Zi /Fo \"${binary_path}\" \"${source_path}\"
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        DEPENDS "${source_path}"
      )
      set(${var_binary_path} "${binary_path}" PARENT_SCOPE)
    endfunction()
    
    # generate vs shader output
    macro(netcode_compile_vs var_binary_path source_path)
      netcode_compile_shader(${var_binary_path} ${source_path} "vs_5_0" "main")
    endmacro()
    
    # create shader compiling target
    set(NETCODE_VS 
      "envMapPass_Vertex.hlsl"
      "gbufferPass_Vertex.hlsl"
      "lightingPass_Vertex.hlsl"
      "skinningPass_Vertex.hlsl"
      "sprite_Vertex.hlsl"
      "ssaoPass_Vertex.hlsl"
    )
    foreach(vs ${NETCODE_VS})
      netcode_compile_vs(vs_out ${vs})
      list(APPEND NETCODE_VS_OUT ${vs_out})
    endforeach()
    add_custom_target(NetcodeClientShaders DEPENDS ${NETCODE_VS_OUT})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-22
      • 2017-03-09
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 2011-08-27
      相关资源
      最近更新 更多