我在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
。