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環境で行なわれ、許可されていないディレクトリへの書き込みがブロックされるためで、以下のいずれかの設定を入れる必要がある。
- そもそもSandboxを使わないようにする
/etc/genkernel.confでSANDBOX="no"を設定
- Sandbox内でもキャッシュディレクトリへの書き込みを許可する
/etc/sandbox.confにSANDBOX_WRITE="/path/to/ccache/cache"を追加
個人的には後者のほうが筋は良いと思う。
ただ、ドキュメントを読む限り/etc/sandbox.d/に設定ファイルを作成しても効きそうなものだが、/etc/sandbox.confに追記しないと想定した挙動にならなかった。
これも裏は取っていない。
genkernel.confの中でCCACHE_DIRをexportする、というのがとても気持ち悪いので考え直した。
その結果、/etc/ccache.confにcache_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に書くほかない。