web-dev-qa-db-ja.com

ソース外ビルドで相対パスを処理する方法は?

アウトオブソースビルドは、ソースディレクトリ以外の任意のディレクトリに存在できるビルドです。


ソースディレクトリの近くにある、実行時に必要ないくつかのリソースファイルへの相対パスを含むプロジェクトがあります。

しかし、プロジェクトを任意のフォルダにビルドすると、リソースファイルが(明らかに)見つかりません。

リソースファイルへのパスを提供する適切な方法は何ですか?

3
user695652

プログラムはC、C++、Ocamlなどのコンパイル言語(コンパイラで実装された言語)でコーディングされており、オペレーティングシステムはLinux(または他のPOSIX準拠のOS)であると想定しています。

まず、実行可能ファイル内にリソースを埋め込むことができます。そのためには、大きな定数バイト配列(àla [〜#〜] xbm [〜#〜] )をコンパイルします。 Cでconst char resbytes[] = { ...非常に長いバイトシーケンス。 23, 97,など... };。そのソースファイルは明らかにいくつかのシェルスクリプトによって生成される可能性があります(おそらく hexdump(1) などの助けを借りて...)

次に、リソースがビルドツリー外の一部のfixed(またはcompile-time configurable)パスにインストールされるように決定できます。これはほとんどのGNUソフトウェア(gccbashemacsmakeなど)に当てはまります。 )、 GNUコーディング標準 のディレクトリ変数を参照してください。インストール手順(例:make install)は、これらのファイルを適切な場所、たとえば/usr/share/または/usr/lib/などにコピーします。 ....そして、場所はinstalled実行可能ファイル内に構築されます(/usr/share/resources/myprog/の下に配置し、-DRESOURCEDIR="/usr/share/resources/myprog/"を関連するmakeトリックを使用してg++コンパイルコマンドに渡すことができます)。 autoconf を参考にしてください。

ビルドツリーではなく、インストールされた実行可能ファイルにリソースにアクセスできるようにする必要があることに注意してください。

あるいは、少なくともLinuxでは、リソースがrelative place w.r.tにインストールされていると判断できます。プログラムの実行可能ファイル(たとえば、祖父母のディレクトリ内)。 IIRCこれはxemacsの場合です。次に、実行可能ファイルとそのディレクトリのパスを見つけることが問題です(後で"../lib/fonts/"などのrelativeサブパスをそれに追加します)。 Linuxでは、 readlink(2)"/proc/self/exe"シンボリックリンクを使用する必要があります(結果に dirname(3) を使用します)。他の多くのPOSIXシステムでは、おそらくmainargv[0]とおそらくgetenv("PATH")を使用して、それを見つけて計算することができます(おそらく、後で realpath(3) の助けを借りて。 ..)。

一部のフレームワークライブラリ( Qt または [〜#〜] poco [〜#〜] またはおそらく [〜#〜] gtk [〜#〜] またはそのGlib)はconventionsそれらをサポートするリソースと関数について持っているかもしれません。

リソースを必要とする複雑な フリーソフトウェア の例は、 [〜#〜] gcc [〜#〜] コンパイラであり、それはソースツリーの外部に構築する必要があります。その「リソース管理」(特に<limits.h>または<stdarg.h>...のコンパイラ定義済みヘッダー)からインスピレーションを得るために、その中を見るかもしれません。

Linuxの場合は、便利な規則を定義する Filesystem Hierarchy Standard および hier(7) も調べてください。