Gentoo Linuxでうどんワールドする
tl;dr
Gentoo LinuxでPortageを使う際、
# emerge --uDNva @world
をしたときに大量に循環依存やエラーメッセージが出た場合の対処策。
まずはメッセージを読む
$ man emerge
emergeコマンドの説明(できれば英語版のようがよい)を読みながら、出力の意味を理解する。
USEフラグを立てろと言われた場合は、メッセージの通りに設定してもよいですが、私はflaggie
を使って管理しています。
maskしろと言われた場合も同様。
例:app-emulation/dockerでaufsフラグを立てたい場合
$ sudo flaggie app-emulation/docker +aufs
それとnewsを読むと役に立つ情報が手にはいります。
$ eselect news read
循環参照じたいは、メッセージで表示されるパッケージに関わるUSEフラグを適当に-gtkとか-emacsとかしておいてからemergeして片方ずつ入れれば解決することが多いです。
ghcやperlのコンフリクトを解決する
ghcやperlといったプログラミング言語本体のパッケージの更新が関わってくると、バージョンの違いによって依存するライブラリがエラーを吐くことがあります。このときは関連するライブラリは入れずに、まずはghcやperlだけを先に更新し、それからライブラリをツールを使って一括で更新する、ということでエラーメッセージを回避することができます。
@worldからやると関連のライブラリを更新しようとするためにエラーメッセージが出ることがあり、@systemをまず対象とするとエラーメッセージが出ないかもしれません。そうでない場合は個別にghcやperlを選択し、更新をかけましょう。
その後しばしば@preserved-rebuildをしろというメッセージが出るので、実行しましょう。これによってパッケージの更新によって壊れた依存関係を解決してリビルドしてくれます。
emerge -1 @preserved-rebuild
ここで-1
というフラグをつけることで、--oneshot
つまり、ここで指定したパッケージは@world
に含まずに更新することができます。こうすることで、どうでもいいパッケージの更新を追尾せずにすむので、@worldの肥大化を防げます。
その後、perlであればperl-cleaner --all
, pythonであればpython-updator
といったコマンドが用意されているので、その言語固有のパッケージの更新をかけることで、バージョンアップに伴う依存関係の再構築を行うことが可能です。
dispatch-confする
/etc/以下のファイルを、emergeによって推奨する設定に書き換えるとき、それらの作業は手動で行われなければなりません。 古い文献ではetc-updateしろと書いてある場合がありますが、dispatch-confのほうが良さそうです。
dispatch-conf の使い方 - WebOS Goodies
あとは最後に、不要となったパッケージを整理するだけです。
$ emerge --depclean