Spresense sdk を v3.1.0 にアップデートしてみた

2023/7/24 に Spresense sdk v3.1.0 がリリースされました。

今回のBugfixにBLE CENTRAL関係の項目が多数含まれていたので、開発環境を v3.1.0 にアップデートすることにしました。(現在 BLE CENTRALの案件に携わっていて開発環境のバグのせいで全然進んでいない)
そもそもSpresense SDK はNuttxをベースにしていて Nuttx 事態がオープンソースなので
Spresense SDKも含めて動作の保証はないと思っています。

とりあえず [SPRESENSE v3.1.0 release (2023/7/24)](https://github.com/sonydevworld/spresense/releases/tag/v3.1.0) に

**ツールチェーンの更新方法**
v3.1.0ではOpenOCDのバージョンを0.12.0に更新しました。以下のコマンドに従い、ツールチェーンの更新を行ってください。
$ mkdir ~/tmp
$ cd ~/tmp
$ wget https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh
$ bash install-tools.sh -r

**コード取得方法**
$ git clone --recursive https://github.com/sonydevworld/spresense.git -b v3.1.0

の記述があるのでそれに従って先ずは**ツールチェーン**を更新

```
$ mkdir ~/tmp
$ cd ~/tmp
$ wget https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh
$ bash install-tools.sh -r
```

こちらはエラーも無くすんなりと進みました。

次に**コード取得**ですがここで躓きました。
躓いた理由は**Gitに関しての知識不足**でした。

```
$ git clone --recursive https://github.com/sonydevworld/spresense.git -b v3.1.0
```
当然これだけでは更新されないというか、そもそも clone した環境でサンプルのソースをいじっていたために
$ git clone がエラーになります。

```
kaz@DESKTOP-M2ODEKF:~$ cd spresense
kaz@DESKTOP-M2ODEKF:~/spresense$ git clone --recursive https://github.com/sonydevworld/spresense.git -b v3.1.0
fatal: destination path 'spresense' already exists and is not an empty directory.
kaz@DESKTOP-M2ODEKF:~/spresense$
```

fatal: destination path 'spresense' already exists and is not an empty directory.
既にディレクトリが存在していておまけに空ではないと怒られました。

そこでSpresense SDKの解説の中の[10.1. 指定バージョンのSDKを取得する方法](https://developer.sony.com/spresense/development-guides/sdk_set_up_ja.html#_%E6%8C%87%E5%AE%9A%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AEsdk%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
これに従ってUpdateしてみました。

**10.1.1. リポジトリ内のクリーン**
指定バージョンのSDKに置き換える場合は、置き換える前にリポジトリ内をクリーンする必要があります。以下の手順で状態を確認し、リポジトリをクリーンしてください。

**10.1.1.1. ビルド成果物のクリーン**
以下のコマンドで make した際に生成したファイルを削除します。

```
kaz@DESKTOP-M2ODEKF:~/spresense$ cd sdk
kaz@DESKTOP-M2ODEKF:~/spresense/sdk$ make distclean
make[1]: Entering directory '/home/kaz/spresense/nuttx'
make[2]: Entering directory '/home/kaz/spresense/nuttx/pass1'
make[2]: Leaving directory '/home/kaz/spresense/nuttx/pass1'
make[2]: Entering directory '/home/kaz/spresense/nuttx/syscall'
make[2]: Leaving directory '/home/kaz/spresense/nuttx/syscall'

中略

make[3]: Leaving directory '/home/kaz/spresense/nuttx/tools/cxd56'
make[2]: Leaving directory '/home/kaz/spresense/nuttx/tools'
make[1]: Leaving directory '/home/kaz/spresense/nuttx'
kaz@DESKTOP-M2ODEKF:~/spresense/sdk$
```

**10.1.1.2. リポジトリ修正内容のクリーン**
以下のコマンドでCommitしていないリポジトリの編集内容を確認します。

```
kaz@DESKTOP-M2ODEKF:~/spresense/sdk$ git status
HEAD detached at v3.1.0
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
  (commit or discard the untracked or modified content in submodules)
        modified:   ../examples/bluetooth_le_central/bluetooth_le_central_main.c
        modified:   ../nuttx (untracked content)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        ../ble_central_spresense.code-workspace
        ../examples/LibTarget.mk
        ../examples/bluetooth_a2dp_snk/
        ../examples/bluetooth_hfp_hf/
        ../examples/bluetooth_le_central/Kconfig:com.dropbox.attrs

中略

        ../spresense-binaries-v3.1.0.zip:Zone.Identifier
        ../spresense.code-workspace
        ../spresense.code-workspace_01.code-workspace
        ../spresense.code-workspace_myproject.code-workspace
        ../spresense/
        ../testproject/

no changes added to commit (use "git add" and/or "git commit -a")
kaz@DESKTOP-M2ODEKF:~/spresense/sdk$
```

リポジトリに編集しているファイルがあるので **git stash** で一時避難を行いました

```
kaz@DESKTOP-M2ODEKF:~/spresense/sdk$ git stash
Saved working directory and index state WIP on (no branch): a24d96ff Merge pull request #675 from sonydevworld/develop
kaz@DESKTOP-M2ODEKF:~/spresense/sdk$
```

10.1.3. 指定バージョンでリポジトリをチェックアウト
例：v2.0.2 でチェックアウトする場合 ← **v3.1.0 に変更**

```
az@DESKTOP-M2ODEKF:~/spresense/sdk$ git fetch origin
kaz@DESKTOP-M2ODEKF:~/spresense/sdk$ git checkout v3.1.0
M       nuttx
HEAD is now at a24d96ff Merge pull request #675 from sonydevworld/develop
kaz@DESKTOP-M2ODEKF:~/spresense/sdk$
```
エラーが出てしまいました。
そこで

```
$ git clone --recursive https://github.com/sonydevworld/spresense.git -b v3.1.0
```
を実行してみました

```
kaz@DESKTOP-M2ODEKF:~/spresense/sdk$ git clone --recursive https://github.com/sonydevworld/spresense.git -b v3.1.0
Cloning into 'spresense'...
remote: Enumerating objects: 40948, done.
remote: Counting objects: 100% (1425/1425), done.
remote: Compressing objects: 100% (569/569), done.
remote: Total 40948 (delta 901), reused 1339 (delta 834), pack-reused 39523
Receiving objects: 100% (40948/40948), 220.63 MiB | 2.79 MiB/s, done.
Resolving deltas: 100% (25169/25169), done.
Note: switching to 'a24d96ff77ff5834f88446bb3f97760b5bc653fa'.

中略

Submodule path 'externals/mossfw/mossfw': checked out '701d8224e1d161a7ebde815c001a8aa94143c5de'
Submodule path 'externals/nnablart/nnabla-c-runtime': checked out '6bfa72b8c47cd5621e1f211d3e58ba63a1f5000f'
Submodule path 'nuttx': checked out 'acf4b8fda8c51c2e0ff7ebe3b45575333c647b0f'
Submodule path 'sdk/apps': checked out '79f09a83a8008dda32fed242544951e7d2ae1c07'
kaz@DESKTOP-M2ODEKF:~/spresense/sdk$
```

**clone** 出来たぽいです。

**指定バージョンのSDKを取得する方法**のページではソースをチェックアウトした後に次の2つのコマンドを実行するようになっています。
**git submodule init**
**git submodule update**
実際このコマンドが何をやっているのか、必要なのかは分かりませんがとりあえず実行しておきます。
```
kaz@DESKTOP-M2ODEKF:~/spresense$ git submodule init
kaz@DESKTOP-M2ODEKF:~/spresense$ git submodule update
error: Your local changes to the following files would be overwritten by checkout:
        build-tools/test/scripts/exec_all_functions.sh
        src/functions/implements/math/round.c
Please commit your changes or stash them before you switch branches.
Aborting
fatal: Unable to checkout '6bfa72b8c47cd5621e1f211d3e58ba63a1f5000f' in submodule path 'externals/nnablart/nnabla-c-runtime'
kaz@DESKTOP-M2ODEKF:~/spresense$
```

git submodule update でエラーが出ました。

良く分からないので ChatGPT(GPT-4)に助けてもらいました。

**質問 : **
gitで次のエラーが出ました。

kaz@DESKTOP-M2ODEKF:~/spresense$ git submodule init
kaz@DESKTOP-M2ODEKF:~/spresense$ git submodule update
error: Your local changes to the following files would be overwritten by checkout:
        build-tools/test/scripts/exec_all_functions.sh
        src/functions/implements/math/round.c
Please commit your changes or stash them before you switch branches.
Aborting
fatal: Unable to checkout '6bfa72b8c47cd5621e1f211d3e58ba63a1f5000f' in submodule path 'externals/nnablart/nnabla-c-runtime'
kaz@DESKTOP-M2ODEKF:~/spresense$

**回答 :**
あなたがgit submodule updateを実行したときに、サブモジュール内の一部のファイルにローカルで変更があったためにエラーが発生しています。Gitはこれらのファイルの変更を上書きすることなく、サブモジュールの状態を更新しようとします。

これを解決するためには、変更したファイルをコミットするか、スタッシュ（一時的に変更を保存する）する必要があります。現在の変更が不要であれば、それらを破棄することも可能です。

**1. 変更をコミットする場合:**
```
Copy code
cd externals/nnablart/nnabla-c-runtime
git add .
git commit -m "committing my changes"
cd ../../..
git submodule update
```

**2. 変更をスタッシュする場合:**
```
Copy code
cd externals/nnablart/nnabla-c-runtime
git stash
cd ../../..
git submodule update
```
後でスタッシュした変更を適用するには、サブモジュールディレクトリに移動してgit stash popを実行します。

**3. 変更を破棄する場合:**
```
Copy code
cd externals/nnablart/nnabla-c-runtime
git reset --hard
cd ../../..
git submodule update
```
これにより、変更は永久に破棄されます。そのため、必要な変更が破棄されないように注意してください。

と言うことなので
**2. 変更をスタッシュする場合:**
の方法でやってみました。
```
kaz@DESKTOP-M2ODEKF:~/spresense$ cd externals/nnablart/nnabla-c-runtime
kaz@DESKTOP-M2ODEKF:~/spresense/externals/nnablart/nnabla-c-runtime$ git stash
Saved working directory and index state WIP on kaz_deelop: ef181db 20230614
kaz@DESKTOP-M2ODEKF:~/spresense/externals/nnablart/nnabla-c-runtime$ cd ../../..
kaz@DESKTOP-M2ODEKF:~/spresense$ git submodule update
Submodule path 'externals/nnablart/nnabla-c-runtime': checked out '6bfa72b8c47cd5621e1f211d3e58ba63a1f5000f'
kaz@DESKTOP-M2ODEKF:~/spresense$
```

これで**submodule update**も正常に実行されたみたいです。

**無事にv3.1.0にアップデート出来たと思っています。**
Spresense SDK を使うにはgitの知識が必須ですね、時間を見て勉強します。

今回の方法が正しいのか間違っているのか、またもっと簡単な方法があるのか分かりません。
有識者の方、ここは違っている、ここはこうした方が良いなどのご指摘を頂けると助かります。