Homebrew brew linkしてもリンクしたopensslを使ってくれない。


環境:Mac OS X(10.9.5 Mavericks)

結論から言うと、パスの優先順位の問題で、パスを直したらうまくいった。

軽く混乱気味なので、先に用語を整理(homebrewの勉強不足ですね。)

下記の記事でちょっと用語を整理
homebrewとは何者か。仕組みについて調べてみた
Homebrewまとめ
What does “brew link” do?
homebrew のサブコマンド一覧1 (a-i)

keg-only: Cellar だけにインストールされ、/usr/local にはリンクされていない formula のこと。これは、ほとんどのツールが当該の formula を見つけることができないことを意味する。(?) brew link を使えば、リンクすることはできる。

celler: インストール先。brew install でインストールしたパッケージがある場所。

formulate: パッケージのこと

brew link: シンボリックリンクを貼る。リンク先はbrew --prefixで表示されるパスのbinディレクトリに配置される。

以下本題。
下記の記事を参考にopensslをアップデートした。

しかし、brew link openssl --forceでシンボリックリンクを作成しても、古いバージョンのopensslを参照してしまう問題が発生した。

Mac OS X の openssl を最新の状態にする

いろいろコマンドを実行して状況確認する。(opensslは更新済み。シンボリックリンクを作るところから)

opensslの新しいバージョンは正しくインストールされている。

brew list openssl
/usr/local/Cellar/openssl/1.0.2g/bin/c_rehash
/usr/local/Cellar/openssl/1.0.2g/bin/openssl
/usr/local/Cellar/openssl/1.0.2g/include/openssl/ (75 files)
/usr/local/Cellar/openssl/1.0.2g/lib/libcrypto.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.2g/lib/libssl.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.2g/lib/engines/ (12 files)
/usr/local/Cellar/openssl/1.0.2g/lib/pkgconfig/ (3 files)
/usr/local/Cellar/openssl/1.0.2g/lib/ (4 other files)
/usr/local/Cellar/openssl/1.0.2g/share/man/ (1575 files)

リンクをすると成功する。

$ brew link openssl --force
Linking /usr/local/Cellar/openssl/1.0.2g... 1588 symlinks created

リンクは成功しているが、バージョンは古いまま(最新は1.0.2g)

$ openssl version
OpenSSL 1.0.2d 9 Jul 2015

opensslとbrew linkのリンク先を確認すると、別のパスをさしている事がわかった。
パスの優先順位の問題じゃないかと疑う。

$ which openssl
/opt/local/bin/openssl
brew linkでのリンク先
$ brew --prefix
/usr/local

.bash_profileを見てみると、既存の/opt/local/binの方が優先順が先になっている。MacPortsが自動でPATHを追加したようだ。

export PATH="/opt/local/bin:/opt/local/sbin:$PATH"

なので、こいつをパスの最後につけるようにしてみる。

export PATH=$PATH:"/opt/local/bin:/opt/local/sbin"

パスの設定を変更したところで確認すると、Homebrewでインストールしたopensslを使ってくれてる模様。

$ which openssl
/usr/bin/openssl
$ openssl version
OpenSSL 1.0.2g  1 Mar 2016

これでopensslの更新完了。
単純な問題だった。もうちょっとパスの優先順位に気をつけていれば良かった。

※追記1
先日El Capitanにアップグレードしたところ、またパスが変わっていた。
どうやら、etc/pathsの設定を読み込むようになっていたらしい。こちらの記事を読んで、.zshenvに”setopt no_global_rcs”を追加することで、パスの問題を解決できた。
.zshenv で PATH を管理したら罠にハマった

※追記2
home brewでopensslをダウンロードしてbrew linkでlinkする方法は2016年8月くらいから使用できなくなった模様。
下記コマンドを実行すると、以下のようなメッセージが出力される

% brew link openssl --force
Warning: Refusing to link: openssl
Linking keg-only openssl means you may end up linking against the insecure,
deprecated system OpenSSL while using the headers from Homebrew's openssl.
Instead, pass the full include/library paths to your compiler e.g.:
  -I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib

下の記事によると、opensslのパスを直接通せばいいらしい。
brew link openssl --forceができない問題