きりかノート 3冊め

おあそびプログラミング

提案: rubyのarchはシステムのマイナーバージョンを無視したい>MacPorts

rubyの拡張ライブラリは、archdir/sitearchdir/vendorarchdirにインストールされるわけだけど、archにシステムのマイナーバージョンが含まれているために、rubyをインストールしたときのシステムバージョンによって、拡張ライブラリのインストール場所がばらばらになってしまう。

残念なことになっている例。

 % ls /opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin*/
/opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin9.0/:
RMagick.bundle sqlite3_api.bundle

/opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin9.2.2/:
gconf2.bundle gnomevfs.bundle rsvg2.bundle
gnome2.bundle libart2.bundle rubycocoa.bundle
gnomecanvas2.bundle rbart.h uconv.bundle
gnomeprint2.bundle rcovrt.bundle

/opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin9.3.0/:
cairo.bundle rb_cairo.h starruby.bundle

すると、以前にインストールしたのにrequireで失敗したりするわけだが、納得いかないのだよ。そんなんメジャーバージョンだけ使えばいいじゃん、と思うわけ。Apple提供のMac OS X添付のrubyは昔からそんなふうになってる。

 % uname -r
9.4.0
% /usr/bin/ruby -rrbconfig -e 'puts Config::CONFIG["arch"]'
universal-darwin9.0

なので、MacPortsのlang/rubyもそうしちゃおうぜ、という提案をしました

問題点などあれば指摘してください。反対がなければ、日曜くらいにはコミットしちゃうつもり。

2008.07.05(土) 追記:コミットしました

思いのほか賛成が多かったので(みんな早く言えよ!こういうの気にするおれが神経質なんだと思ってたよ)、今日コミットしました(r38064)。日本時間だと17時ごろに次のPortIndex更新が走ると思うので、ユーザの人たちはもうしばしお待ちください。

以下、更新の手順。自分がやった例なので、もちろんみなさん好きなようにしてください。zshで作業してるので、(2)とかは動かないシェルがあるかも。

 # (0) rubyを@1.8.7-p22_3に更新する
% sudo port sync
% sudo port -n upgrade ruby
# (1) MacPortsでインストールした、現在利用中(active)の
# Rubyライブラリっぽいものを抽出
% port installed active | grep rb- | cut -c3- | cut -d\ -f1 | tee rb-ports.txt
rb-actionmailer
rb-actionpack
rb-actionwebservice
rb-activerecord
:
# (2) (1)の結果のうち、拡張ライブラリ(.bundle)を持つportを抜き出し
% (for port in `cat rb-ports.txt`; do port contents ${port} | \
grep -q '\.bundle' && echo ${port}; done) | tee rb-ports-with-bundle.txt
rb-atk
rb-gconf
rb-gdkpixbuf2
rb-glib
:
# (3) (2)のリストについてportを強制再インストール
% sudo port -nf upgrade `cat rb-ports-with-bundle.txt`
:

対象のportのリスト(作業中に作成する.txtファイル)は、必要に応じて編集してください。rb-gnomeとかは、たぶん抜いとかないとメンドウだと思います。

すると、

 % ls /opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin*/
/opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin9/:
RMagick2.bundle* gtk2.bundle* rbgtk.h
atk.bundle* libart2.bundle* rbgutil.h
cairo.bundle* pango.bundle* rbpango.h
gconf2.bundle* rb_cairo.h rbpangoversion.h
gdk_pixbuf2.bundle* rbart.h rcovrt.bundle*
glib2.bundle* rbatk.h rsvg2.bundle*
gnome2.bundle* rbatkversion.h sqlite3_api.bundle*
gnomecanvas2.bundle* rbgcompat.h starruby.bundle*
gnomeprint2.bundle* rbglib.h uconv.bundle*
gnomevfs.bundle* rbgobject.h

になってすっきり。

これで、

  • rubyのno_doc variantを復活させたい
  • archdirをメジャーバージョンだけにする

という、以前からの個人的な要求が解消できた。コミッタになるって素敵。