2016-02-11 1 views
8

私はhomebrewを使い始めたばかりで、自分のプロジェクトでいくつかのライブラリ(boost、gsl、openblasなど)を使う方法を理解しようとしています。Homebrewで作成された/ usr/local/optディレクトリがあるのはなぜですか?

それぞれの式はHomebrewによって/ usr/local/Cellar /にインストールされ、usr/local/bin、usr/local/lib、usr/local/includeにシンボリックリンクされていることが分かりました。これは、OSによって既にインストールされているライブラリを混乱させるわけではありません(例えば、Understand homebrew and keg-only dependencies参照)。しかし、私はすべての数式が/ usr/local/optディレクトリにもリンクされていることに気付きました。

これは/ usr/local/optディレクトリ(これは冗長です)があり、式(usr/local/Cellarまたはusr/local /)を使用するためにどのパスを使用する必要があるのか​​です。 usr/local/optは基本的に)?

答えて

17

バージョンのアップグレードによって変化しない数式コンテンツのパスを提供します。

このシナリオを検討してください。をHomebrewでビルドするとします。それはバージョン2.0.0であり、従ってそれは/usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylibに住んでいます。あなたが構築している別のプログラムからそれにリンクしたいので、-L/usr/local/Cellar/libfoo/2.0.0/lib -lfoogccに渡します。あなたのプログラムはコンパイルされます。その後、libfoo 2.0.1にアップグレードし、v2.0.0を削除します。現在/usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylibは存在しなくなり、libfooを動的にロードすることができないため、プログラムはもはや実行されません。

これは問題ありません。 libfoo.dylib/usr/local/lib/libfoo.dylibでも入手できます。 libfooの最新バージョンへのシンボリックリンクですので、常に存在するはずです。したがって、プログラムに-L/usr/local/lib -lfooを渡してコンパイルします。後でlibfoo 2.0.1にアップグレードします。 /usr/local/lib/libfoo.dylibがまだ存在し、v2.0.1のコピーを指しているので問題ありません。

これは素晴らしいことですし、ホームブリューはしばらくの間、そのシステムだけで存在していました。問題は、いくつかの数式は「樽のみ」なので、/usr/localからシンボリックリンクされていないということです。 (一般的には、OS Xに付属のライブラリのバージョンをシャドーするためにのみ使用され、OS Xライブラリを置き換えると問題が発生する可能性があります。)keg-onlyバージョンのライブラリにリンクしたいとします。 /usr/local/libからシンボリックリンクされていないので、/usr/local/Cellarにインストールされているバージョンへの完全なパスを指定する必要があります。これは上記の最初の問題に戻ります。

/usr/local/optがこの問題を解決します。 keg-onlyであるかどうかに関係なく、のすべてのの式がシンボリックリンクされる場所が提供されます。今度は、あなたのプログラムをコンパイルしたいときは-L/usr/local/opt/libfoo/lib -lfooを使うことができます。あなたがアップグレードしても、それがkeg-onlyであってもあなたのプログラムはlibfooの最新バージョンにリンクします。

+0

は、あなたの答えをありがとう! (そしてこの方法で私はこの質問を再開するのを助けるために)だから私はいつも/ usr/local/optを使うのが一番安全な選択だと思うが、Homebrewはまだ/ keym-onlyのためのシンボリックリンクを作成するために/ usr/local / –

1

mipadiの回答を補完するだけです。一貫性のある場所にファイルを保存する適切な名前記事から

/usr/local/opt

は、システムクリーンで保守 を保つための重要な部分です。ほとんどのLinuxシステムでは、パッケージマネージャを使用してソフトウェアの大部分が にインストールされています。パッケージマネージャー は、インストールされているファイルを追跡するため、最小の副作用で ソフトウェアを更新および削除できます。

ただし、 で利用できないソフトウェアがインストールされている必要があります。ファイルシステムの の副作用を最小限に抑えるために、そのようなソフトウェアは/ usr/local ディレクトリにインストールされています。 UNIXスタイルのソフトウェアをインストールすると、ローカルルートの下にあるbin、 lib、shareなどのサブディレクトリにファイルが置かれますが、パッケージ固有のディレクトリにソフトウェアをインストールしてローカルルートからソフトリンクを追加するのは非常に珍しいことです( )。 。そうすることで、ソフトウェアを簡単に削除することができます。パッケージ固有のディレクトリ とそれを指すリンクを削除するだけです。

ソフトウェアによっては、ローカルインストールの手順が記載されています。 は、/ usr/localに直接パッケージ固有のディレクトリを作成します。この は、UNIX階層 ディレクトリとパッケージ固有のディレクトリを混在させているため、良い組織を推進していません。 ソフトウェアをパッケージ固有のディレクトリにインストールすることは既に/ optディレクトリの の別の場所で行われているため、 の同じ規則に従い、ローカルにインストールされたパッケージ固有の ディレクトリを/ usr/local/optに配置することは理にかなっていますディレクトリ。

ディレクトリ名にバージョン番号を含める必要はありませんが、 複数のバージョンを同時にインストールしてテストすることができるため、ローカルにインストールされたソフトウェアを使用することをお勧めします。 特定のバージョンのソフトウェアを実行するには、 ディレクトリの下に直接実行可能ファイルを実行します。実行可能ファイルが/ usr/local/binからリンクされているように、 を制御することによって、どのバージョンもデフォルトにすることができます。たとえば、新しい バージョンのソフトウェアは、古いバージョンの を削除せずにインストールしてテストすることができます。新しいバージョンが準備できたら、/ usr/local/binにある のリンクを更新して、それを指すようにすることができます。ソフトウェアの旧バージョンは、もはや必要がなくなったら削除することができます。

出典:著作権©2014 Extellisys

関連する問題