慣用的なUnixプログラムは、インストールされたプレフィックスが何であるかをどのように検出しますか?

慣用的なUnixプログラムは、インストールされたプレフィックスが何であるかをどのように検出しますか?

たとえば、非標準のプレフィックスを含むバイナリをインストールしたが、いくつかの/opt/bin/foo静的ファイルが必要な場合は、/opt/share/fooそのファイルをどのように見つけますか?実行可能ファイル()に基づいて../share/foo逆参照を使用しますか?コンパイル時にハードコードされていますか?

何ですかアプリケーションは変数のインストールプレフィックスをどのように処理しますか?すべてのディレクトリにプレフィックスを付ける必要がありますか? (何について/var?)

答え1

コンパイル時にこれらの参照をハードコーディングするのが一般的であり、コンパイル時のデフォルト値をオーバーライドするためにコマンドラインオプションまたは環境変数を指定できます。通常、プログラムは/etcコンパイル時のデフォルト値を上書きできる設定ファイル(通常は下)の場所のみを記憶します。このアプローチは、オペレーティングシステムを作成したのと同じ人がLinuxディストリビューションまたはBSDポートの一部としてコンパイルしたオープンソースソフトウェアに最適です。

バイナリ形式でデプロイされたアプリケーションの一般的なアプローチは、0番目の引数から始めてアプリケーションバイナリを見つけることです。通常、0番目のパラメータはexecve(つまりargv[0])は、バイナリ(呼び出し元(通常シェル)が準拠するルール)へのパスです。argv[0]含まれていない場合、/アプリケーションは$PATHそれに対して照会を実行する必要があります。

答え2

最も一般的なものは検出です。さまざまなパスはさまざまなプレフィックスで提供でき、autotoolsには別々のシステム構成( "")、ライブラリディレクトリ( "")などが--prefixあります。/etc/usr/lib

答え3

プログラムをコンパイルするために使用されるツール(GNU Autotoolsなど)は、指定されたオプションの値を取得して--prefixヘッダファイルに定義として置くことができます。

#define PREFIX "/usr/local/"

コードはPREFIXパス名の一部として使用します。

答え4

Unded Unixには、バイナリが起動する場所、つまりコンパイル変数のインストールプレフィックスを検出する移植可能な方法はありません。

関連情報