Ich habe ein DirectX11-Projekt mit CMake unter Windows. Das Projekt enthält (mindestens) drei Unterobjekte - eines ist für die Kern-3D-Engine-Bibliothek - ein gemeinsames Asset-Verzeichnis, das alle binären Daten enthält, die von den Test- oder Beispiel-Apps auf der Engine verwendet werden.CMAKE vermeiden Kompilierung von HLSL Shader-Dateien auf Visual Studio
./
+-- 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
Die Asset-Dateien werden nur werden in Bezug auf die Testprojekte binär dir (${CMAKE_CURRENT_BINARY_DIR}
) kopiert, um sie auf ihr Arbeitsverzeichnis (../assets
) in Bezug zur Verfügung zu stellen.
Ich habe HLSL-Shader-Dateien in Assets. Wenn solche Dateien mit CMake zum Projekt hinzugefügt werden, wird VS sie als kompilierbare Quelle bedrohen - offensichtlich - was ich vermeiden möchte, weil ich möchte, dass solche Dateien mit der IDE bearbeitet werden und sie einfach in den binären Ordner kopieren und den Engine zu kompilieren, anstatt VS zu tun.
Ich habe versucht, als Header-Datei, wie andere Quelldateien, die ich vermeiden möchte, zu erstellen, aber es scheint, dass etwas sie als Shader-Datei setzt und diese aus irgendeinem Grund überschreibt.
Hier ist mein Setup mit Ich versuche:
cmake_minimum_required (VERSION 2.6)
project (Project)
subdirs(assets)
Im Asset foler habe ich folgendes:
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()
ich die folgende Methode desciberd in this answer versucht, aber tat‘ t erfolgreich sein.
Es ist lächerlich, dass ich fast nie Antworten auf meine Fragen in der CMake-Dokumentation finde und sie nur als Ausgangspunkt für die Websuche benutze. – Egor