7

Autotoolsを使用するほとんどのパッケージは、ユーザーレベルのユーティリティであるか、少なくとも完全に下回るのに十分なレベル/usr、または完全に下回るのに十分な低さ/usrです。

、に/binいくつかのファイルをインストールする必要があるパッケージを書いています。これは、従来これらの場所の下に配置されていたいくつかの既存のバイナリを置き換えます。/sbin/usr/bin/usr/sbin

また、にPAMモジュールをインストールする必要があります/lib/security(明らか/usr/lib/securityに機能しません)。

ここで問題は次のとおりです。デフォルトのconfigureのプレフィックスは。のよう/usr/localです。そのデフォルトを自分で制御できますconfigure.ac。そして、少なくともGentooLinuxのデフォルトはです--prefix=/usr。これは、私が設定したデフォルトを上書きするため、問題になりますconfigure.ac

他の同様のパッケージがこの問題をどのように処理しているかを簡単に調べました。これが私の発見です:

  • bash-4.1はにインストールされているよう/usr/binで、ディストリビューションビルドスクリプトはbashバイナリをに移動します/bin
  • Linux-PAMにはハックがあり、configure.acプレフィックスがの場合、そのファイルの一部に/usr使用/sbinされます。/libまた、デフォルトのプレフィックスをに設定します/usr。ユーザーが別のを渡すとどうなるかわかりません--prefix
  • shadow-utilsプレフィックスが。の場合に設定さexec_prefixれます。次に、を参照し、を指すように宣言されているため、を参照します。""/usrbin_PROGRAMS/binubindir${prefix}/binubin_PROGRAMS/usr/bin

私の質問は次のとおりです。

  • 他のディストリビューションのデフォルトは--prefix何ですか?私はそれが常にあると合理的に仮定できます/usrか?現時点では、Linuxについてのみ懸念しており、BSDについては懸念していません。
  • 上記のソリューションのどれが最もクリーンだと思われますか?より良い解決策がありますか?
  • 上記の解決策の潜在的な問題は何ですか?それらの問題に対するいくつかの解決策はありますか?
  • すべてをインストールして/bin互換性のあるシンボリックリンクを作成しても問題ありません。問題が簡単になりますか?
  • 私の要件をより適切に処理する低レベルのシステムユーティリティに受け入れられる他の一般的なビルドシステムはありますか?

私がやろうとしていることの説明を気軽に求めてください。交換するものとの互換性を維持したい場合、バイナリAとBを1つずつ出荷していた場合は/sbin/usr/binそれらの場所に交換を配置するか、少なくともシンボリックリンクを設定する必要があると思います。PAMモジュールのインストール場所も固定されています。

私は明らかに有用な答えに賛成するつもりです。私は「受け入れられた答え」です。私は主に「何をすべきか」というアドバイス、問題の最もクリーンな解決策、そして該当する場合はオプションと欠点、長所と短所の議論を探しています。

4

2 に答える 2

4

/基本的に、階層と階層の違いは/usr、パッケージのアップストリームメンテナの手に委ねられるべきではなく、またそうすべきではありません(読んでください:あなたの責任ではありません)。起動して利用可能にするため/に必要なファイルのみが含まれている必要があるため、/usr何が行われるかは管理上の決定/です。ソースからのインストールの場合、この決定はインストーラーによって行われ、配布の場合はパッケージメンテナによって行われます。

理論的根拠として、誰かが環境を構築しようとしていると仮定しchrootます。/ usrと/の区別は環境では無意味であり、作成されません。すべてのプレフィックスはに設定されて/foo/bar/chrootおり、configureスクリプトをいじると、$prefix奇妙な動作が発生する可能性があります。$prefix同じ議論が、通常のセマンティクスに依存して機能するDebianパッケージングヘルパーのようなスクリプトにも当てはまります。

したがって、最もクリーンなソリューションがbash-4.1ソリューションです。基本的に2つのクリーンなオプションがあります。パッケージをブートクリティカル部分と非ブートクリティカル部分に分割するか、configureスクリプトにブートクリティカル部分の代替プレフィックスを提供させます。これはデフォルトでに設定され/、として残さ$prefix/usrます。

于 2011-12-29T15:26:46.733 に答える
3

この質問には2つの異なるレベルがあり、あなたの質問はすべて2番目の意味(* .specファイル、debian / rules、または* .pkgファイルによって生成されたバイナリパッケージ)に当てはまるようです。心配している、あなたは気にしないでください。configure.acで/usr/local以外のデフォルトのプレフィックスを指定しようとしないでください。インストールする場所の指定は、configure.acではなく、バイナリパッケージ制御ファイルで行われます。autoconfで生成されたconfigureスクリプトを使用したソースディストリビューションはデフォルトで/usr/ localにインストールされるべきであり、それ以外はパッケージングエラーです。

ユーザーが特定のプラットフォームの特定の場所に簡単にインストールするために使用できるソースディストリビューションが必要な場合は、そうするスクリプトをtarballに含めることができます。たとえば、次のようなビルドスクリプトを含めることができます。

#!/ bin / sh

ケース$1
foo)args ='--prefix = / usr --bindir = / bin --sysconfdir = / etc' ;;
bar)args ='--prefix = / opt' ;;
*)args = ;;
esac
$(dirname $ 0)/ configure $ args &&
作る &&
インストールする

これは、「foo」および「bar」プラットフォーム用に構成するデフォルトの引数を指定しますが、実際には、質問はバイナリパッケージの制御ファイルに関するもののようです。

于 2011-12-29T17:28:15.883 に答える