2017-05-02 4 views
1

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.

Antwort

1

In CMake HLSL wird als Quelle extra behandelt, und HEADER_FILE_ONLY gilt hier nicht, wie Sie entdeckt haben.

Sie können dieses Standardverhalten außer Kraft setzen, indem VS_TOOL_OVERRIDE mit:

set_source_files_properties(my_shader.hlsl PROPERTIES VS_TOOL_OVERRIDE "None") 

Siehe cmVisualStudio10TargetGenerator::WriteExtraSource in CMake Quellcode.

+0

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

Verwandte Themen