« 第1回「詳解Objective-C 2.0」読書会は、7/6(日) 浅草で | トップページ | roteをRake 0.8系で使えるように »

2008.07.04

提案: 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をメジャーバージョンだけにする

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

|

« 第1回「詳解Objective-C 2.0」読書会は、7/6(日) 浅草で | トップページ | roteをRake 0.8系で使えるように »