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.
今までとのちがいを簡単に説明。
- 追加:
- 廃止予定:
各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
ほんとさー、古いのがいっぱいあるのですよ。