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
に書くほかない。