Python RPi.GPIOのOpenWrtパッケージを作ってみた
モチベーション
Raspberry PiにRaspbianを載せるとちょっと重くなるので、自分は OpenWrt を載せることが多い。
Raspberry Piを使うならばGPIOが使えなければ始まらない(←何が!?)。 最近はPythonでコードを書いているので RPi.GPIOパッケージ を入れようとpipを走らせたものの、ビルドはめっちゃ遅いし Python.hがないよ! と怒られたので、メロスは激怒してパッケージ化しようと決意した。
Image Generatorを使って作成したパッケージを含むイメージを作成するところまでやっちゃう。
前提
- OpenWrtの Buildroot がすでに使える。
- Raspberry Pi用の .config はすでに用意してある。
- Image Generator も用意してある。
環境
- ビルド機はDebian 8.0。
- ビルド対象はChaos Calmer 15.05。
- ターゲットマシンはRaspberry Pi。
やり方
パッケージビルド用Makefileの作成
パッケージ用のソースはネットのどこかにあるものである場合が多いので、それを自動的に取得してきてパッケージ化するための Makefile を書けばOK。
自分が書いたものは Githubで公開 している。 書き方はOpenWrtのドキュメントを見ても良いし、Buildrootの feeds/packages/ の下にあるテキトーなパッケージの Makefile を見るのがとても参考になる。
パッケージ提供feedの作成
OpenWrtでは新しいパッケージを追加する場合にfeedというものを追加する。 なので作成したパッケージを追加するfeedを用意する。
と言っても、作成したパッケージ用Makefileが入ったディレクトリを含むgitレポジトリを用意すればいいだけ。 自分の場合、 python-rpi-gpio パッケージを作成したので feed用レポジトリ の構成は以下のようになった。
- python_rpiレポジトリ
- python-rpi-gpio/
- Makefile
- LICENSE
- README.rst
- python-rpi-gpio/
外に公開する場合にはきちんとLICENSEを定義してあげよう。
feedの追加
Buildrootのfeed設定に今作成したfeed用レポジトリを追加してやる。 こんな感じ。 feeds.conf に空行を入れたらエラーになった。
% vi feeds.conf
...
src-git python_rpi https://github.com/pman0214/python_rpi.git
...
src-git と書いていることから、もしかするとgit以外も使えるのかもしれない。 ドキュメント参照ということで。
あとは普通に、feedを取得してパッケージをインストール。
% ./scripts/feeds update python_rpi
% ./scripts/feeds install python-rpi-gpio
updateで feeds/ の下に python_rpi というディレクトリが作成される。 これはfeed用レポジトリのmasterだけを --single-branch でcloneしたもの。
installを実行すると packages/feeds/ の下に python_rpi というディレクトリが作成され、その下にinstallしたパッケージのリンクが作成される。 このディレクトリにあるものは make したときに呼び出されるということのようだ。
働いたらmake!
手順は How to Build a Single Package に書いてある。 まずはツール類をビルドする。
% make tools/install
% make toolchain/install
そしてパッケージをビルドする。
% make package/python-rpi-gpip/compile
Image Generatorでパッケージにアクセス
Image Generatorの repositories.conf の上の方にコメントアウトしてある行を参考にして、以下のように書く。
src custom file:///usr/src/openwrt/bin/brcm2708/packages
ここで、 /usr/src/openwrt がBuildrootへのパス。 今回のターゲットマシンはRaspberry Piなので、ビルドしたパッケージは bin/brcm2708/packages/ に格納されている。
あとはImage Generatorの PACKAGES で自分の作成したパッケージを指定すればOK。
追記(2016-04-25 18:15)
一番メモしたいと思っていた情報を書き忘れていた。 パッケージをビルドしただけでは Packages や Packages.gz が存在しないため、 repositories.conf を書き換えてもエラーになる。 パッケージを新たに追加した場合はBuildrootにおいて再インデックスが必要。
% make package/index