Install Term::ReadLine::Gnu on OS X without brew?

またまた、ごく局所的な問題に対するワークアラウンドな記事になります。誰の役に立つというものではありません。

Perl の Term::ReadLine::Gnu というモジュールを、 OS X (El Capitan) にインストールするためのノートです。

詳細は端折りますが、一言で言うならば OS X 特有の性質によって、モジュール Term::ReadLine::Gnu を素直にインストールすることができません。

Google でこの問題について訊いてみると、たいていは Homebrew というパッケージ管理システムを用いて、やってしまうようです。これの意味するところは、 /usr/local に readline をインストールすることに着地するのだと思います。

しかしながら、私は brew も /usr/local も使いたくありませんし、 readline はソースからビルドしたやつが、すでにホームディレクトリの下にインストールしてあるのです。なので、それを Makefile.PL が検出してくれれば、または検出してくれるように仕向けることができれば、取るに足らないことに違いなかったのですが──。

Term::ReadLine::Gnu の Makefile.PL の中を覗いてみたところ、コマンドラインから Makefile.PL を実行する際にパラメータとして readline の位置を伝える手段があるにはあるのですが、 Carton を用いて Term::ReadLine::Gnu をインストールしようとしている場合はコマンドライン・パラメータ経由でそれを与える方法がありません(ですよね? 私が cpanfile の仕様を知らないだけかも)。代わりにパラメータを環境変数ででも受け付けてくれれば、と思ったのですが、その手段は提供されてはいませんでした。

しかし、希望の見える道もありました。 Term::ReadLine::Gnu の最近のアップデート( 1.27 2015-09-06 )で、 OS X の環境では brew コマンド (Homebrew) が入っていればその機能を呼び出して、 readline のライブラリの位置を得るようになっているようでした。

しからばと、じぶんの環境に Homebrew がないことを逆手にとって、次のようなシェルスクリプトを書きました。私の環境では、ホーム下にあるディレクトリ Local に readline がインストールされています( $HOME/Local を prefix として readline をインストールしてある):

1
2
#!/bin/sh
echo $HOME/Local

そして、コマンド・サーチパスの通ったディレクトリに brew という名前で保存し、実行権を与えました。──これでどうやらごまかせそうです。実際、うまくごまかせました。

ただ、これはあとから知ることとなったのですが、 Homebrew でも /usr/local 以外の場所を使うことはできるそうで、本当の brew でもやりくりできるのかもしれません。 Makefile.PL は次のようにして readline の場所を知ろうとしているのでした。

1
brew --prefix readline