プロジェクトをビルドしている他の開発者が「shaders」フォルダーを使用できるようにすることについて話していると思います。エンドユーザー (install
コンポーネントを含む) を意味する場合は、ビルドフォルダーについて話しているわけではないからです。
実行時にシェーダー フォルダーに固定の場所を提供する最も簡単な方法は、ソース ツリーからビルド ツリーにコピーすることだと思います。このようにして、他の開発者は自分のルート ビルド フォルダーをプロジェクトの外部 (必要に応じて内部) の任意の場所に配置でき、アプリはコピーされたシェーダー フォルダーにアクセスするときに処理する単一の固定相対パスを保持します。
コピーしたくない場合は他のオプションがあります (たとえば、CMake で構成ファイルをビルド ツリーに書き込むことができます。構成ファイルはシェーダー フォルダーへのパスを指定できます)。より壊れやすい。いずれにせよ、肝心なのは、構成時 (CMake の実行時) にソース ツリーからビルド ツリーに情報をコピーすることだと思います。これにより、実行時のコードで、潜在的に非常に離れたソース ツリーを探すのが困難になることはありません。
ルート CMakeLists.txt の例は次のようになります。
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(example)
add_executable(GraphicsApp GraphicsApp/main.cpp)
add_library(GraphicsLib
GraphicsLib/library/fileA.cpp
GraphicsLib/library/fileB.cpp
GraphicsLib/include/fileA.h
GraphicsLib/include/fileB.h
GraphicsLib/shaders/shader1.txt
GraphicsLib/shaders/shader2.txt
)
include_directories(GraphicsLib/include)
target_link_libraries(GraphicsApp GraphicsLib)
add_custom_command(TARGET GraphicsApp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_SOURCE_DIR}/GraphicsLib/shaders
$<TARGET_FILE_DIR:GraphicsApp>/shaders)
呼び出しを少し拡張するadd_custom_command
と、これにより基本的に「shaders」サブディレクトリGraphicsApp
がビルド先のフォルダーにコピーされます。GraphicsApp
コマンドはビルド時にいつでも実行されます。がGraphicsApp
ビルドされて最新の状態であり、それを再ビルドしようとすると、カスタム コマンドは実行されません。
カスタムコマンドは実際に実行されます
cmake -E copy_directory <path to shaders source> <path to shaders copy>
CMake の-E
クロスプラットフォーム コマンド モードを利用します。
GraphicsApp
コマンドの「宛先」部分 (「コピー先」の場所) は、ジェネレータ式を使用して、ビルド先の場所を推測します$<TARGET_FILE_DIR:GraphicsApp>
。これはおそらく、その目的を達成するための最も確実な方法です。構成の種類に関係なく、正しいものになります (たとえば、MSVC は "Debug/" または "Release/" フォルダーをビルド パスに挿入します)。
したがって、これにより、目的に最も近づくことができます。実行中のexeへのフルパスを取得して、コピーされたシェーダーフォルダーへのフルパスを推測する必要があると思います。ただし、これは現在の作業ディレクトリから検索するよりもはるかに簡単で堅牢です。現在の作業ディレクトリを計算することさえ簡単ではありません。