PlatformIO(pio)のCLIはpythonで作られているのでラッパーのスクリプトはFreeBSDでも動きますがツールチェインのバイナリが用意されていないので、ビルドはできません。
ツールチェインをFreeBSD用に用意するのは大変なので、FreeBSDにはLinuxバイナリ互換機能があるので、これを使う方法を思いつきました。
環境はBastilleBSDを使うので、こちらのページを参考に設定します。pythonもインストールしておきます。
pythonのパッケージマネージャのpipはpkgになってないので、手動で入れます。
% sudo bastille cmd piojail python -m ensurepip
pioをインストールします。
% sudo bastille cmd piojail pip3 install -U platformio
これでプロジェクトは作れるようになります。
しかし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を偽装します。
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
-------------------------- -------------------------
公式なサポートでもないし、たまたま使えてるだけなので、ご注意ください。