PlatformIO in BastilleBSD

https://twitter.com/PlatformIO_Org/status/1501153929245216768

PlatformIO(pio)のCLIはpythonで作られているのでラッパーのスクリプトはFreeBSDでも動きますがツールチェインのバイナリが用意されていないので、ビルドはできません。

ツールチェインをFreeBSD用に用意するのは大変なので、FreeBSDには[Linuxバイナリ互換機能](https://docs.freebsd.org/ja/books/handbook/linuxemu/)があるので、これを使う方法を思いつきました。

環境はBastilleBSDを使うので、[こちら](https://qiita.com/yamori813/items/256fcb279b7ad6e82d81)のページを参考に設定します。pythonもインストールしておきます。

pythonのパッケージマネージャのpipはpkgになってないので、手動で入れます。

```
% sudo bastille cmd piojail python -m ensurepip
```

pioをインストールします。

```
% sudo bastille cmd piojail pip3 install -U platformio
```

これでプロジェクトは作れるようになります。

https://qiita.com/yamori813/items/41546c216bcf2e234efb

しかしpio runするとtoolchainが無いのでエラーになります。

```
Error: Could not find the package with 'toolchain-gccarmnoneeabi @ >=1.60301.0' requirements for your system 'freebsd_amd64'
```

このfreebsd_amd64というのは、/usr/local/lib/python3.8/site-packages/platformio/util.pyのget_systype()で設定されています。

ここでlinuxを偽装します。

```python
def get_systype():
#    type_ = platform.system().lower()
    type_ = 'linux'
#    arch = platform.machine().lower()
    arch = 'i686'
```

設定を確認するとこうなります。

```
# pio --version
PlatformIO Core, version 5.2.4
# pio system info
--------------------------  -------------------------
PlatformIO Core             5.2.4
Python                      3.8.12-final.0
System Type                 linux_i686
Platform                    FreeBSD-13.0-RELEASE-p4
File System Encoding        utf-8
Locale Encoding             UTF-8
PlatformIO Core Directory   /root/.platformio
PlatformIO Core Executable  /usr/local/bin/platformio
Python Executable           /usr/local/bin/python
Global Libraries            0
Development Platforms       3
Tools & Toolchains          8
--------------------------  -------------------------
```

これでlinuxのtoolchainがインストールされますが、soが無くてコマンドが実行できません。（toolchainによっては/compatの下のsoだけで実行できるケースもあるようです）

```
Building in release mode
Compiling .pio/build/lpc812/FrameworkMbedCore/cmsis/TARGET_CORTEX_M/mbed_tz_context.o
arm-none-eabi-gcc: error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory
```

soファイルはpioのパッケージファイルに入っていて、ホームディレクトリの.platformio以下にありますので、パスをLD_LIBRARY_PATHに設定します。（/compt/linux/libにコピーするリンクを張るかしてもいいです）

pkgなsoも必要だったのでインストールします。

追記：armのgccがlibisl.so.15の依存が増えてたのでrpmからファイルを拾い出して/compatにコピーしました。

```
% sudo bastille pkg piojail install linux-c7-devtools
```

ビルドできました。

```
# pio run
Processing lpc812 (platform: nxplpc@3.5.0; board: lpc812; framework: mbed)
--------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/nxplpc/lpc812.html
PLATFORM: NXP LPC (3.5.0) > NXP LPC800-MAX
HARDWARE: LPC812 30MHz, 4KB RAM, 16KB Flash
DEBUG: Current (cmsis-dap) On-board (cmsis-dap) External (blackmagic, jlink)
PACKAGES: 
 - framework-mbed 5.51001.181029 (5.10.1) 
 - toolchain-gccarmnoneeabi 1.90201.191206 (9.2.1)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 39 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Checking size .pio/build/lpc812/firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [=         ]   5.9% (used 240 bytes from 4096 bytes)
Flash: [===       ]  27.8% (used 4556 bytes from 16384 bytes)
========================= [SUCCESS] Took 1.48 seconds =========================
```

もともとpioはMacOS Xで使っていたのですが、El capitanのPythonが2.7で現行のpio ver5ではPython 3以上になりupgradeができなかったので、あきらめてFreeBSDでも使えるようにしてみました。

MacOS Xの以前のバージョンでもそうでしたがすべてのplatformがちゃんと使えるとは限りません。

# atmelavr

まずはArudinoを試してみます。

```
% pio init --board miniatmega328
```

なぜかアップロードツールのavrdudeはpioの方にはなくて、FreeBSDのpkgをインストールしました。

```
% pio run --target upload --upload-port /dev/cuaU0
```

ところがerrorになります。探してみたところplatformio.iniに以下を追加してOK牧場でした。デフォルトの115200ではこけるようです。ユーザーアカウントでビルドしている場合cuaU0のパーミッションを変更しておく必要があります。/etc/devfs.rulesで設定するのが良いです。

```
upload_speed = 57600
```

# timsp430

パッケージが無いようです。

```
Error: Could not find the package with 'platformio/toolchain-timsp430 @ ~1.40603.190926' requirements for your system 'linux_i686'
```


# microchippic32

ビルドでエラーになります。

```
Compiling .pio/build/chipkit_dp32/FrameworkArduino/Print.cpp.o
/home/hiroki/.platformio/packages/framework-arduinomicrochippic32/cores/pic32/HardwareSerial.cpp: In function 'bool Serial_available()':
/home/hiroki/.platformio/packages/framework-arduinomicrochippic32/cores/pic32/HardwareSerial.cpp:897:54: internal compiler error: Segmentation fault
 bool Serial_available() { return Serial.available(); }
                                                      ^

/home/hiroki/.platformio/packages/framework-arduinomicrochippic32/cores/pic32/HardwareSerial.cpp:897:54: internal compiler error: Aborted
pic32-g++: internal compiler error: Aborted (program cc1plus)
*** [.pio/build/chipkit_dp32/FrameworkArduino/HardwareSerial.cpp.o] Error 255
========================= [FAILED] Took 121.50 seconds =========================
```

# espressif32

ビルドはできるようです。uploadもできました。

# espressif8266

ビルドはできるようです。uploadは試してません。

# nxplpc

ビルドはできるようです。uploadは試してません。

# ststm32

ビルドはできるようです。uploadは試してません。

# ststm8

ライブラリのビルドでこけます。

# atmelsam

パッケージが無いようです。

```
Error: Could not find the package with 'platformio/toolchain-gccarmnoneeabi @ ~1.70201.0' requirements for your system 'linux_i686'
```

# raspberrypi

ビルドはできるようです。uploadは試してません。

# gd32v

パッケージが無いようです。

```
Error: Could not find the package with 'platformio/toolchain-gd32v @ ~9.2.0' requirements for your system 'linux_i686'
```

後日追記：Linux方面にはとんと疎いものでi686は32bitで64bitはx86_64になるようです。Linuxバイナリ互換機能は64bitバイナリもサポートしているので、x86_64でもちゃんと使えるようです。

FreeBSD 13.1でPythonが3.8から3.9になって動かなくなったので、再インストールしました。

```
% pio system info
--------------------------  -------------------------
PlatformIO Core             6.1.3
Python                      3.9.13-final.0
System Type                 linux_x86_64
Platform                    FreeBSD-13.1-RELEASE
File System Encoding        utf-8
Locale Encoding             UTF-8
PlatformIO Core Directory   /home/hiroki/.platformio
PlatformIO Core Executable  /usr/local/bin/platformio
Python Executable           /usr/local/bin/python
Global Libraries            0
Development Platforms       8
Tools & Toolchains          20
--------------------------  -------------------------
```

公式なサポートでもないし、たまたま使えてるだけなので、ご注意ください。

後日追記

こうしきのマニュアルにはFreeBSDもサポートしているとありますが、パッケージがそろってなかったりしたので、この方法が現実的に思えます。