ESP-IDFをセットアップ＆ Arduino-ESP32 で使っている ESP-IDF SDK のバージョンがいつのものなのか調べ、合わせる

#これまでのあらすじ
ESP-IDF そろそろ使ってみたいが、ArduinoIDE（現時点は 1.0.1が最新） で書いた奴も使えないとやだなと思ったら
[公式 "To use as a component of ESP-IDF"] (https://github.com/espressif/arduino-esp32/blob/master/docs/esp-idf_component.md)
を見ると使えそうじゃね？

しかし2019/2/17頃に試してみたところ、 Arduino-ESP 1.0.1 についてる SDK と、ESP-IDF 安定最新 v3.1.2 の相違があって .ino さん(相当の.cppさん) のコンパイルがうまくいかない。

これは「Arduino-ESP32 で使っている ESP-IDF SDK はいつのものなのか調べ、合わせる」だけで一苦労だったので独立記事を書いておこうと思ったおっさんの備忘録である。（あとで別記事からこいつを refer してやろうというもくろみ）

#ESP-IDF 入れ方(Windows)
[公式 "Get Started"](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) とそのリンク先の通りだが。

とりあえずパスは以下のとおりとする。
・Windows の w:\esp32_dev の中に MSYS2 を入れる。
・~/esp/esp-idf に ESP-IDF を 
・~/esp/ hello_world/ にサンプルプロジェクトを
・いずれは ~/esp/hello_world/components/arduino/ 以下に Arduino-ESP32 (as component)を

##Step 1. toolchain 入れる
 [https://docs.espressif.com/projects/esp-idf/en/latest/get-started/windows-setup.html](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/windows-setup.html)にある https://dl.espressif.com/dl/esp32_win32_msys2_environment_and_toolchain-20181001.zip を W:\esp32_dev 等に展開。
(w:\esp32_dev\msys32\ の中に諸々ある状態）

以下、mingw32.exe 起動してシェルで作業。64bit Windows だけど言われたとおり 32 のほうにしておく。

このディレクトリ設定の場合、mingw32 における ~/ (ホームディレクトリ)は /home/username であり、すなわち Windows で W:\esp32_dev\msys32\home\username になります。
同様に mingw32 の /etc/profile.d/ = Windows の W:\esp32_dev\msys32\etc\profile.d\ です。

##Step 2. git で ESP-IDF を入れる。
自分がやったとおりに書くと、ここで v3.1.2 を指定している。思えばそれで苦労したのではないか。abea9e4c0 を入れればよかったのではないかと思う。(後にv3.1.3出たけど入れてない)

```
$ cd 
$ mkdir -p esp
$ cd ~/esp
$ git clone -b v3.1.2 --recursive https://github.com/espressif/esp-idf.git
```

うまくいけば、esp-idf ってディレクトリが作られていろいろ入ってる。

git が cannot fork とかいって止まるときは、一旦 mingw32.exe を閉じて、同じフォルダにある autorebase.bat を起動（一瞬で閉じる）してからmingw32.exe起動して、(cd ~esp からの) git 実行

--recursive を指定すると履歴に以下のような奴が入ってて submodule も入ったんやなぁ、とわかる。

```
Submodule path 'components/spiffs/spiffs': checked out 'f5e26c4e933189593a71c6b82cda381a7b21e41c'
```

recursive を忘れると submodule が入らないので、以下のようにして入れるっぽい。

```
cd esp-idf
git submodule update --init --recursive 
cd ..
```

##Step 3. 環境変数の設定のためのファイルを /etc/profile.d/ 内に作る

作っておけば mingw32.exe の起動時に設定してくれるようになります。
下記コマンドで作れますが、 username は各自のにしてください。
echo して > の右のファイルに書き込む（上書きされる）のでファイル名は任意で。

```
$ echo export IDF_PATH="/home/username/esp/esp-idf" > /etc/profile.d/esp32_pathsetting.sh
$ exit
```

mingw32 起動しなおして printenv IDF_PATH やら echo $IDF_PATH やらで設定されていることを確認。

##Step 4. あとあとパッケージ古いとか言われるので更新しておく
最初は MSYS や pacman(パッケージマネージャ) を更新する。

```
$ pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime
(質問には y で答えるが途中でエラーっぽく止まる)
$ pacman -Su
(質問にはyで答えてるといくつかのパッケージを入れて、その後 exit がどうの言われて途中で止まるので窓閉じて mingw32.exe 起動しなおす。)
(ここで pacman.exe のプロセスが残るので、気になる人はWindows タスクマネージャで終わらせておく)
$ pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime
(何も行うことがありませんと言われる)
$ pacman -Su
(基幹部分更新済みのためか、いろんなものがupdateされる。自分がやった時は152個くらい。)
$ pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime
(何も行うことがありませんと言われる)
$ pacman -Su
(何も行うことがありませんと言われる)
```

これで MSYS2, MINGW32 システムと pacman そのもののupdate終わったので、次に ESP-IDF で使う python モジュール。必要要件は $IDF_PATH/requirements.txt に書いてあるのだが、

・一部はpip 先生が mingw-w64-i686-gcc がないと入れられませんとか言いおるので pacman で入れられる奴は先に入れておく。
・pacman 先生は pacman 先生で「なんかファイル既にあるんやけど！？」ってエラーになるのがあるから、そっちは pip で処理する。
・pip は実行前に upgrade しておく。

よって叩くコマンドは下記。

```
$ pacman -S mingw-w64-i686-python2-cryptography
$ pacman -S mingw-w64-i686-python2-future
$ pacman -S mingw-w64-i686-python2-pyparsing
$ python -m pip install --upgrade pip
$ python -m pip install --user -r $IDF_PATH/requirements.txt
```

余談：pacman -S mingw-w64-i686-toolchain で mingw-w64-i686-gcc とかが入るっぽい？


##Step 5. いったん build を試す
[https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) の下の方Start a Project から monitor まで hello_world サンプルをやってるので同じように。 cp して cd して make menuconfig でシリアルポート設定して save, exit, して make する。

なお、make menuconfig の Serial flasher config > Default serial port で指定するのは
/dev/ttyUSB0 みたいになってるけど、Windows の場合 COM10 みたいに指定します。
**make menuconfig しなおすと（＝sdkconfig が変わると）全部コンパイルし直しになるので、最初にちゃんと設定しておかないと時間のロスがすごい。**

make 後にエラーがなければ build/hello_world.elf が無事できてるはずなので、 make flash で書き込む。

ESP-IDF のインストールは以上です。


#Arduino-ESP32 に適合する ESP-IDF のバージョン確認と checkout

git の commit id って奴で細かいバージョンを特定する。


Arduino-ESP32 のバージョンは 記事執筆時は　1.0.1なのだが、Arduino-ESP32 のほうの更新履歴であるところの  [https://github.com/espressif/arduino-esp32/commits/master](https://github.com/espressif/arduino-esp32/commits/master) あたりを見ていくと以下のようなのがある。

>Commits on Feb 15, 2019 
>Update IDF to abea9e4c0 (#2458) 
>　　[https://github.com/espressif/arduino-esp32/commit/010a7c60f7000eb17c6333309c87156769848a0e](https://github.com/espressif/arduino-esp32/commit/010a7c60f7000eb17c6333309c87156769848a0e)
>
>Commits on Jan 10, 2019 
>Update IDF to e931fe9 and add esp-face (#2291)
>　　[https://github.com/espressif/arduino-esp32/commit/fa61b3bffedc0c5b65de69c1a550c7c07d437faa](https://github.com/espressif/arduino-esp32/commit/fa61b3bffedc0c5b65de69c1a550c7c07d437faa)

e931fe9 ってのが、1.0.1のタグついてるけど、 abea9e4c0 のほうはついてないから、たぶん1.0.1 と同時だったのは、e931fe9 でしょう。この e931fe9 とかってのが、ESP-IDF のほうでのバージョンを示す id の**【一部】**。

一部ってなんやねんって奴だがそれは後述として、とりあえず、2019/2/17 時点としては新しくて Arduino-ESP32の master に取り込まれている abea9e4c0 を入れてみた。(Arduino-ESP32 も master 最新入れるつもりで)

```
$ cd $IDF_PATH
$ git checkout abea9e4c0
$ git submodule update
```

当たり前のように入ってくれたが、割と試行錯誤でした。(submodule はコンパイルしたら怒られたからやった)

#git の commit id って奴に関する話をもうちょっと

```
$ cd $IDF_PATH
$ git log e931fe9 
(なんか出るのでカーソルキーでスクロールしてqで終了)
```

とかってやると、先頭あたりに

```
commit e931fe9f578a7ce6b6aa28261750bb1344509e15
Merge: 456efd3d5 6933c103e
Author: Jiang Jiang Jian <jack@espressif.com>
Date:   Wed Jan 9 10:20:50 2019 +0800

    Merge branch 'bugfix/fix_mbox_thread_safe_issue' into 'master'
```

この e931fe9 で始まる長い奴が commit id のフルネーム。実際は e931fe9 と略しても unique に特定できるから、e931fe9 がバージョン番号的に機能するっぽい。
ちなみに git log e9 とかやると短すぎて怒られるが、git log e931 あたりで大丈夫。リポジトリ内は4文字で検索できる仕様とのこと。
git abea だと候補が現時点でも2つ有り、abea6c50f と abea9e4c0 のどっちよ？みたいに出て止まる。5文字でunique になると言えども、abea9e4c0 の長さまでは書くのが流儀なのかしら？

[commit id の参考サイト](http://naoyashiga.hatenablog.com/entry/2013/11/22/013406)

ちなみに v.3.1.2 のようなのは tag がついてるので git log v3.1.2 やると

```
commit ed1304146bb379c0a8dcf141710b42364feb4734 (tag: v3.1.2)
Merge: a18f92b09 1937bc2bd
Author: Angus Gratton <angus@espressif.com>
Date:   Wed Jan 2 20:42:45 2019 +0800

    Merge branch 'bugfix/timer_delete_dispatch_race_v3.1' into 'release/v3.1'
```

こんな感じ。タグついてます。よく見ると、 e931fe9 は `master` に適用されているけど、v3.1.2 は `release/v3.1` ってほうに適用されていて、ブランチが違う。

で、ESP-IDF v3.1.2 (自分が試したときの最新の安定版）が Jan 2, 2019 に対して、 
Arduino-ESP32 1.0.1 に対応してる奴（e931fe9）は Jan 9, 2019 なので v3.1.2 のほうが古い。
v3.1.2 を入れて Arduino core のプログラムをビルドしようとしたらハマりましたよっていう。

なので e931fe9 なりもっと新しくて Arduino-ESP32の master に取り込まれている abea9e4c0 なりを入れてあれば大丈夫、ということになる。試してる間に v3.1.3 が出ましたが、Arduino-ESP32 が追随してないかもなのでスルー。（入れてないので git log v3.1.3 してもありませんって言われる。情報が欲しければいったん新しいの入れてから checkout で戻ったりするのかも。）

とにかく、これで ESP-IDFのバージョンを確認したり切り替えたりできるようになったし、Arduino-ESP32 と適合するのを選んで入れることができるようになった。
Arduino-ESP32 もバージョン差で悩むだろうから、`git checkout <version>` は覚えておいたほうがよさそうだ。

#次回予告(?)
もちろん目的は Arduino-ESP32 で書いた .ino を、ESP-IDF でビルドすること。以下のように続く予定。(既にビルドまで出来ているけど備忘録は必要だ)

というわけで下記２記事を追加しました。(2019/2/21 更新)

[Aruino IDE で作成した .ino ファイルを、C++コンパイラでコンパイルできる .cpp ファイルに ](https://qiita.com/ajtajta_j/items/8a75072eb39ccaa1c565)
[ESP-IDFで、Arduino-ESP32 のプログラムをビルドする。](https://qiita.com/ajtajta_j/items/05b43c2d19309ca6e163)


#その他の参考サイト
本文中にリンク貼ったのは割愛。それ以外では

[ESP32の開発環境改善(ESP-IDFとEclipse導入)](http://watako-lab.com/2018/04/14/esp32_dev_env/)
　ビバ日本語

[Arduino-ESP32の github の issue 1142](https://github.com/espressif/arduino-esp32/issues/1142#issuecomment-367867856)
　You must do a `git checkout <version>` in esp-idf to match the <version> that arduino-esp32 was compiled at.  という情報はここで得ました。