2022年5月8日日曜日

PlatformIOのビルド環境のバージョンや参照先を切り替える


背景

PlatformIOとは、Arduinoなどのマイコンの開発環境です。
先日STM32Arduinoでライブラリをビルドできない不具合に遭遇し、環境を切り替えつつ原因を探る機会がありました。
同様の問題が起こった際に切り替え方法を調べ直すことになりそうなので、備忘録を兼ねて記事を残します。

使ったもの

  • PlatformIO
  • git
    gitに紐付いたコードの配置にはLinuxでもWindowsでもgitのインストールが必須です。Ubuntuの場合は下記のコマンドでインストールできます。
    sudo apt install git
    Windowsの場合はgit for windowsをインストールしてください。

変更前の素のプロジェクト

下記のコマンドでnucleo_l552ze_q向けにプロジェクトを作りました。

それのplatformio.iniファイルはこちらです。
platformio.ini
[env:nucleo_l552ze_q]
platform = ststm32
board = nucleo_l552ze_q
framework = arduino

このファイルを書き換えます。

platfromの切り替え方

platformioの説明のupstreamにあるように、platformの指定をgitのurlすることでgitで管理されたコードがビルドに使われます。
githubにPCのsshキーを登録していれば、platformのurlはgitで始まるもの(git@github.com:platformio/platform-ststm32.git)も利用可能です。
platformio.ini
; platform = ststm32
platform = https://github.com/platformio/platform-ststm32.git
gitに紐付いている必要はなくバージョンだけ切り替えたい場合は@を付けて切り替えられます。

platformio.ini
platform = stm32@2.1.0

platformのコードはUnix (LinuxやMac)もWindowsも同様に「~/.platformio/platforms」に配置されます。

自分が試したときは、gitのコミットのhashが名前に含まれたディレクトリが配置されました。


試行錯誤した末にgithubにアップロードしたい場合は、上記のgitで管理されているコードに変更を加えます。

frameworkの切り替え方

platformが利用しているframeworkはplatformのPackageに表示されています。
frameworkを切り替える場合は、platformio.iniにplatform-packagesという設定を追加し、それに該当するframeworkの名前と、切り替え先のgitのurlを指定します。
このときのurlはgitで始まるものだとエラーになるので、httpsやhttpで始まるものを指定してください。

今回はstm32のarduino環境を変えたかったので、それに該当するframework-arduinoststm32に対して、stm32duino/Arduino_Core_STM32のhttpsのgitのurlを割り当てました。
platformio.ini
platform_packages =
framework-arduinoststm32 @ https://github.com/stm32duino/Arduino_Core_STM32.git

frameworkなどは「~/.platformio/packages」に配置されます。


コードを変えてビルドを試した上てgitにコミットしたい場合は、上記のgitで管理されている方のframeworkのコードを扱ってください。

余談1: frameworkのバージョン番号はPlatformIO独自設定

今回置き換えたframework-arduinoststm32を例にバージョン番号の扱いを解説します。

記事を書いている時点でframework-arduinoststm32の参照元であるstm32duino/Arduino_Core_STM32のバージョンは2.2.0です。


しかしながら、記事を書いている時点でのplatform-ststm32のframework-arduinoststm32のバージョンは4.20200.0以上と設定されています。


この4.20200.0というバージョンがどこにあるか調べたところPlatformIOの独自管理しているplatformio/framework-arduinoststm32にありました。


PlatformIOはframeworkをそれ自身のライブラリとして管理しているらしく、それのバージョン番号がplatform-ststm32で管理されるframework-arduinoststm32のバージョン番号になっていました。
PlatformIOのライブラリの詳細ページにはプラットフォーム名でのgoogle検索からでも辿れますが、各platformのPackage一覧のリンクから辿れます。

PlatformIOが管理するバージョン番号は公開日時を示しています。


記事を書いている時点で最新版であるArduino Core for STM32 2.2.0の公開日は2021/12/21なので、PlatformIOが管理するコードの方が日時が新しいです。
(コードの中身も新しいかは不明です。)

余談2: frameworkのバージョン指定は「特定のもの以上」となっているので、以前のバージョンを試したい場合はframeworkのバージョンも指定が必要な場合がある

freameworkのリポジトリのバージョンとplatformioが管理するバージョンが異なり、PlatformIOのplatformはframeworkを「特定のもの以上」と指定しています。

自分は過去にesp32のPlatformIOの環境を更新したら不具合が発生し、platformのバージョンを古くしても元に戻らないことから、急ぎの不具合修正に迫られたことがありました。

PlatformIOのframeworkの指定方法が「特定のもの以上」であると分かったので、上記のような場面に遭遇した場合は、frameworkのバージョンも過去の物に指定することで直る可能性があります。

終わり

PlatformIOでplatformやframeworkをgitに紐付いたコードに置き換えられました。
置き換えた上でコードを変えれば、gitでdiffが分かりやすく、変更内容をコミットしてpushしやすいので、開発時や不具合対応時に便利だと思います。

まが、platformでのframeworkのバージョン指定は「特定のもの以上」となっているのが分かったので、環境更新で不具合が発生し、platformのバージョンを戻しても動かない場合は、frameworkのバージョンを下げると効果がある場面があるかもしれません。

参考

Set framework version?
ST STM32 - PlatformIO
platformio/framework-arduinoststm32
platformio/platform-ststm32
stm32duino/Arduino_Core_STM32

0 件のコメント :