CMAKE 避免在 Visual Studio 上编译 HLSL 着色器文件

CMAKE avoid compilation of HLSL shader files on Visual Studio

我在 Windows 上有一个带有 CMake 的 DirectX11 项目。 该项目包含(至少)三个子项目 - 一个用于核心 3D 引擎库 - 一个公共资产目录,其中包含构建在引擎顶部的测试或示例应用程序使用的所有二进制数据。

./ 
+-- src/
|   +-- api/
|       +-- CmakeLists.txt
+-- tests/
|   +-- assets/
|   |   +-- shaders/
|   |   |   +-- 1.hlsl
|   |   |   +-- 2.hlsl
|   |   |       ...
|   |   +-- images/
|   |   |       ...
|   |   +-- models/
|   |   |       ...
|   |   +-- CmakeLists.txt
|   +-- sampleApp1/
|   |   +-- CmakeLists.txt
|   |        ...
|   +-- sampleApp2 
|   |   +-- CmakeLists.txt
|   |   +-- ...
|   |   ... 
|   +-- CmakeLists.txt
+-- CmakeLists.txt

资产文件只是复制到相对于测试项目二进制目录 (${CMAKE_CURRENT_BINARY_DIR}) 的位置,以使其在相对于其工作目录 (../assets) 中可用。

我在资产中也有 hlsl 个着色器文件。当使用 CMake 将此类文件添加到项目时,VS 会将它们视为可编译源 - 显然 - 我希望避免这种情况,因为我希望使用 IDE 编辑此类文件并将它们复制到二进制文件文件夹并使用引擎编译,而不是让 VS 来编译。

我曾尝试将其设置为头文件,就像我希望避免构建的另一个源文件一样,但似乎有些东西将它们设置为着色器文件并出于某种原因覆盖了它。

这是我正在尝试的设置:

cmake_minimum_required (VERSION 2.6)
project (Project)
subdirs(assets)

在资产文件夹中我有以下内容:

file(GLOB_RECURSE FILES *.*)

add_custom_target(assets SOURCES ${FILES})
set_target_properties(assets PROPERTIES FOLDER tests)

# copy static sources 
foreach(_source IN ITEMS ${FILES})

    # this does not work for some reason
    set_source_files_properties(${_source} PROPERTIES HEADER_FILE_ONLY TRUE)

    if (IS_ABSOLUTE "${_source}")
        file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
    else()
        set(source_rel "${_source}")
    endif()

    get_filename_component(_source_path "${_source_rel}" PATH)
    get_filename_component(_source_name "${_source_rel}" NAME)    
    set(dst_path "${CMAKE_CURRENT_BINARY_DIR}/${_source_path}")

    file(MAKE_DIRECTORY ${dst_path})

    # -- win32 only
    if (WIN32)
        string(REPLACE "/" "\" _source "${_source}")
        string(REPLACE "/" "\" _dest "${dst_path}/${_source_name}")
    else()
        message("win32 required")
    endif(WIN32)

    add_custom_command(
        TARGET assets
        COMMAND copy ${_source} ${_dest}
        DEPENDS ${_source}
    )

endforeach()

我试过this answer中描述的以下方法,但没有成功。

在 CMake 中,HLSL 被作为额外的源处理,HEADER_FILE_ONLY 不适用于此处,如您所见。

您可以使用 VS_TOOL_OVERRIDE:

覆盖此默认行为
    set_source_files_properties(my_shader.hlsl PROPERTIES VS_TOOL_OVERRIDE "None")

参见 CMake 源代码中的 cmVisualStudio10TargetGenerator::WriteExtraSource