編集履歴一覧に戻る
misoのアイコン画像

miso が 2024年07月07日18時01分54秒 に編集

コメント無し

本文の変更

皆さん、こんにちは。先日の社内勉強会でビルドの遅さに悩まされ、スムーズに進行できませんでした。その対策ついでに備忘録として共有したいと思います。 ## 問題:ESP32開発における長いコンパイル時間 ESP32をArduino IDEで開発すると、AVRマイコンと比較して著しく長いコンパイル時間に悩まされることがあります。主な理由は二つです: 1. **ESP32の複雑性**: AVRに比べて機能が豊富なため、本質的にコンパイルに時間がかかります。 2. **フルビルドの問題**: Arduino IDEは小さな変更でもフルビルドを行うため、長いプログラムでは1分以上かかることも珍しくありません。 ## 解決策:ccacheの導入 ccacheは、C/C++用のコンパイル高速化ツールです。その仕組みは以下の通りです: - **キャッシング**: コンパイル時に生成されたファイルをキャッシュします。 - **再利用**: 2回目以降のコンパイルでは、変更のない部分をキャッシュから再利用します。 - **初回のオーバーヘッド**: 初回コンパイル時はすべてのファイルをキャッシュするため、若干時間がかかります。 - **以降のビルド**: 2回目以降は劇的に高速化され、フルビルドの必要性が大幅に減少します。 ## Arduino IDEでccacheを活用するための課題 Arduino IDEには、ccacheの効果を最大限に発揮させるための障壁があります: - **ランダムフォルダ生成**: スケッチのコンパイル時、ランダムな名前のフォルダにオブジェクトファイルが生成されます。 - **コマンド実行**: 生成されたランダムフォルダに対してコマンドが実行されます。 この仕様のため、ccacheが効果的に機能しにくい状況にあります。 ## 解決策:出力先の固定 ccacheを効果的に利用するためには、Arduino IDEの出力先を固定する必要があります。これにより: 1. ccacheが一貫して同じ場所のファイルを参照できるようになります。 2. キャッシュの再利用率が大幅に向上し、ビルド時間の短縮につながります。 以下のセクションでは、具体的な設定方法を詳しく説明します。これらの設定を行うことで、ESP32開発のワークフローが大幅に改善され、開発効率が飛躍的に向上することが期待できます。 ## 1. ビルドパスの指定 まず、Arduinoのプリファレンスファイルを編集します。これにより、ビルド成果物の保存場所を明示的に指定できます。高速化とは関係ないのでスキップして頂いてもOKです。 ### buildディレクトリの作成 1. Arduino IDEのインストールディレクトリを開きます(通常は `C:\Program Files (x86)\Arduino` や `C:\Program Files\Arduino`)。 2. `arduino.exe` が存在するディレクトリ内に、新しく `build` というフォルダを作成します。 ### preferences.txtの編集 Arduino IDEの設定ファイル `preferences.txt` を開き、ファイルの最終行に以下を追加します: ```ini build.path=build ``` この設定により、ビルド結果が先ほど作成した `build` ディレクトリに整理して保存されるようになります。 ## 2. ccacheの導入 コンパイル結果をキャッシュするccacheを使用すると、再コンパイル時間を劇的に短縮できます。 ### ccacheのダウンロードとセットアップ 1. [ccacheの公式ダウンロードページ](https://ccache.dev/download.html)にアクセスします。 2. Windows用のバイナリ `ccache-4.10.1-windows-x86_64.zip` をダウンロードします。 3. ダウンロードしたZIPファイルを解凍します。

-

4. 解凍したフォルダ内の `ccache.exe` を見つけ、これを `arduino.exe` と同じディレクトリにコピーします。

+

4. Arduino 1.8.19では解凍したフォルダ内の `ccache.exe` を見つけ、これを `arduino.exe` と同じディレクトリにコピーします。 5. Arduino 2.3.2では`arduino-cli.exe`などが保存されている`\resources\app\lib\backend\resources`内に`ccache.exe`をコピーしてください。

![ccacheの配置例](https://camo.elchika.com/adef53b123104417860822064c93851e4ee98a82/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32646132616164352d373663382d343562642d393434382d3262306431663736653138352f62393363336530302d393336352d343433332d623839382d313361613464346634353339/) ### platform.txtの編集 コンパイル時にccacheを使用するよう、`%USERPROFILE%\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\2.1.1\libraries\SD `などに配置されいてる`platform.txt`を編集します。以下のように変更してください。 ```ini ## 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開発のストレスが大幅に軽減され、より快適な開発環境が実現できるはずです。