Gentoo で Ruby 1.9 を入れるに当たって、Ruby 自体は hardmask 外すことで簡単に入って最近まで普通に使ってたんだけど、最近になって dev-ruby/rubygems の ruby19 が何故か入らず gem19 がないため Ruby 1.9 が動かなくなったという現象と戦った際の記録。未完。教えて頂いたので最後に追記しました。
問題
RUBY_TARGETS とやらを指定すればいいというのはどこぞで聞いたので、make.conf に
RUBY_TARGETS="ruby18 ruby19"
と書いてたわけなんだけど…。
# emerge rubygems -pv [ebuild R ] dev-ruby/rubygems-1.3.7-r1 USE="doc -server" RUBY_TARGETS="ruby18 -jruby -ree18 (-ruby19)" 0 kB
あれ、(-ruby19) ?
これのせいで eselect ruby list でも (with Rubygems) が付かず、ruby19 が動かない状況に。いや、unset RUBYOPT すれば一応動きはする*1けど。gem が使えないのはあんまりすぎる。
(-ruby19) って何?
() が付いている場合の意味を知らなかったというか以前調べた気もするんだけど完全に記憶から欠落していたので再度調べ直した。emerge の man に書いてあった。
(-selinux)のように、丸括弧に囲まれた USE フラグは、現在のシステ
ムプロファイルでは常に無効にされ、使うことはできないフラグである
ことを示している。
え、常に無効…? どういうことだよ。
USE_EXPAND について
ところで RUBY_TARGETS ってのをサラリと使ってるけどこれは何? ってことで一応調べた。
調査によると USE_EXPAND というものがあって、 LINGUAS とか APACHE2_MODULES とか RUBY_TARGETS なんかがこれに当たるらしい。
これは設定すると USE フラグに展開される。例えば、
RUBY_TARGETS="ruby18 ruby19"
は
USE="ruby_targets_ruby18 ruby_targets_ruby19"
になる。つまり結局は USE フラグ。
/usr/portage/profiles/base/make.defaults にある USE_EXPAND="..." が USE_EXPAND として扱われる変数のリストかなーと思われる。
profile を調べる
以降、/usr/portage/profiles 以下を grep して怪しいファイルを探す。
/usr/portage/profiles/base/use.mask を覗くと、
とずらずらと書かれている。どうやらここで USE フラグのマスクをしているっぽい。試しに ruby_targets_ruby19 をコメントアウトしてみると、
# emerge rubygems -pv [ebuild R ] dev-ruby/rubygems-1.3.7-r1 USE="doc -server" RUBY_TARGETS="ruby18 ruby19* -jruby -ree18" 0 kB
おおー確かに mask 外れた!
…とは言えこのファイルを弄るわけにはいかないので、とりあえずコメントアウト戻してユーザ側で unmask する方法を探すことに。そもそも可能なんだろうか。
unmask する方法
そもそも base.mask では ruby_targets_jruby なんかも mask されてるのに最終的には mask されてない。つまりどこかで unmask してるはず。
で、探してみたら /usr/portage/profiles/arch/x86/use.mask に以下の記述を発見。*2
# 2010/05/03 - Alex Legler
# Add support for Ruby Enterprise Edition targets where rubyee is available
- ruby_targets_ree18
# 2010/01/08 - Diego E. Pettenò
# Add support for JRuby targets where jruby is available
ふむふむこうすると unmask になると。
ただ、grep で調べたところ ruby_targets_ruby19 を unmask している profile はなさそう。と言うことはやっぱり手動で unmask しないと使えないってことだな…。
とは言ったものの
profile のディレクトリには package.use なんかもあったので /etc/portage/use.mask とか置けばいいなかなぁと思って試してみたけどダメだった。まあよく考えたら arch 依存で mask されてたりする USE フラグもあるので、簡単に unmask できちゃマズい気もする。man にも「常に無効にされ」と書いてあるし、ユーザ側で unmask する方法はもしかしてないのだろうか。
あと残る方法で私の知る範囲で思い付くのは profile 適当に作って /etc/make.profile をそこに向けるくらい。でもそれは面倒だなぁ。というかそもそも正しいアプローチなのか不明。
と言うわけで未解決
わからないのは、割と最近になって急に使えなくなったということ。多分 ruby:1.9 が app-admin/eselect-ruby-20100402 を要求するようになった辺りから。でも各 profile の ChangeLog を見た限りでは ruby_targets_ruby19 は最近は変更されてないんだよね。何が原因なんだろう…。
あ、もしかして、ruby_targets_ruby19 が mask されたのがログによると 2009/12/14 なんだけど、それ以前にインストールしてて最近まで関連パッケージ更新されてなかったから使えてたとかかな。ありうるな。
そもそもネット漁ってもこの問題で困ってる人が見当らなかったんだけど、これ私だけなんだろうか。
と書いてて今こんな記事見つけたけど、profile 上書きしちゃってるなぁ。本当にこれでいいの? Gentoo むずい。