うならぼ

申し訳程度のアフィリエイトとか広告とか解析とかは/aboutを参照

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するだろうし…。

しかしここからが大変そうだなあ…。