パッケージのリビルドって自動でしてほしいよね

revdep-rebuildとか@preserved-rebuildを使っているとそう思ったことがあるのじゃあないかと思う。 perl更新したら、perl-cleanerだとかpythonだったらpython-updaterだとかghcだったらhaskell-updaterだとかとか、とかくラライブラリにせよ言語にせよアップデートでリビルドしてリンクを作りなおさないといけないものは多い。

こういうのを自動化できたらいいよね? というのが最近 gentoo-devl MLでも議論されていて、そのサンプルの実装ができている。

Automatic rebuilds with experimental EAPI 4-slot-abi – Zac Medico での例をそのまま紹介しましょう。

たとえば、dev-libs/icuを更新すると、

$ emerge -pu dev-libs/icu

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild U ] dev-libs/icu-49 [4.8]
[ebuild R ] dev-libs/libxml2-2.7.8

このように、dev-libs/icuのライブラリにリンクしていたパッケージがemergeだけでリビルドされるようになります。いままでだったら revdep-rebuildやemerge @preserved-rebuildが必要だったケースです。

次に、sys-libs/db-4.8を更新すると

$ emerge -pu sys-libs/db

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild NS ] sys-libs/db-4.8 [4.7]
[ebuild R ] app-office/libreoffice-3.5.4.2

同じように libreofficeのリビルドが入ってきます。とはいえ、 sys-libs/dbはSLOT化されていて、新しいSLOTのインストールなので([ebuild NS ]となってますよね?)厳密には、このリビルドは必要ありません。--rebuild-if-new-slot-abi=nやら、--exclude=app-office/libreofficeとしておけば、このリビルドを除外しておくことができます。

最後にdev-libs/glibの更新であれば

$ emerge -pu dev-libs/glib

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild U ] dev-libs/glib-2.32.3 [2.30.2]
[ebuild R ] dev-libs/dbus-glib-0.98

このようにdev-libs/dbus-glibもリビルドされます。このパッケージはrevdep-rebuildでも検出されないことが知られており、packageのメッセージをちゃんと読んで手動でリビルドしなければいけませんでした。

で、こういう変更をサポートするためにebuildの方にも変更が入って、多分次のEAPI=5に入るんじゃないかなーってお話。残りはebuild側の変更について書きます。

ebuildのSLOTは知っている前提で書きます。

いままでは

SLOT="2"

という感じで指定していたけれど

SLOT="2/2.30"

という指定ができるようになる。この"/"より後の部分がsub-SLOTと呼ばれて、ここにABIのバージョンを書く。

そして、dev-libs/glibを使うパッケージはDEPEND, RDEPENDに "dev-libs/glib:=" なり "dev-libs/glib:2=" と書きます。すると、このパッケージがビルドされた時に "dev-libs/glib:2/2.30=" と依存が書き直されます。と、いうことで、dev-libs/glibが更新されたら、リビルドがかかるというわけですね。

なお、実行時にライブラリを切り替えできて、リビルドが必要ないものには "dev-libs/glib:*"とか "dev-libs/glib:2*" と書いておけば、sub-SLOTが無視されててリビルドがかからないようにすることができます。

いまはemergeだけでなく、revdep-rebuildやらperl-cleanerやらいろいろなコマンドを使わないといけないわけですが、これが全部emergeだけで済むようになったらいいですね。