EAPIの壁を越えてPortageを更新する
Windows使いとしては、1年以上GentooLinuxを更新せずに放置するとか、やっぱりあるわけです。で久々にうどんワールドしようかなとか思うと、大量のエラーに見舞われるわけです。
まあPortage更新すりゃいいんでしょ。
$ emerge -p1v portage ... !!! All ebuilds that could satisfy "dev-python/pyblake2[python_targets_pypy(-)?,-python_single_target_pypy(-),python_targets_python2_7(-)?,-python_single_target_python2_7(-),python_targets_python3_4(-)?,-python_single_target_python3_4(-),python_targets_python3_5(-)?,-python_single_target_python3_5(-)]" have been masked. !!! One of the following masked packages is required to complete your request: - dev-python/pyblake2-1.1.0::gentoo (masked by: EAPI 6) - dev-python/pyblake2-0.9.3-r1::gentoo (masked by: EAPI 6) The current version of portage supports EAPI '5'. You must upgrade to a newer version of portage before EAPI masked packages can be installed. (dependency required by "sys-apps/portage-2.3.13-r1" [ebuild]) (dependency required by "portage" [argument]) For more information, see the MASKED PACKAGES section in the emerge man page or refer to the Gentoo Handbook.
🙄
sys-apps/portage 自体は EAPI 5 であるものの、その依存パッケージが EAPI 6 だけになってしまったようです。
PortageはROOT環境変数ないし --root オプションを使うことでインストール先の環境を変更することができます。これを使って、正常にPortageが動作する環境、stage3から更新をかけてみます。
chrootまで
まずはインストール時と同様にchrootできる状態にします。
# mkdir /mnt/gentoo # tar xvpf stage3-*.tar.xz -C /mnt/gentoo # mount --rbind /dev /mnt/gentoo/dev # mount --rbind /proc /mnt/gentoo/proc
Portageツリーは更新してしまったのがあるのでそれを、またインストール先である / を適当なディレクトリにbindマウントしておきます。
# mkdir /mnt/gentoo/usr/portage # mount --bind /usr/portage /mnt/gentoo/usr/portage # mkdir /mnt/gentoo/mnt/parent # mount --bind / /mnt/gentoo/mnt/parent
ROOTを指定するとROOTにある /etc/portage/*
が読み込まれますが、これをそのまま使うと依存関係がまたややこしくなるので、stage3のものをベースにします。MAKEOPTSやFEATURESはよしなに。
# mv /etc/portage /etc/portage_ # ln -s /mnt/gentoo/etc/portage /etc/portage
そしてROOTを毎回指定しなくていいように、chrootしたらexportしてしまいます。
# chroot /mnt/gentoo /bin/bash # export ROOT=/mnt/parent
いつものemergeバトル
# emerge -p1u portage ... [blocks B ] <dev-lang/python-3.3.5-r4:3.3 ("<dev-lang/python-3.3.5-r4:3.3" is blocking dev-lang/python-exec-2.4.5) [blocks B ] app-emulation/emul-linux-x86-baselibs ("app-emulation/emul-linux-x86-baselibs" is blocking sys-libs/ncurses-6.0-r1)
手前のは例によって dev-lang/python-exec
を足したら消えた、というか最初はこれ出てたはずなんだけど再現できない…。
問題は後者。amd64として構築したGentoo環境では基本的にamd64向けのバイナリしかビルドされないが、バイナリ配布しかないソフトウェアの中にはx86版しかないものがあります。ここでx86版のライブラリも同時にインストールしておこうというのがmultilibプロジェクトで、以前はemul-linux-なんちゃらというパッケージに定番ライブラリのx86バイナリを詰めこんで配布していました。ただこれだと個別のパッケージをユーザー側でどうこうできないしパッチ当ても別になるしで微妙だったので、USEフラグの仕組みでビルド・インストール・依存するABIを選択できるようにしたのがgx86-multilibと呼ばれるものです。
でー…なんかこの環境にはその移行から数年経ってそうなemul-linuxのパッケージが残っていたわけですね。かといってgx86-multilibに乗りかえると該当するパッケージのリビルドが走ってだるい…。
emerge -cpv emul-linux-x86-baselibs
から始めて、emul-linuxパッケージを足していきながら、なにに要求されているのかを確認してみると nvidia-drivers だけでした。どのみちEFIブート周りではまって nouveau を検討していましたし、とりあえず今はXは全く使えなくても問題ないです。emerge -C
で強引に消してしまう手もありますが、穏便に行きましょう。
# INPUT_DEVICES="" VIDEO_CARDS="" emerge -a1u xorg-drivers # emerge -ac emul-linux-x86-{baselibs,db,medialibs,soundlibs,xlibs,opengl} nvidia-drivers
これであとは emerge -a1u portage
して目標達成です。pythonふたつを含む10パッケージほどが更新されました。/etc/portage/
がディレクトリじゃないからリネームしといたよとか言われてますが、まあいいでしょう。後で再mergeするだろうし…。
しかしここからが大変そうだなあ…。