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

Cai*_*wan 4 cmake hlsl visual-studio visual-studio-2015

我在 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

这是我正在尝试的设置:

cmake_minimum_required (VERSION 2.6)
project (Project)
subdirs(assets)
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

我已经尝试了这个答案中描述的以下方法,但没有成功。

小智 5

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

您可以使用VS_TOOL_OVERRIDE以下方法覆盖此默认行为:

    set_source_files_properties(my_shader.hlsl PROPERTIES VS_TOOL_OVERRIDE "None")
Run Code Online (Sandbox Code Playgroud)

请参阅cmVisualStudio10TargetGenerator::WriteExtraSourceCMake 源代码。

  • 荒谬的是,我几乎永远无法在 CMake 文档中找到我的问题的答案,并且仅将其用作网络搜索的起点。 (3认同)