@m_seki の

I like ruby tooから引っ越し

WiringPi-Ruby gemを動くようにした話(誰か引き取って

WiringPi-Ruby gemが3B+で動かなかったんだよ!

Raspberry Pi 3B+でWiringPi-Rubyが動かなかったので調べたんだが呪われていた。

おきたこと

環境はStretchってやつの最新にした3B+です。RubyでGPIO、SPIを利用した方のでwiringpi gemをインストール。
とあるAPI(wiringPiSetupGpio)を実行するとエラーでプロセスが終了してしまう。

期待した動き。

$ irb -r wiringpi
irb(main):001::0> Wiringpi.wiringPiSetupGpio
=> 0


実際の動き。

$ irb -r wiringpi
irb(main):001::0> Wiringpi.wiringPiSetupGpio
Unable to determine hardware version. I see: Hardware : BCM2835
- expecting BCM2708 or BCM2709.
..

調べた

検索するとライブラリの方を新しくすればいい(aptで新しいの入れろとかそういうの)とか、OSを古くすればいい、とか情報があったがどうも違う感じがする。
実際、wiriingPi(オリジナルのライブラリの方ね)のバージョンも新しい。しかもソースコードと違う文面のエラーが出てる。なんだこれ...。

んで、これはライブラリじゃなくてgemがおかしい気がする、と想像して調査。gem unpack wiringpiしてextconf.rbを見たところ、古いライブラリのソースコードが同梱されてた。うはー。なんで共有ライブラリをリンクしないんだよ。

それから、wiringPiのサイト読んでたらさー、今月初めの記事に「wiringPi – deprecated…」ってあったよ。

wiringPi – deprecated… | Wiring Pi

このgemも原因の一つになってたんじゃないか...

初fork、extconf.rb

数年間メンテナンスされてないみたいなので、forkしてみました。

https://github.com/seki/WiringPi-Ruby

extconf.rbを勘で修正して、ライブラリをリンクするようにしました。あと、SPIのところのバグ(RWでバッファの長さをstrlenしてるバグ)も直してcommitしてあります。
だれか引き取ってくれないかなあ。

あと、オリジナルのライブラリに入れ忘れている(ことがある)APIがあるそうなので、その場合にはその関数を呼ばないようにしてあります。

require 'mkmf'

$srcs = ['wiringpi_wrap.c']
$objs = $srcs.map{ |file| file.sub('.c','.o') }

have_library("rt", "shm_open")
have_library("wiringPi", "pinMode")
have_library("wiringPiDev", "lcd128x64clear")
if have_library("wiringPiDev", "softServoWrite")
  $defs << "-DHAVE_softServoWrite"
end

create_makefile('wiringpi/wiringpi')    

入れ方

git cloneしてから、

$ sudo gem uninstall wiringpi
$ gem build wiringpi
$ sudo gem install --local wiringpi-2.32.0.gem