"Multiple package instances"によるemergeの失敗への対処

emerge -uDN するとこのようなエラーが出てすすまないことがある。

!!! Multiple package instances within a single package slot have been pulled
!!! into the dependency graph, resulting in a slot conflict:

dev-libs/icu:0

  (dev-libs/icu-53.1:0/53::gentoo, ebuild scheduled for merge) pulled in by
    >=dev-libs/icu-51.2-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s
390_64(-)?] required by (media-libs/harfbuzz-0.9.35:0/0.9.18::gentoo, ebuild scheduled for merge)



  (dev-libs/icu-52.1:0/52::gentoo, installed) pulled in by
    >=dev-libs/icu-50:0/52= required by (app-text/texlive-core-2014-r1:0/0::gentoo, installed)
                     ^^^^^^

いろいろごちゃごちゃ出てるけど、まず 注目するポイントは"(dev-libs/icu-53.1:0/53::gentoo, ebuild scheduled for merge)" と "(dev-libs/icu-52.1:0/52::gentoo, installed)"の2個所になる。一方が dev-libs/icu-53.1 を要求し、もう一方が dev-libs/icu-52.1.0 が要求しているので emerge を進めることができない、ということになる。

次に重要で問題を解決するために必要なのが、何がそれらの要求を出しているのかということになる。 "required by" に注目しよう。 dev-libs/icu-53.1 は "required by (media-libs/harfbuzz-0.9.35:0/0.9.18::gentoo, ebuild scheduled for merge)" と書かれている。 "ebuild scheduled for merge" から emerge しようとしている media-libs/harfbuzz-0.9.35 によって、 dev-libs/icu-53.1 が要求されていることがわかる。dev-libs/icu-52.1 は "required by (app-text/texlive-core-2014-r1:0/0::gentoo, installed)" とあるから、 インストールされている app-text/texlive-core によって dev-libs/icu-52.1 が要求されていることがわかる。

texlive-core は ">=dev-libs/icu-50:0/52=" という形で、 dev-libs/icu に依存している。 マークが付いている ":0/52=" に注目する。 これは Sub-Slot dependency によるもので、emerge 時に依存するライブラリのバージョンを使ってパッケージの依存関係を書きかえる機能によるもの。すなわち texlive-core が dev-libs/icu-52.1 に対して emerge されたので texlive-core の依存が dev-libs/icu-52.1 に依存するように書き変えられたということになる。

結局、解決手段は texlive-core もビルドすることである。texlive-core がビルド対象になることで、 ">=dev-libs/icu-50:0/52=" の依存が再度書きかえられ、 dev-libs/icu-53.1 に対応したものになる。

texlive-core もビルドするには "--reinstall-atoms" を使う。"emerge -uDN world --reinstall-atoms 'texlive-core'" によって、 "-uDN world" と供に texlive-core がリビルドされる。こういった問題が複数のパッケージで起きる場合には "--reinstall-atoms 'texlive-core ghc'" などのように空白区切りで指定できる。