私のプロジェクトには、/usr/share/openage
さまざまなファイル (グラフィック、テキストなど) を含むグローバル アセット ディレクトリ ( ) と、ユーザー~/.openage
がグローバル アセットの一部を上書きしたり、独自のアセットを追加したりできるユーザー固有のアセット ディレクトリ ( ) があります。
ビルド時にインストール プレフィックスをビルド システム (例: ) に渡すと、コード (例: ) でインストール プレフィックスを使用できるようにする./configure --install-prefix=/usr
ファイル (例: ) が生成されると理解しています。次に、コードは でそのアセットを探します。ここまでは順調ですね。configure.h
#define INSTALL_PREFIX="/usr"
INSTALL_PREFIX "share/openage"
ただし、プロジェクトがまだインストールされていない場合 (開発者である私にとっては 99.9% の場合に当てはまります)、ディレクトリ/usr/share/openage
は明らかにまだ存在しません。./assets
代わりに、現在のディレクトリで使用したいと思います。さらに悪いことに、インストールされたディレクトリが存在する場合(たとえば、独立した以前のインストールから)、現在の開発バージョンとデータの互換性がない可能性があります。
同様に、インストールされたプロジェクトを実行する場合、ユーザーのホーム ディレクトリ ( ~/.openage
) をユーザー アセット ディレクトリとして使用し、"devmode" では "./userassets" のようなディレクトリを使用する必要があります。
非 POSIX プラットフォームについて考えると、さらに悪化します。Windows では、INSTALL_PREFIX
プログラムは基本的にどこにでもインストールできるため (プログラムは単純に現在の作業ディレクトリを使用するのか、それともアセット ディレクトリとして使用するのか?)、役に立ちません。
だから私の質問は:一般的に受け入れられている「これを行うための最良の方法」はありますか?確かに、何百ものプロジェクト (基本的にはアセット ディレクトリを持つすべてのプロジェクト) が、何らかの方法でこの問題に対処してきました。
残念ながら、何をグーグルで検索すればよいかさえわかりません。この質問にタグを付ける方法さえわかりません。現在のアイデア (および関連する問題) には、次のものが含まれます。
openage_version
で、ソース ディレクトリにのみ存在するファイル を探していますcwd
。存在する場合は、プロジェクトが現在アンインストールされていると想定します。- 問題: 「開発モード」であっても、
cwd
常にプロジェクトのルート ディレクトリであるとは限りません。
- 問題: 「開発モード」であっても、
readlink("/proc/self/exe")
で始まるかどうかを確認するINSTALL_PREFIX
- 問題: プラットフォーム固有
- 問題: 理論的には、プロジェクトのルート ディレクトリは
/usr/myweirdhomedirectory/git/openage
- 開発者に引数の指定
--not-installed
や環境変数の設定を強制するOPENAGE_INSTALLED=0
- 問題点: 不便
- 問題: 引数の指定を忘れると、間違ったアセット ディレクトリが使用されたときに混乱が生じる
- 開発中
./configure
、別のINSTALL_PREFIX
- 問題: インストール用にプロジェクトをビルドすると、プロジェクトがインストールされていないときに、推奨
make test
されるテストが実行されます。
- 問題: インストール用にプロジェクトをビルドすると、プロジェクトがインストールされていないときに、推奨
- 最初の 2 つのオプションの組み合わせ:
dirname(readlink("proc/self/exe")) + "/openage_version"
- 問題: さらにプラットフォーム固有
- これは、これまでのところ最も堅牢なオプションのようです