Ccache は compiler cache で 2 回目以降のコンパイルを高速に終了させることができるようです。Linux kernel のカスタムビルドで効果ができそうです。
まずはインストール
Ccache を使うためにはインストールする必要があります。apt install ccache で OK です。
LMDE 6 というか Debian 12 には 4.7.5 が用意されていました。現時点の最新バージョンは 4.11.3 のようです。
Ccache — a fast C/C++ compiler cache
インストールが完了していれば、以下のコマンドでキャッシュの使用状況を確認できます。何度か使ったあとの結果ですが、インストール直後であればほとんどの項目がゼロのはずです。
$ ccache -s Cacheable calls: 63527 / 76809 (82.71%) Hits: 20086 / 63527 (31.62%) Direct: 961 / 20086 ( 4.78%) Preprocessed: 19125 / 20086 (95.22%) Misses: 43441 / 63527 (68.38%) Uncacheable calls: 13282 / 76809 (17.29%) Local storage: Cache size (GB): 1.15 / 5.00 (23.09%)
試してみた
初回のコンパイルはキャッシュ情報を生成するので通常よりも遅くなるそうです。まあそうでしょうね。
time KCPPFLAGS="-O3 -march=native -pipe" make -j 6 LLVM=1 CC="ccache clang" bindeb-pkg LOCALVERSION=-zen3
公式サイトの実例では 3% 増くらいのようでした。他にも試した人の結果では 5% 増ということでお気軽に試してみたのですが、ワタシの場合は 50 分くらいが 60 分超と 20% 増くらいでビックリしました。
そんなタイミングで都合でよく新しい Linux kernel のソースが配信されたので Ccache を使った 2 回目のコンパイルに挑戦してみました。
が、全然ビルドが終わりません・・・。
キャッシュにヒットするようにあえて 1 回目と同じディレクトリー名にしたんですが。
結局、1 回目と同じくらいのビルド時間となり、ccache -s でキャッシュのヒット率を確認してみるとなんと 1.8% という結果でした。
これはもしや、ファイルの更新日で変更があったかどうかを検知しているのでは?
もう一度試してみた
これまた偶然に同じバージョンの Linux kernel の config を変更して再コンパイルしたいシーンがやってきたので、再び Ccache を使って再コンパイルしてみました。
が、5 分とか 10 分経ってもビルドが終わりません。30 分ほど経過した時点でビルドを中断してしまいました。その時の統計情報が冒頭の結果なのですが統計情報をリセットせずに実行したのでヒット率は 31% と表示されていますが、実際はこれの 2 倍くらいなのではないかと思われます。
Linux kernel のコンパイルには Ccache は向いていないんでしょうかね。
Ccache の設定値をダンプするコマンドがあったので試してみました。compiler_check = mtime なのでやはりファイルの更新日が違っているとキャッシュが使えないと判断しているようです。compiler_check = content が良さそうです。
あとは direct_mode = true、depnd_mode = false なので direct mode で動作しているようです。これも depend mode にすると改善できそうです。
$ ccache -p (default) absolute_paths_in_stderr = false (default) base_dir = (default) cache_dir = /home/xxxxxxxx/.cache/ccache (default) compiler = (default) compiler_check = mtime (default) compiler_type = auto (default) compression = true (default) compression_level = 0 (default) cpp_extension = (default) debug = false (default) debug_dir = (default) depend_mode = false (default) direct_mode = true (default) disable = false (default) extra_files_to_hash = (default) file_clone = false (default) hard_link = false (default) hash_dir = true (default) ignore_headers_in_manifest = (default) ignore_options = (default) inode_cache = false (default) keep_comments_cpp = false (default) limit_multiple = 0.8 (default) log_file = (default) max_files = 0 (default) max_size = 5.0G (default) msvc_dep_prefix = Note: including file: (default) namespace = (default) path = (default) pch_external_checksum = false (default) prefix_command = (default) prefix_command_cpp = (default) read_only = false (default) read_only_direct = false (default) recache = false (default) remote_only = false (default) remote_storage = (default) reshare = false (default) run_second_cpp = true (default) sloppiness = (default) stats = true (default) stats_log = (default) temporary_dir = /run/user/1000/ccache-tmp (default) umask =
なんかあまりにも大失敗だったので意気消沈してしまい Ccache の設定変更はまだ試しておりませんが、次の機会にでも試してみますかね。