88171.net


GentooでCcacheを使う

CPUが貧弱でGentooの日々のメンテがしんどいので、試しにCcacheを使いはじめた。

実利的な面は、それなりに長期間運用してみないとわからない。

Portage

Gentoo WikiのCcacheのページにかなり網羅的な情報が載っていて、ここを参考にすればPortageの設定までカバーできてしまう。

ただしUsing ccache globally is not recommendedらしいので、そこは各自の判断で。

genkernel

Gentoo Wikiのgenkernelのページにさらっと書いてある程度で、情報が少ない。

最終的に /etc/genkernel.conf の設定は、要点だけ抜粋すると以下のようにした。

CCACHE_DIR="/path/to/ccache/cache"; export CCACHE_DIR

KERNEL_CC="/usr/lib/ccache/bin/gcc"
UTILS_CC="/usr/lib/ccache/bin/gcc"
UTILS_CXX="/usr/lib/ccache/bin/g++"

当初は KERNEL_CC="ccache -d /path/to/ccache/cache gcc" といった設定を試してみたものの、Ccacheが Invalid option というエラーを吐いた。 おそらくビルドプロセスのどこかでコマンドライン文字列の扱いに難があるせいだが、深くは追っていない。 とにかく、キャッシュディレクトリのパスを環境変数で渡すしかないので無理矢理exportしている(Bashスクリプトなのでexportできてしまう)。

さらに、これだけではinitramfsのコンパイルの段階で ACCESS VIOLATION という見慣れないエラーが発生する。 これはinitramfsのコンパイルがSandbox環境で行なわれ、許可されていないディレクトリへの書き込みがブロックされるためで、以下のいずれかの設定を入れる必要がある。

個人的には後者のほうが筋は良いと思う。 ただ、ドキュメントを読む限り /etc/sandbox.d/ に設定ファイルを作成しても効きそうなものだが、/etc/sandbox.conf に追記しないと想定した挙動にならなかった。 これも裏は取っていない。


genkernel.conf の中で CCACHE_DIR をexportする、というのがとても気持ち悪いので考え直した。 その結果、/etc/ccache.confcache_dir を設定するとグローバルで効くので、genkernel.conf から CCACHE_DIR を排除することができた。

ただし make.conf については CCACHE_DIR のデフォルト値が /var/tmp/ccache で固定されているので、他のディレクトリを使う際は設定が依然として必須。 なかなかうまいこと収まらない。


/etc/sandbox.d/ に設定ファイルを作成しても効きそう

Sandboxは実行時に環境変数を設定することでアクセスルールを追加することができる。 ただしソースコードの setup_access_var() を見るとわかるのだけど、その場合は sandbox.d/ の設定を読まなくなる仕様らしい。 一方で sandbox.conf は常に読まれる。

genkernelは環境変数でアクセスルールを調整するので、結局は前述のとおり sandbox.conf に書くほかない。