Buildrootにはシステム構築時にPythonの外部モジュールをインストールする仕組みが備わっている。比較的メジャーな外部モジュールはBuildrootのメニューの中に選択肢がデフォルトで用意されている他、それ以外もPyPIに登録されていればインストール出来る場合がある。ネット環境が無かったりメモリが貧弱なSBCではこのような仕組みは有り難い。以下、方法をまとめる。
BuildrootメニューにあるPython外部モジュールはチェックを入れるだけ
メジャーな外部モジュールならBuildrootメニューの中から選択可能。インストールしたいパッケージにチェックを入れたら、あとはmake実行でBuildrootの全体ビルドをすればシステムイメージの中にPython外部モジュールが自動的にインストールされる。
Python外部モジュールのメニューに到達する方法は、メニューを順番に辿る方法と、キーワード検索の2通りがある。
Buildrootメニューから探す
Buildrootメニューを順番に辿りPythonパッケージ一覧を表示して探す方法。インストール可能な外部モジュールを一覧確認しながら選びたい時はこれで良いだろう。
- Target packages
- Interpreter languages and scripting
- python3
- External python modules
- python3
- Interpreter languages and scripting
キーワード検索で探す
パッケージ名で検索も出来る。例えばnumpyのインストールをしたい場合は、以下の手順でOKだ。
- Buildrootの画面でキーボードから”/”(スラッシュ)入力すると検索画面になるので、numpyを入力してEnter。
- 検索候補の中から所望の物を探し、カッコの中の番号を押してメニューにジャンプする。この場合は”1″を押すとジャンプ。
- numpyのPythonパッケージ選択画面に飛ぶので、チェックを入れてnumpyインストール準備が完了する。
scanpypiを使う
scanpypiはBuildrootトップディレクトリ下util/に置かれているPythonスクリプト。Buildrootのメニューに無くてもPyPIに登録されているパッケージならscanpypiを使った以下の手順でインストール出来る場合がある。(うまく行くとは限らず、「インストール出来たらラッキー」ぐらいのイメージ)
対象PythonパッケージのPyPI登録名が’foo’のとき、
- まずは以下を実行
utils/scanpypi 'foo' -o package
この実行によってBuildrootのメニューに登録されているPython追加パッケージと同等の情報がPyPIサーバからダウンロードされ、Buildrootトップディレクトリ下package/python-‘foo’/へとコピーされる。 - package/Config.inをエディタで開いて、”External python modules”セクションに以下の1行を追加する。
source "package/python-'foo'/Config.in"
- make menuconfig実行でBuildrootインストールメニューを開く
- インストールメニューの外部Pythonパッケージ一覧にデフォルトの物と同様に’foo’が選択肢として選べる状態になっているので、デフォルトの物と同じ手順でチェックを入れる(キーワード検索も可能)
scanpypiでも駄目な時
上記の通り、PyPIに登録されているパッケージ全てがscanpypiを使ってインストール出来るわけではなく、中には駄目な物も存在する。
例えば、rpycというモジュールはscanpypiだとエラーで追加出来なかった。が、同じ壁にぶち当たった人がBuildroot用の設定をGitHubに公開してくれており、下記GitHubサブディレクトリをpackage/の下にコピーしたうえで、package/Config.inの”External python modules”セクションにrpycのエントリを追加すればインストール出来た。
scanpypiが駄目でも諦めずに探すと方法が見つかる場合もあるようだ。
まとめ
Buildrootを使ってPythonパッケージをシステムイメージにプリインストールする手順をまとめた。ターゲット上でpipが普通に使えればPythonパッケージのプリインストールなんて不要だが、リソースが貧弱なLichee Pi NanoのようなSBCでは有効な方法だと思う。
コメント