人柱週間

http://gentoo-wiki.com/HOWTO_Hashstyleを参照しながらHashstyle導入。手順はhttp://memo.officebrook.net/20070414.htmlの通り。ついでにGCCも4.2.0にした。
で、全パッケージを-Wl,--hash-style=bothを有効にしてコンパイルしなおそうという段になってせっかくだからパッケージマネージャもPaludis, the Other Package Manglerに乗り換えようとか魔が差した。
移行そのものはhttp://gentoo-wiki.com/HOWTO_Use_Portage_alternative_-_Paludishttp://paludis.pioto.org/migration.htmlを読めば問題なし。マニュアルを読んで

emerge -e world

とほぼ等価なコマンドは

paludis -i --dl-reinstall always world

だと分かったので早速実行。
ところが、何個目かのパッケージで早速止まる。PaludisではPortageで普通実行されないsrc_test(未定義の場合はmake check、make test)がデフォルトで実行される。場合によっては問題なく動く場合でもsrc_testが失敗することがあるのでFAQのPackages Failing src_testにあるようにSKIP_FUNCTIONS=testとすることでスキップする必要がある。
このsrc_testの問題、入れるパッケージが数個なら良いとしてもシステム全体のリビルドの場合はいちいち停止するので非常に面倒。emergeの--resume --skipfirstのように、自動的にエラーの出るパッケージを飛ばすというような手段はpaludisには用意されてない。*1
paludis -iの失敗時に標準エラーに出力されるResumeコマンドを

paludis --resume-command-template /tmp/restemp -i world

と言う風に使うことでファイルに出力出来るようなので、src_testが失敗するパッケージではSKIP_FUNCTIONS=testをセットし、それ以外の要因で失敗するパッケージはResumeファイルのリストから外せば良い。
src_testが失敗したかどうかの判定に/usr/share/paludis/hooks/ebuild_test_failが使えるに違いない、と思ったものの何故か中に入れた実行可能な*.bashファイルが実行されなかった。
仕方ないので/etc/paludis/bashrcに

if grep -q "^${CATEGORY}/${PF}" /etc/paludis/package_untest.conf; then
		export SKIP_FUNCTIONS=test
fi

を加え、

#!/bin/sh
PALUDIS_LOG="/var/log/paludis.log"
UNTEST_FILE="/etc/paludis/package_untest.conf"
RESUME_COMMAND="/tmp/restemp-$$"
find_failpkg() {
	awk 'END{print $6}' "${PALUDIS_LOG}"
}
if [ $# -eq 1 ] && [ -f "$1" ]; then
	RESUME_COMMAND="$1"
	sh "${RESUME_COMMAND}"
else
	paludis "$@" --resume-command-template "${RESUME_COMMAND}" && exit
fi

FAILPKG=$(find_failpkg)
echo ${FAILPKG%::*} >> "$UNTEST_FILE"

until sh "${RESUME_COMMAND}"
do
	if [ "x$FAILPKG" = "x$(find_failpkg)" ]; then
		sed -i '\!'"${FAILPKG%::*}"'$!d' "${UNTEST_FILE}"
		sed -i "s!'=${FAILPKG}'!!" "${RESUME_COMMAND}"
		echo "$(date '+%F %T'): ** ${FAILPKG} ** skipped" >> /tmp/paludis-resume.log
	else
		FAILPKG=$(find_failpkg)
		echo "${FAILPKG%::*}" >> "$UNTEST_FILE"
	fi
done

という汚いスクリプトと組み合わせることでシステムのリビルド完了。890のパッケージを45時間かけてreinstallしたうちsrc_testに失敗したものが

$ cat /etc/paludis/package_untest.conf | sort
app-text/a2ps-4.13c-r5
app-text/gnome-doc-utils-0.8.0
dev-lang/mono-1.2.4
dev-libs/libpcre-7.0
dev-libs/openssl-0.9.8e
dev-perl/IO-Socket-SSL-1.06
dev-perl/PortageXS-0.02.07
dev-python/gnome-python-extras-2.14.2
dev-scheme/guile-1.8.1-r3
gnome-base/gnome-vfs-2.16.3-r1
gnome-base/libbonoboui-2.16.0
gnome-base/libgnomecanvas-2.14.0
gnome-extra/libgda-1.2.4
media-libs/gst-plugins-good-0.10.5
media-libs/gstreamer-0.10.12
net-libs/gnet-2.0.7
sci-visualization/gnuplot-4.2_rc4
sys-apps/coreutils-6.9-r1
sys-apps/hal-0.5.9-r1
sys-devel/automake-1.5
sys-devel/automake-1.7.9-r1
sys-devel/automake-1.8.5-r3
sys-devel/prelink-20061201
sys-fs/e2fsprogs-1.40_pre20070411
x11-libs/gtk+-2.10.12
x11-misc/beryl-manager-0.2.1
x11-wm/beryl-core-0.2.1
x11-wm/emerald-0.2.1
xfce-extra/thunar-volman-0.1.3_pre20070523

の29パッケージという結果に。システムに不可欠なものでもまともに通らないものが多いのはどうしたものか。あと、8GBのアーカイブを作り出すtarとか、他の作業が不可能なほどに負荷がかけられるものが結構あるのはこれから毎回src_testが呼ばれるとすると結構問題かも。