misoのアイコン画像
miso 2024年07月06日作成 (2024年07月07日更新) © MIT
セットアップや使用方法 セットアップや使用方法 閲覧数 233
miso 2024年07月06日作成 (2024年07月07日更新) © MIT セットアップや使用方法 セットアップや使用方法 閲覧数 233

Arduino開発環境の最適化:ESP32のビルド時間短縮

Arduino開発環境の最適化:ESP32のビルド時間短縮

皆さん、こんにちは。先日の社内勉強会でビルドの遅さに悩まされ、スムーズに進行できませんでした。その対策ついでに備忘録として共有したいと思います。

問題: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)\ArduinoC:\Program Files\Arduino)。
  2. arduino.exe が存在するディレクトリ内に、新しく build というフォルダを作成します。

preferences.txtの編集

Arduino IDEの設定ファイル preferences.txt を開き、ファイルの最終行に以下を追加します:

build.path=build

この設定により、ビルド結果が先ほど作成した build ディレクトリに整理して保存されるようになります。

2. ccacheの導入

コンパイル結果をキャッシュするccacheを使用すると、再コンパイル時間を劇的に短縮できます。

ccacheのダウンロードとセットアップ

  1. ccacheの公式ダウンロードページにアクセスします。
  2. Windows用のバイナリ ccache-4.10.1-windows-x86_64.zip をダウンロードします。
  3. ダウンロードしたZIPファイルを解凍します。
  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の配置例

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のアイコン画像
寝るのが趣味
  • miso さんが 2024/07/06 に 編集 をしました。 (メッセージ: 初版)
  • miso さんが 2024/07/06 に 編集 をしました。
  • Opening
    comtanのアイコン画像 comtan 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

    misoのアイコン画像 miso 2024/07/07

    キャプションを入力できます

    Arduino 2系だとパスが異なる様なのでエラーの通りC:\Users\*****\AppData\Local\Programs\Arduino IDE\resources\app\lib\backend\resources以下にccacheを配置すれば正常に動作する筈です~報告ありがとうございます。

    1 件の返信が折りたたまれています
  • miso さんが 2024/07/07 に 編集 をしました。
ログインしてコメントを投稿する