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用レポジトリ の構成は以下のようになった。

外に公開する場合にはきちんと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)

一番メモしたいと思っていた情報を書き忘れていた。 パッケージをビルドしただけでは PackagesPackages.gz が存在しないため、 repositories.conf を書き換えてもエラーになる。 パッケージを新たに追加した場合はBuildrootにおいて再インデックスが必要。

% make package/index