Gentooの「依存USEフラグ」をお掃除しよう

Gentooってべんりですよね. たとえば, あるパッケージでpython2系のコードはいれとかなくてもいいな〜と思ったら, そのパッケージのUSEフラグからPYTHON_TARGETS=python2_6を落としておけば, python2.6のコードなしでインストールができちゃう.

ところが, 時にはこれがめんどいことになりますね. 新しくパッケージを入れようとしたら, python2しかまだ対応してなくて, おかげで依存するパッケージ群にPYTHON_TARGETS=python2_6を生やしてまわることになったりしますね. まあ--autounmask-write使えば, だいたい勝手に書かれるんですけども.

実際に問題になるのは, このほしかったパッケージがpython3対応した時で. ここでほしかったパッケージからPYTHON_TARGETS=python2_6を落とせるわけですが, 依存するパッケージからPYTHON_TARGETS=python2_6を落とせるかどうか, それは注意深く依存関係をたどっていくか, 実際に落としてビルドを試すまでわからない. こんなふうに依存で入ってきた「USEフラグ」というのは後片付けがとてもめんどい.

これが依存パッケージであれば, emerge --depcleanでいいんだけれど, 「依存USEフラグ」まではきれいにしてくれない. とてもつらい. しかも, それが何段も依存関係を作ったりもする. かなりつらい.

と, いうことで, そういう「依存USEフラグ」がworldパッケージまでちゃんと依存のチェーンがつながっているかを解析するスクリプトをひとつ書きました. 「依存USE」になるのはこういうの:

TARGET_REGEXP = r"^((?:ruby|python)_targets_|python_single_target_|abi_x86_)"

github.com

実行するだけで, こんな感じで消してもよさそうなUSEフラグを出してきます. あとはこれを眺めてお掃除しちゃるといいわけですね.

$ python3 chain-dep-scanner.py|grep ruby22|head
dev-ruby/ruby-clutter:0[ruby_targets_ruby22] is not pulled by any world packages
dev-ruby/ruby-clutter-gstreamer:0[ruby_targets_ruby22] is not pulled by any world packages
dev-ruby/ruby-gtk2:0[ruby_targets_ruby22] is not pulled by any world packages
dev-ruby/ruby-gdk3:0[ruby_targets_ruby22] is not pulled by any world packages
dev-ruby/ruby-vte3:0[ruby_targets_ruby22] is not pulled by any world packages
dev-ruby/ruby-clutter-gdk:0[ruby_targets_ruby22] is not pulled by any world packages
dev-ruby/ruby-clutter-gtk:0[ruby_targets_ruby22] is not pulled by any world packages
dev-ruby/ruby-webkit2-gtk:0[ruby_targets_ruby22] is not pulled by any world packages
dev-ruby/ruby-gnome2:0[ruby_targets_ruby22] is not pulled by any world packages

ただ実行してみるとわかるんですが, 現状あちこち問題はあります.

たとえば, "app-accessibility/espeak:0[abi_x86_64] is not pulled by any world packages"のように, グローバルでオンにしてるようなUSEに関しては出てきてもあんまりうれしくないです. また, PYTHON_TARGETS=python3_6としてるけど, python3.5までしかまだ対応してないよというパッケージも, disableにする余地がないので出てきてほしくないわけですね. 多分pythonだったらこれにしたい〜, rubyはこれにしたい〜という願望を引数に渡して, それが実現できそうなpackageだけリストするモードとかあるといいんでしょうね. そのうち実装します(それかだれかPRでも・・・・)