RaspberryPiPico の実行イメージをWSL2とVM上のUbuntuでビルドしてみた

# 目標
RaspberryPiPico で動作する実行イメージを生成する。
RaspberryPiPicoは実行イメージである".uf2"ファイルを書き込めば動作する。このファイルを作成するための手順を環境構築から記載した。

# 想定する動作環境
動作環境は以下の通り
 - OS: Ubuntu 22.04 LTS
 - VM: VMWare Workstation 16 Player, WSL2
 - PC: 普通のWindows10

※WSL2上のUbuntuでもVM上でも両方動きました。

# 環境構築

環境構築をしていきます。
大まかな手順は以下の通り。
 - SDKモジュールとパッケージのダウンロード
 - 環境変数の設定

## 必要なパッケージやSDKモジュールのダウンロード
ビルドに必要なパッケージをインストールする。
```
$ sudo apt update
$ sudo apt install -y git build-essential gcc cmake gcc-arm-none-eabi
```

RaspberryPi Pico のSDKをインストールする。今回は/opt以下に入れるので、sudoを用いる。
```
$ sudo git clone https://github.com/raspberrypi/pico-sdk.git /opt/pico-sdk
$ sudo git -C /opt/pico-sdk submodule update --init
```

SDKがダウンロードされたかチェックする。
```
~$ ls /opt/pico-sdk
cmake            docs      LICENSE.TXT             README.md  tools
CMakeLists.txt   external  pico_sdk_init.cmake     src
CONTRIBUTING.md  lib       pico_sdk_version.cmake  test
```

## 環境変数の設定
環境変数"PICO_SDK_PATH"にSDKのパスを設定する。
"/etc/profile.d/pico-sdk.sh"を作成する。このシェルスクリプトは、起動時に自動的に実行される。"export ..."で環境変数を登録する。

```/etc/profile.d/pico-sdk.sh 
export PICO_SDK_PATH=/opt/pico-sdk
```

ここで再起動する。
もしくは"source /etc/profile"コマンドで環境変数が反映される。（文字の色づけが失われるかも）

再起動したら（もしくは、sourceしたら）、環境変数のせっていが反映されていることを確認する。

```
$ echo $PICO_SDK_PATH
/opt/pico-sdk
```

環境構築の初期設定は終わり。

# コードを書いていく&ビルドする
コードを書いてビルドする手順の概略は以下の通り

 - プロジェクトを入れるディレクトリを作ってそこに移動する
 - ソースコードを書く
 - CMakeLists.txtを書く
 - buildディレクトリを作成して移動する
 - cmakeする
 - buildする
 - ".uf2"(RaspberryPiPicoに書き込むファイル)ができている

## プロジェクトを入れるディレクトリを作る
コードをまとめるプロジェクト用のディレクトリをつくる。プロジェクトという単位で管理されるわけじゃないが、わかりやすさのためにまとめた方が良い。

ビルド用のディレクトリを作成する。
```
$ mkdir helloworld
$ cd helloworld/
```
## コードを書く
ソースコードを作成する。ファイル名はhello.cとする。まずは、ファイルがひとつの場合を紹介する。

```hello_w.c
#include <stdio.h>
#include <pico/stdlib.h>

int main()
{
    stdio_init_all();

    while (true) {
        printf("Hello world\n");
        sleep_ms(500);
    }
}
```
## CMakeList.txtを作成する。

CMakeList.txtを、ソースコードと同じディレクトリに作成する。変更のポイントは以下の通り。基本的にココだけ帰ればOK。

- このサンプルの1行目の"set(APP_NAME "に続く"helloworld"がアプリ名。実行イメージのファイル名となる。この場合、"helloworld.uf2"が作成される。".uf2"のファイル名を変えたい場合はココを変える。なお、プロジェクトのディレクトリ名と同じでなくても良い。
- このサンプルの2行目の"set(SOURCE_FILES "に続いてソースコードのファイル名を指定する。この例では、ソースコードがひとつだけだが、ソースコードが複数ある場合、全てのソースファイル名をスペースで区切ってここに列挙する。


```CMakeLists.txt
set(APP_NAME helloworld)  #最終的にできあがるファイル名を指定
set(SOURCE_FILES hello_w.c)  #ソースコードを指定。複数ある場合はスペースで区切って指定

cmake_minimum_required(VERSION 3.13)

include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)

project(${APP_NAME} C CXX ASM)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

pico_sdk_init()

add_executable(${PROJECT_NAME} ${SOURCE_FILES})

pico_add_extra_outputs(${PROJECT_NAME})

target_link_libraries(${PROJECT_NAME} pico_stdlib)

pico_enable_stdio_usb(${PROJECT_NAME} 1)
pico_enable_stdio_uart(${PROJECT_NAME} 0)
```


ここまでの成果を確認する。"CMakeLists.txt"と"hello_w.c"がある。
```
$ pwd
/home/hoge/helloworld
$ ls
CMakeLists.txt  hello_w.c
```

## build ディレクトリを作成する & cmake する & make する
ビルドの中間ファイルと実行イメージ".uf"ファイルを格納するディレクトリを作成する。名前は"build"とする。

ディレクトリ"build"を作成する。
```
$ mkdir build 
$ cd build/
```

cmakeする。最後に"Build files have been written to..."と出てくればOK。
```
$ cmake ../
PICO_SDK_PATH is /opt/pico-sdk
PICO platform is rp2040.
:(省略)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hoge/helloworld/build
```

ビルドするための環境ができあがったことを確認する。"Makefile"があればOK。
```
$ ls
CMakeCache.txt  cmake_install.cmake  generated  pico-sdk
CMakeFiles      elf2uf2              Makefile   pioasm
```

makeでビルドする。
```
$ make
```

makeが終わったら、lsで確認する。ファイル名の末尾が".uf2"が出来ていればOK。(この場合は"helloworld.uf2)
このファイルをRaspberryPiPicoに書き込む。
```
$ ls
CMakeCache.txt       generated       helloworld.elf.map  pico-sdk
CMakeFiles           helloworld.bin  helloworld.hex      pioasm
cmake_install.cmake  helloworld.dis  helloworld.uf2
elf2uf2              helloworld.elf  Makefile
```

# その他
## ソースコードを書き換えたら
ソースコードを書き換えたら、"build"ディレクトリに移動して、cmakeしてmakeする。

```
$ pwd
/home/hoge/helloworld/build
$ cmake ../
$ make
```

## CMakeLists.txtを書き換えたら
CMakeList.txtを書き換えたら、"build"ディレクトリごと削除してまた作れば良い。
```
$ pwd
/home/hoge/helloworld/build
$ cd ../
$ rm -rf build/
$ mkdir build
$ cd build
$ cmake ../
```

## 複数のソースコードがある場合、ソースコードが増えた場合
このサンプルのCMakeLists.txtの 2行目の"hello_w.c"につづいて、ソースコードのファイル名を指定すればいい
ヘッダファイルは記載しなくても良い（と思う）。

```CMakeLists.txt
set(APP_NAME helloworld)  #最終的にできあがるファイル名を指定
set(SOURCE_FILES hello_w.c hoge1.c hoge2.c)  #ソースコードを指定。複数ある場合はスペースで区切って指定

cmake_minimum_required(VERSION 3.13)
(省略)
```

## 新しいプロジェクト（アプリ）を作りたい場合
 - プロジェクト用のディレクトリを作る
 - ソースコードを作る
 - CMakeLists.txtを作る
 - buildディレクトリを作る&移動する
 - cmakeした後makeする
 - ".uf2"ができている

以上