ESP-IDFで、Arduino-ESP32 のプログラムをビルドする。


#これまでのあらすじ
Arduino-ESP32 のプログラムを ESP-IDF でビルドするために、以下の2つの記事のような準備をしてきた。

- [ESP-IDFをセットアップ＆ Arduino-ESP32 で使っている ESP-IDF SDK のバージョンがいつのものなのか調べ、合わせる](https://qiita.com/ajtajta_j/items/08c9be0937a8ada5e4d6)
- [Aruino IDE で作成した .ino ファイルを、C++コンパイラでコンパイルできる .cpp ファイルに ](https://qiita.com/ajtajta_j/items/8a75072eb39ccaa1c565) 

いよいよ本番です。

#ESP-IDF の component として Arduno-ESP32 を入れる
ESP-IDFは、「使っている Arduino-ESP32 がコンパイルされた時点のバージョンのもの」が `~/esp/esp-idf/` に入っている前提で。
（執筆時点では、ESP-IDF が master branch の commit id = abea9e4c02bb17e86298aec4e299780399e4789f、
  Arduino-ESP32 が master ブランチの commit id =  5af03361775e78fc7a0721ceec198663d2f1db44 でやってます。)

###1.  hello_world プロジェクトをコピーして流用 myproject とする。

```
$ cd ~/esp
$ cp -r $IDF_PATH/examples/get-started/hello_world ./myproject
$ cd myproject/
$ perl -pe 's/hello-world/myproject/g;' -i Makefile
$ perl -pe 's/hello-world/myproject/g;' -i CMakeLists.txt
$ rm main/hello_world_main.c
```

perl の2行はファイルの中身を読んで、hello-world を myproject に置換して上書きするワンライナーです。
中身は `cat Makefile` などで確認できます。そしてプログラムは別途用意するので hello_world_main.c は削除(rm)しておきます。

###2.コンパイルしたい .ino.cpp ファイルと必要な関連ファイル（ライブラリなど）を main/ の中に置く
「コンパイルしたい .ino.cpp ファイルと必要な関連ファイル（ライブラリなど）」の用意の仕方は[別の記事](https://qiita.com/ajtajta_j/items/8a75072eb39ccaa1c565) でまとめてあります。

###3.project のディレクトリの下に components ディレクトリを掘って Arduino-ESP32 のソースを git clone で入れる

```
$ mkdir -p components
$ cd components
$ git clone --recursive https://github.com/espressif/arduino-esp32.git arduino
$ cd ..
```

###4.project のディレクトリの sdkconfig を Arduino-ESP32 で使っていたものにあわせる。
Windows で Arduino-ESP32 (1.0.1)使っていれば
C:\Users\username\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\tools\sdk\sdkconfig とかにあるので
これを myproject/ にコピーします（既にあるのを上書き)

###5.myproject/partitions.csv を、Arduino-ESP32 で指定していたパーティションに対応する csv で上書き
![Arduino-IDE-ESP-Partition.png](https://qiita-image-store.s3.amazonaws.com/0/324273/53dda643-fca4-6906-e441-1b052f4e5cef.png)

Arduino IDE では画像のようにパーティションスキームを指定していますが、スキームに対応するパーティション定義の csv ファイルが
Windows であれば  `C:\Users\username\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\tools\partitions\` にあります。

どれがどの csv に対応しているかは、 boards.txt を No OTA (Large APP) とかで検索すれば解ります。

|conf項目|Arduino IDE項目名|使う csv |
|---|----|---|
|あり|Default(初期値)	|default.csv|
|あり|Minimal (2MB FLASH)	|minimal.csv|
|あり|No OTA (Large APP)	|no_ota.csv|
|あり|Huge APP(3MB No OTA)	|huge_app.csv|
|あり|Minimal SPIFFS (Large APPS with OTA)	|min_spiffs.csv|
||16MB Fat	|ffat.csv|
||Default (2 x 6.5 MB app, 3.6 MB SPIFFS)	|default_16MB.csv|
||Large SPIFFS (7 MB)	|large_spiffs_16MB.csv|

自分が使ってるパーティションスキームに対応する csv ファイルが解ったら、myproject/partitions.csv にコピーして上書きします。

なお、conf 項目ありというのは、後の make menuconfig で設定出来る奴です。が、項目がない　16MB の奴をつかってる（らしい）M5Stack-FIRE などではどうなるのか？（持ってないので試せない）

とりあえず、自分はいつも No OTA でやってたので、それで。

###6.  make menuconfig で設定画面開いて COMポート指定する。また、前述パーティション設定も確認する。
make menuconfig は sdkconfig を設定するためのツールを起動するコマンドです。
sdkconfig がある場所（この場合 myproject/ ) で実行します。確認/設定は3カ所。

1つめは、カーソルキー上下で Serial Flasher Config を選んで Enter おすと、先頭に Default serial port とあるので設定します。Windows なら COM1 とか。

で、Save して Exit で最初のメニューまで戻って、

2つめは Arduino Configuration。4つめにUsed partition scheme とあるので、Arduino IDE で指定していたパーティションスキームを指定します。自分は No OTA 3MB。ですが、ここ、前項で「conf項目あり」とした5種類しか選択肢がないので、それ以外の奴でやりたい場合は……**わかりません！ごめんなさい!**（Flash 4MB の DevKitC しか持ってないので試せない）

また、Save して Exit で最初のメニューまで戻って、

3つめは Partition table。ここは一番上のを Custom partition table にして、その次が partitions.csv になっていることを確認。
また、Save して Exit くりかえして終了。

###7. いよいよ make
コンパイラのバージョンやオプションが違うので Arduino IDE で通った書き方が ESP-IDF で通らないものがあります。
たとえば、 `sprintf( str, "%d", long_int_var )` とかは `%ld` じゃないと怒られます。自分が書いてた範囲ではそれくらい。

エラーを排除したら無事 build/myproject.elf が出来ているはず。 make flash で書き込めます。

いろいろ苦労してここまで来たのだけど、記事は最短コースを書くので意外と大変じゃなさそうな感じにまとまった、気がしています。

#その他
sdkconfig や project file を書き換えない限り、最初からリビルドにならないので、ちょっと修正即ビルドってやる分には Arduino IDE よりかなり速いです。Arduino IDE は AVR の Arduino のビルドをする場合もあり、その後 ESP32 に戻ったらやっぱりフルリビルドなので、時間かかるけど、ESP-IDFと分けてるだけでリビルドが減りますね。

HDDに余裕があるなら、ESP-IDF を別々のフォルダに、1プロジェクトごとに1つ用意すれば時間効率良いかも！？(2つのESP32 で BLE通信するようなときは2つ欲しいと思ってた～）