きりかノート 3冊め

おあそびプログラミング

port select rubyを導入した!

長い戦いだった、、(と言っても実作業は3日くらい)

   % sudo port select ruby ruby19

(2013-04-23追記 コマンドがまちがってたので直しました…)

とかすると、${prefix}/bin/ruby がport:ruby19のものになるよ。pythonとかphpとかclangとかと同じね。

ほんとは年末年始でやっつけてruby-2.0のリリースを待つだけにするつもりだったんだけど、まあ思うようにはいかないよねえ。

概要

作業場の https://github.com/kimuraw/macports-port-select-ruby あたりから。

  • ruby(1.8)とruby19をselectで選んでsuffixなしのコマンドを好きなほうにできるようにする。
  • rubyは"ruby1.8"と、1.9のようにsuffixを持つようになる。
  • rb-fooやrb19-fooからインストールされるコマンドも、衝突しないようsuffixを持つようにする。suffixなしのコマンドは、${prefix}/libexec/ruby${ruby.branch}/以下に置く。suffix無しを使いたい場合はここにPATHを通す。この手法は、perl5関連のportsから拝借した。pythonはframework化してるから参考にならん。
  • ruby186は知らん!

ファイル階層はこんな感じになるよ。

   ${prefix}/bin
       ruby1.8        - port:ruby
       ruby1.9        - port:ruby19
       nanoc3-1.8     - port:rb-nanoc3
       nanoc3-1.9     - port:rb19-nanoc3
   ${prefix}/libexec/
       ruby1.8/nanoc3 - port:rb-nanoc3
       ruby1.9/nanoc3 - port:rb19-nanoc3
   ${prefix}/etc/select/ruby
       base           - port:ruby_select
       none           - port:ruby_select
       ruby18         - port:ruby
       ruby19         - port:ruby19

gemとかライブラリはこれまでと変わらず。

select の仕組み

自分で新しく使ってみたいとかいう人がいるかもしれないし、自分も忘れると思うのでメモとして。

  • ${prefix}/etc/select/[group]/ 以下にファイルをつくる
  • port:[group]_selectがbaseとnoneのselectファイルを提供する。
  • 各portはPortGroup selectを使って、自分のselectファイルを提供する。

基本的にはそんだけ。そのファイルの内容は次の通り。

  • baseに選択したときの${prefix}以下のファイル名を書く
  • それぞれに元々のファイル名を書く。たとえば、baseがbin/rubyでruby18がbin/ruby1.8だと、port select ruby ruby18するとbin/rubyがbin/ruby1.8へのsymlinkとして作成される。
  • "-" は、そのファイルの処理をしない。
  • noneには全行 "-" を書く

rubyの場合はこういうようになっている。

   % paste /opt/local/etc/select/ruby/{base,ruby18,ruby19,none} | expand -30
   bin/erb                       bin/erb1.8                    bin/erb1.9                    -
   bin/gem                       -                             bin/gem1.9                    -
   bin/irb                       bin/irb1.8                    bin/irb1.9                    -
   bin/rake                      -                             bin/rake1.9                   -
   bin/rdoc                      bin/rdoc1.8                   bin/rdoc1.9                   -
   bin/ri                        bin/ri1.8                     bin/ri1.9                     -
   bin/ruby                      bin/ruby1.8                   bin/ruby1.9                   -
   bin/testrb                    bin/testrb1.8                 bin/testrb1.9                 -
   share/man/man1/erb.1.gz       -                             share/man/man1/erb1.9.1.gz    -
   share/man/man1/irb.1.gz       -                             share/man/man1/irb1.9.1.gz    -
   share/man/man1/rake.1.gz      -                             share/man/man1/rake1.9.1.gz   -
   share/man/man1/ri.1.gz        -                             share/man/man1/ri1.9.1.gz     -
   share/man/man1/ruby.1.gz      share/man/man1/ruby1.8.1.gz   share/man/man1/ruby1.9.1.gz   -

group/ruby-1.0.tcl (PortGroup ruby)の変更

まあ外部仕様というか、外から見える側についてだけ書いとこう。ファイルにコメント書いたからそっから抜きだし。

   # Usage:
   #
   #   1. use ruby.setup
   #
   #     PortGroup        ruby 1.0
   #     ruby.setup       module version type {} ruby19
   #
   #   2. use ruby.branch
   #
   #     PortGroup        ruby 1.0
   #     ruby.branch      1.9
   #     depends_lib      port:ruby${ruby.suffix}
   #     build.cmd        ${ruby.bin}

使い方は上記の2通り。今までとあんまし変わってないけど、2.の"ruby.branch"が新しい機能。これを指定すると${ruby.bin}はじめ、いろんな値が指定したバージョン向けに構成されて利用できるようになる。macports中のoption_procという仕組みを使ってる。

で値についてはこんな。

   # options:
   #   ruby.branch: select ruby version. 1.8, 1.9 or 2.0.
   #   ruby.link_binaries: whether generate suffixed symlink under ${prefix}/bin
   #        or not.
   # values:
   #   ruby.bin, ruby.rdoc, ruby.gem: fullpath to commands for ${ruby.branch}.
   #   ruby.suffix: suffix of portname. port:ruby${ruby.suffix} or
   #        port:rb${ruby.suffix}-foo.
   #   ruby.bindir: install location of commands without suffix from rb-foo.
   #   ruby.gemdir: install location of rubygems.
   #        such as "${prefix}/lib/ruby1.9/gems/1.9.1".
   #   ruby.link_binaries_suffix: suffix of commands from rb-foo under
   #        ${prefix}/bin. such as "-1.8" or "-1.9".
   #   (obsoleted values)
   #   ruby.prog_suffix: use ruby.branch.
   #   ruby.version: use ruby.api_version.
   # values from ruby.setup:
   #   ruby.module: port name without prefix. rb-${ruby.module}.
   #   ruby.project: project name at rubygems, rubyforge or sourceforge.

今までとのちがいを簡単に説明。

  • 追加:
    • ${ruby.bindir} - libexec以下のコマンド入れる場所。
    • ${ruby.gemdir} - gemを入れる場所。
  • 廃止予定:
    • ${ruby.prog_suffix} - gemdirがあればいらないはず。
    • ${ruby.version} - api_versionに改称。librubyのバージョンなので1.9.3の${ruby.version}が1.9.1だったりする。これってどうかなあと思うので。

廃止予定のものはとりあえずruby/下にあるやつは、ひととおり新しい値を使って書き換えておいた

各rb-, rb19-のインストール確認

上記のように構成を変更したので、そのあたりをPortGroup rubyで吸収してやる。だけど、完全かどうかはわからないので、ruby/以下の全port(369)をdestrootして結果を確認した。それらのうち、エラーになったもの(94)を。

  • port logでログを確認
  • 内容を修正、依存portをインストール
  • port -ns destrootでdestrootされたファイルのパスを確認

といった手順で処理した。結果のメモをそのまま貼っとく。

   - rb-activeldap: rb-ldapがインストールできないのが原因。
   - rb-bee: portgroupのバグ。gemのパスがおかしい。ruby.gemdirを導入。
   - rb-capistrano: rb-jsoin_pureがない。
   - rb-cmdparse: setup.rbに--bindirがない。portgroupを直した。
   ! rb-cocoa: 別の問題。あとで。
   - rb-csbattery: setup.rb --bindir
   - rb-cstemplate: setup.rb --bindir
   - rb-cucumber: json_pure
   X rb-dbdbd: 取得できない。
   - rb-dbi: setup.rb --bindir
   X rb-devel-logger: 取得できない。
   - rb-easyjour: ruby.prog_suffix
   - rb-echoe: なおってた。
   X rb-entrycache: 取得できない。
   v rb-ferret: コンパイルエラー。バージョン上げて解決。
   ! rb-flexmock: destrootエラー。ほっとく。
   v rb-gettext: reinplace, ${ruby.bindir}使う。
   X rb-gsl: コンパイルエラー。バージョン上げても直んなかった。
   - rb-heroku: なおってた。
   - rb-hoe: なおってた。
   X rb-hyperestraier: コンパイルできない。
   X rb-ifconfig: 取得できない。
   - rb-image_science: json_pure
   - rb-innate: なおってた。
   ! rb-jabber4r: インストールエラー。gemにすれば直るけどメンドウなのでいいや。
   v rb-json_pure: binの場所が変わった。
   v rb-ldap: コンパイルエラー。パッチ追加。
   ! rb-libglade2: あとで
   ! rb-libgnome: あとで
   v rb-mindi: 取得できない。->新しいバージョンのはあった。
   X rb-musicbrainz: なんかめんどくさい。
   - rb-mustache: なおってた。
   v rb-ncurses-ruby: r103929で直した。無理やりgemぽくしてたのをruby.setup extconf.rbに。
   - rb-nitpick: json_pure
   - rb-notificationcenter: setup.rb --bindir
   v rb-observable: 取得できない。->新しいバージョンのはあった。
   - rb-parsetree: 直ってた。
   v rb-pluginfactory: 取得できない。->新しいバージョンのはあった。
   - rb-polyglot: なおってた。
   - rb-ramaze: なおってた。
   X rb-rbot: gem installでエラー。たぶん古いgettextが必要。
   X rb-ripper: bison通ってないぽい。無理。
   X rb-rjab-connection: インストールできない。
   - rb-rr0: setup.rb --bindir
   - rb-rttool: なおってた。
   X rb-rubycon: ビルドエラー。さっぱりわからん。
   - rb-rubyforge: なおってた。
   - rb-rubyinline: なおってた。
   ! rb-rubyosa: コンパイルが通らない。
   - rb-rubytoc: json_pure
   v rb-runt: extract.suffixがおかしい。ついでにバージョンあげた。
   X rb-sds: 取得できない。
   - rb-sqlite3: setup.rb --bindir
   - rb-tapkit: setup.rb --bindir
   - rb-technorati-ruby: 直ってた。
   v rb-text-format: 取得できない。RAAから新しいサイトを調べて修正。
   - rb-treetop: 直ってた。
   - rb-twitter: json_pure
   v rb-webgen: reinplace, ${ruby.bindir}使う。
   - rb19-actionmailer: 直ってた。
   - rb19-actionpack: 直ってた。
   - rb19-bcat: 直ってた。
   - rb19-bundler: 直ってた。
   - rb19-capybara: 直ってた。
   - rb19-cheat: ruby.prog_suffix
   X rb19-churn: rb19-mainを先に直すこと。
   - rb19-cucumber: 直ってた。
   - rb19-cucumber-rails: 直ってた。
   - rb19-culerity: 直ってた。
   - rb19-debug: rb19-debug-base
   v rb19-debug-base: コンパイルエラー。0.11.25に上げた。
   - rb19-factory_girl: 直ってた。
   - rb19-guard: 直ってた。
   - rb19-guard-livereload: 直ってた。
   - rb19-hassle: rb19-hamlがrb-hamlとconflictしてる。(Done: group変更後にconflictを消す)
   - rb19-heroku: 直ってた。
   v rb19-hirb: ChangeLog -> CHANGELOG HFSX上では失敗する。
   v rb19-json: コンパイルエラー。1.5.3に上げる。
   v rb19-linecache: mkmfが失敗してる。バージョン0.5.12にあげたら直った。
   X rb19-main: depsのrb19-fattrがmacportsにない!(Todo:あとでrb19-fattrを追加する)
   - rb19-mechanize: nokogiri
   X rb19-metric_fu: rb19-mainを先に直すこと。
   - rb19-mustache: ruby.prog_suffix
   - rb19-rack-mount: 直ってた。
   - rb19-rack-test: 直ってた。
   - rb19-rails: 直ってた。
   - rb19-railties: 直ってた。
   - rb19-rdiscount: ruby.prog_suffix
   - rb19-selenium-webdriver: json
   - rb19-taps: json
   - rb19-thin: 直ってた。
   - rb19-unicorn: ruby.prog_suffix
   - rb19-wirble: ruby.prog_suffix
   - rb19-yahoo_weatherman: nokogiri

ほんとさー、古いのがいっぱいあるのですよ。

今後の課題

  • subportの導入

rubyをruby18に改称して、rubyはmeta portにする。rb-fooでbranches使っていっぺんに複数のport書けるようにしたりとか。

正直それほどメリットが自分的にはないので、あんま気が進まないけんだけれど、ほっとくとruby/下のportsが今まで以上の荒れ地になりそうなので、手を入れやすくしとく必要はあるんじゃないかなあと。