皆さん、こんにちは。先日の社内勉強会でビルドの遅さに悩まされ、スムーズに進行できませんでした。その対策ついでに備忘録として共有したいと思います。
問題:ESP32開発における長いコンパイル時間
ESP32をArduino IDEで開発すると、AVRマイコンと比較して著しく長いコンパイル時間に悩まされることがあります。主な理由は二つです:
- ESP32の複雑性: AVRに比べて機能が豊富なため、本質的にコンパイルに時間がかかります。
- フルビルドの問題: Arduino IDEは小さな変更でもフルビルドを行うため、長いプログラムでは1分以上かかることも珍しくありません。
解決策:ccacheの導入
ccacheは、C/C++用のコンパイル高速化ツールです。その仕組みは以下の通りです:
- キャッシング: コンパイル時に生成されたファイルをキャッシュします。
- 再利用: 2回目以降のコンパイルでは、変更のない部分をキャッシュから再利用します。
- 初回のオーバーヘッド: 初回コンパイル時はすべてのファイルをキャッシュするため、若干時間がかかります。
- 以降のビルド: 2回目以降は劇的に高速化され、フルビルドの必要性が大幅に減少します。
Arduino IDEでccacheを活用するための課題
Arduino IDEには、ccacheの効果を最大限に発揮させるための障壁があります:
- ランダムフォルダ生成: スケッチのコンパイル時、ランダムな名前のフォルダにオブジェクトファイルが生成されます。
- コマンド実行: 生成されたランダムフォルダに対してコマンドが実行されます。
この仕様のため、ccacheが効果的に機能しにくい状況にあります。
解決策:出力先の固定
ccacheを効果的に利用するためには、Arduino IDEの出力先を固定する必要があります。これにより:
- ccacheが一貫して同じ場所のファイルを参照できるようになります。
- キャッシュの再利用率が大幅に向上し、ビルド時間の短縮につながります。
以下のセクションでは、具体的な設定方法を詳しく説明します。これらの設定を行うことで、ESP32開発のワークフローが大幅に改善され、開発効率が飛躍的に向上することが期待できます。
1. ビルドパスの指定
まず、Arduinoのプリファレンスファイルを編集します。これにより、ビルド成果物の保存場所を明示的に指定できます。高速化とは関係ないのでスキップして頂いてもOKです。
buildディレクトリの作成
- Arduino IDEのインストールディレクトリを開きます(通常は
C:\Program Files (x86)\Arduino
やC:\Program Files\Arduino
)。 arduino.exe
が存在するディレクトリ内に、新しくbuild
というフォルダを作成します。
preferences.txtの編集
Arduino IDEの設定ファイル preferences.txt
を開き、ファイルの最終行に以下を追加します:
build.path=build
この設定により、ビルド結果が先ほど作成した build
ディレクトリに整理して保存されるようになります。
2. ccacheの導入
コンパイル結果をキャッシュするccacheを使用すると、再コンパイル時間を劇的に短縮できます。
ccacheのダウンロードとセットアップ
- ccacheの公式ダウンロードページにアクセスします。
- Windows用のバイナリ
ccache-4.10.1-windows-x86_64.zip
をダウンロードします。 - ダウンロードしたZIPファイルを解凍します。
- Arduino 1.8.19では解凍したフォルダ内の
ccache.exe
を見つけ、これをarduino.exe
と同じディレクトリにコピーします。 - Arduino 2.3.2では
arduino-cli.exe
などが保存されている\resources\app\lib\backend\resources
内にccache.exe
をコピーしてください。
platform.txtの編集
コンパイル時にccacheを使用するよう、%USERPROFILE%\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\2.1.1\libraries\SD
などに配置されいてるplatform.txt
を編集します。以下のように変更してください。
## Cファイルのコンパイル
recipe.c.o.pattern="{runtime.ide.path}/ccache" "{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" -DARDUINO_VARIANT="{build.variant}" -DARDUINO_PARTITION_{build.partitions} {compiler.c.extra_flags} {build.extra_flags} "@{build.opt.path}" "@{file_opts.path}" {includes} "{source_file}" -o "{object_file}"
## C++ファイルのコンパイル
recipe.cpp.o.pattern="{runtime.ide.path}/ccache" "{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor.flags} {compiler.cpp.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" -DARDUINO_VARIANT="{build.variant}" -DARDUINO_PARTITION_{build.partitions} {compiler.cpp.extra_flags} {build.extra_flags} "@{build.opt.path}" "@{file_opts.path}" {includes} "{source_file}" -o "{object_file}"
注目ポイント:ccacheのパスは"{runtime.ide.path}/ccache"
と指定しています。これにより、フルパスを使わずに済み、環境に依存しない設定が可能です。
ccacheの動作確認
ccacheが正しく設定され、効果的に機能しているかを確認するには、以下のコマンドを使用します。
.\ccache.exe -s
Cacheable calls: 872 / 1620 (53.83%)
Hits: 716 / 872 (82.11%)
Direct: 628 / 716 (87.71%)
Preprocessed: 88 / 716 (12.29%)
Misses: 156 / 872 (17.89%)
Uncacheable calls: 748 / 1620 (46.17%)
Local storage:
Cache size (GiB): 0.0 / 5.0 ( 0.95%)
Hits: 716 / 872 (82.11%)
Misses: 156 / 872 (17.89%)
この例では、キャッシュ可能な呼び出しの約82%がヒットしており、効果的にキャッシュが利用されていることがわかります。
ccacheの現在の設定を確認するには、以下のコマンドを使用します。
ccache -p
...省略
(default) cache_dir = C:\Users\任意のユーザー名\AppData\Local\ccache
(default) max_size = 5.0 GiB
(default) direct_mode = true
これらの情報を定期的に確認することで、ccacheが期待通りに機能しているかを確認することが可能となります。
まとめ
これらの設定を適用することで、Arduinoのビルド環境が最適化され、特に開発効率が劇的に向上します。ぜひ試してみてください!この方法により、ESP32開発のストレスが大幅に軽減され、より快適な開発環境が実現できるはずです。
投稿者の人気記事
-
miso
さんが
2024/07/06
に
編集
をしました。
(メッセージ: 初版)
-
miso
さんが
2024/07/06
に
編集
をしました。
Opening
comtan
2024/07/07
miso
2024/07/07
-
miso
さんが
2024/07/07
に
編集
をしました。
ログインしてコメントを投稿するarduino IDE 2.3.2を使用しています。
記事の通りにやってみましたが以下のエラーメッセージが出たため、
ccache.exeの保存先を以下の場所に変更しました。
Compilation error: exec: "C:\Users\*****\AppData\Local\Programs\Arduino IDE\resources\app\lib\backend\resources/ccache": file does not exist
Arduino 2系だとパスが異なる様なのでエラーの通り
C:\Users\*****\AppData\Local\Programs\Arduino IDE\resources\app\lib\backend\resources
以下にccacheを配置すれば正常に動作する筈です~報告ありがとうございます。