巨大なプロジェクト(Androidなど)をコンパイルするときに欠かせないccacheというツールがあります。
簡単に説明すると、過去にコンパイルした結果をキャッシュデータとして保存しておき、一致する場合はコンパイルをスキップして、結果をキャッシュデータから引き出してくるツールです。
使い方は大きく分けて2つあって、1つは環境変数やMakefileなどを書き換えてコンパイラの名前を変更する方法です。
例えば今までgcc hoge.cとしていたところをccache gcc hoge.cと書き換えたり、makeとしていた部分をCC='ccache gcc' makeとします。簡単ですが透過性が無いのが欠点で、そこらじゅうのMakefileを変えて回るのは非常に大変だろうことは、容易に想像できるかと思います。
もう1つはコンパイラの起動をフックする方法です。ccacheはシンボリックリンク経由で起動された場合、シンボリックリンクの名前に該当するコンパイラを探して起動する、という動作をします。やることとしては、
例えば /usr/bin/gccのコンパイル結果をキャッシュするなら…、
$ which gcc /usr/bin/gcc $ ln -s /usr/bin/ccache ~/bin/gcc $ export PATH=~/bin:$PATH $ which gcc /home/katsuhiro/bin/gcc
このようにします。またccache -sでどれくらいキャッシュが効いているかを見ることができますので、実際キャッシュ出来ているかどうかを見てみます。
$ echo 'int main;' > a.c $ ccache -s cache directory /home/katsuhiro/.ccache cache hit (direct) 0 cache hit (preprocessed) 0 cache miss 0 files in cache 0 cache size 0 Kbytes max cache size 1.0 Gbytes $ gcc -Wall a.c -c -o a.o a.c:1:5: warning: ‘main’ is usually a function [-Wmain] int main; ^ $ ccache -s cache directory /home/katsuhiro/.ccache cache hit (direct) 0 cache hit (preprocessed) 0 cache miss 1★★キャシュから結果を返せなかった★★ files in cache 3 cache size 12 Kbytes max cache size 1.0 Gbytes $ gcc -Wall a.c -c -o a.o a.c:1:5: warning: ‘main’ is usually a function [-Wmain] int main; ^ $ ccache -s cache directory /home/katsuhiro/.ccache cache hit (direct) 1★★キャシュから結果を返せた★★ cache hit (preprocessed) 0 cache miss 1 files in cache 3 cache size 12 Kbytes max cache size 1.0 Gbytes
きちんと働いてくれていそうです。
で、今日の本題なんですが、会社でccacheが動かないというので相談を受けて見に行ったら、確かにPATHをどう設定しても「コンパイラが見つからない」というエラーが出ていました。
散々悩んで辿り着いた答えはCCACHE_PATH環境変数でした。man ccacheとすると、しっかり説明が載っています。
この名前だけ聞いて、ああ、あれね?とわかる方は、かなりccacheを使い慣れている方だと思います。恥ずかしながら、わたくし全く知りませんでした…。
先の節で説明した2つ目の方法でccacheを起動すると、ccacheはPATHに列挙されたディレクトリからコンパイラを探そうとします。
しかし実はこの挙動はCCACHE_PATHという環境変数により変えることができて、もしCCACHE_PATHという環境変数が定義されていた場合、ccacheはPATHの代わりにCCACHE_PATHに列挙されたディレクトリからコンパイラを探そうとします。
相談されたエラーは間違ってCCACHE_PATHが定義してしまい、さらにCCACHE_PATHで何もないディレクトリを指していたため、ccacheが「コンパイラが無いですねー?」とエラーを出していたのでした。
$ gcc gcc: fatal error: no input files compilation terminated. $ export CCACHE_PATH=/usr $ gcc ccache: FATAL: Could not find compiler "gcc" in PATH★★コンパイラが見つからないと言っている★★ $ unset CCACHE_PATH $ gcc gcc: fatal error: no input files compilation terminated.
わかっていれば、何だ、そんなこと…というレベルの話ですが、意外とハマって苦戦したので、思い出として書き残しておきます。
< | 2015 | > | ||||
<< | < | 06 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | - | - | - | - |
合計:
本日: