homebrewで入れたreadlineを使いつつruby-buildでruby入れてみた

ローカルのruby環境を管理するのにrbenvを使っているのですが、こういう場合はrvmを使ったほうが簡単です、たぶん。
rbenvは複数バージョンのrubyをすぐ切り替えられるということのみにフォーカスしてて、ruby本体をインストールするのは自前でmake等します。毎回それは面倒すぎる。そこで、ruby各バージョンのビルド内容のレシピをもっててコマンド一発でやってくれるよう、補助的に用意されているのがruby-buildなわけです。わー、ruby-build便利!

ところが、ruby-buildのREADMEのまま、なにも考えずにいれた1.9.2ではreadlineが有効になっておらず、earthquake.gemがちゃんと動いてくれませんでした。
現状、ruby-buildではconfigure時のオプションを指定できないので、お勉強も兼ねてソースを少し書き換えて動かしてみました。

手順

readline

Homebrew+RVMでreadline/iconvを使う - どっかのBlogの前置きのような
こちらを参考に、brew-linkを忘れずに。

ruby-build


以上、diff。
ruby本体のビルドのためにメソッドをわけて、configureオプションを直接書いたかんじです。

まとめ

ruby-buildにモンキーパッチをあてて、configureオプションを指定してrubyをビルドしたわけです。
問題は、これをもとにruby-build本体にどう貢献するか。
こういうIssueもありますが、そもそもruby-buildの便利なのはレシピの内容を気にしなくていいってことなんです(と思っています)。
configureオプションを指定しようとした時点で嫌が応にもそれは崩壊します。それなら、ruby-build使わずとも自分でソースからビルドすればいいわけですよ。
というわけで、はたしてconfigureオプション指定できるようになっていくのか?しばらく見守りつつ、なにか貢献できるか考えてみます。

Homebrewで古いバージョンのパッケージを削除するには

brew cleanup [formula]

brew-cleanupでCellarに眠った古いパッケージのお掃除ができます。
formula名を指定すれば、そのパッケージの古いバージョンのみを削除。

HomebrewのサブコマンドはRubygemsと共通なものが多いんですね。もともとそっちを使っていればサブコマンドに迷わず、難なく使えるのでしょう。
便利なものはどんどん使って楽をしたいですね。

brew-info が役立つ希有な例

Homebrewにはinfoサブコマンドがあるのですが、パッケージのバージョンやコマンドのパスを確認できる程度の認識でした。ですが、パッケージによってはもっと役立つ情報が記載されていたりもします。

gitにはサブコマンドを補完するシェルが付属します。プロンプトにgitブランチの状態を表示してくれたりします。最近のバージョンではZshにも対応してたり。
そのあたりの設定がid:ruedapさんのエントリで紹介されています。

まずはgit-completion.bashをインストールする。デフォルトで入ってるかもしれないと前述の記事では書かれていたけど、自分の環境(スノーレパードにHomebrewでGitをインストールした状態)では入ってなかった。

http://d.hatena.ne.jp/ruedap/20110706/mac_terminal_git_branch_name

id:ruedapさんには既にお伝えしたのですが、それが入ってるんですよ。

brew infoコマンドで確認してみましょう。

/usr/local/etc/bash_completion.d にあるって表示してくれます。
これがわかれば、ホームディレクトリからシンボリックリンクなり、rcファイルで指定するsourceをそっちにするなり。

ちなみにプロンプトなんですが、ZshではカレントディレクトリなんかはRPROMPTに表示してます。
Bashのときは、環境によりますが長くなる場合は2行にしちゃってますね。

ちょっと差がつくhomebrewのあまり知られていない使い方

環境構築erの皆様、ごきげんよう。今日も今日とて、大掃除してたはずがでてきたマンガ読了してたかのごとく、コード書くはずがrcファイル書いたりプラグイン試したりして一日が終わったりしていますか?
ふとhomebrewをupdateしたら新しいサブコマンドが2つほど*1入りました。その使い方を調べていたら、それとは別にhomebrewの便利コマンドを知ったのでご紹介。

準備

まずはhomebrewを最新にしましょう。

$ brew update

# バージョン確認
$ brew -v
0.8

2011年3月12日にバージョン0.8がリリースされた*2ようですね。

更新のあるformulaを調べる

$ brew outdated
git (1.7.3.2, 1.7.4.1 < 1.7.4.4)
mongodb (1.6.5-x86_64 < 1.8.1-x86_64)
readline (6.1 < 6.2.1)

サブコマンド outdated で最新でないfomulaを表示してくれます。

一気に更新してしまえ

brew install `brew outdated` (or brew outdated | xargs brew install (or brew upgrade))

The brew command · mxcl/homebrew Wiki · GitHub

最初の2つは単純に outdatedの実行結果をinstallコマンドに渡すだけですね。なんとなくxargs使ったほうが洗練されてる気がします。
そして、upgrade なるサブコマンドもあるのですね。manにもhelpにも書いてませんでした。知らなかった。せっかくなんで試してみましょう。

$ brew upgrade
==> Downloading http://kernel.org/pub/software/scm/git/git-1.7.4.4.tar.bz2
######################################################################## 100.0%
# 略
==> Summary
/usr/local/Cellar/git/1.7.4.4: 1054 files, 19M, built in 2.1 minutes

==> Downloading http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-1.8.1.tgz
######################################################################## 100.0%
# 略
==> Summary
/usr/local/Cellar/mongodb/1.8.1-x86_64: 16 files, 93M, built in 2 seconds

==> Downloading ftp://ftp.cwru.edu/pub/bash/readline-6.2.tar.gz
######################################################################## 100.0%
# 略
==> Summary
/usr/local/Cellar/readline/6.2.1: 32 files, 1.9M, built in 38 seconds

はい、outdatedで表示されていたgit、mongodb、readlineとも最新になりました。helpには書いてないupgradeサブコマンド便利ですねー
というか、なんでhelpに書いてないの?outdatedは書いてるのに。helpの出力するところを修正すれば取り込んでもらえるのかな、名前残せるのかなとか甘い考えを持ったのですが、100近いPullRequestがたまってるようなので単に作業が追いついていないだけですかね。

brewコマンドの補完

homebrewにはzshコマンド補完設定ファイルが含まれています。

% ls /usr/local/Library/Contributions/
brew_bash_completion.sh   brew_fish_completion.fish brew_zsh_completion.zsh   examples                  manpages

普通にインストールしたなら上記ディレクトリあたりにあるはず。zshの場合、上記brew_zsh_completion.zsh を読み込ませてやればhomebrewのサブコマンドの補完が有効になります。
zsh設定ファイルにfpathを指定してやり、そこにファイルを置いて読み込ませるのが一般的なようです。ただ、このファイル自身が更新される可能性もあるので、シンボリックリンクをはるのがいいかもしれません。

% cat ~/.zshrc | grep fpath
fpath=(~/.zsh/functions/ $fpath)
% ln -s /usr/local/Library/Contributions/brew_zsh_completion.zsh ~/.zsh/functions/_brew
# ファイル名を_brewとしてやらないと動いてくれません。

bashの場合、.bashrcあたりに読み込み設定を書けばいいようです。brew_bash_completion.sh に書いてるので、そちらを参照のほど。

まとめ的な

Homebrew便利です。ちょっと前まではMacPorts全盛でしたが、もうすっかりbrewさまさまです。/usr/local/ 以下に全て入るというのも精神衛生上いいですよね。
こちらのエントリでとりあげたPowのインストール手順もなぜかMacPortsをアンインストールしてHomebrewをインストールするところからはじまっています。さあbrewをはじめよう。

参考

FFTT : Homebrew のご紹介
基本的な使い方が網羅されています。
Homebrew — MacPorts driving you to drink? Try Homebrew!
実は brew home とか叩くとひらきます。

*1:missingとbottle

*2:https://github.com/mxcl/homebrew/wiki/Homebrew-0.8