2017/10/25(水) [n年前の日記]
#1 [raspberrypi][ruby][gosu] Raspberry Pi Zero W に Ruby + gosu をインストールしようとしてハマっていたり
_Hello - Gosu
を眺めたら、「powered by OpenGL or OpenGL ES」というテキストを見かけたわけで。
今までてっきり、gosu は OpenGL にしか対応してないと思い込んでたけど、OpenGL ES にも対応していたのか…。であれば、ひょっとして、Raspberry Pi Zero W 上でもそこそこの速度で動くのではあるまいか。
てなわけで、Pi Zero W 上で gosu がインストールできないか試していたのだけど。これがなかなか上手く行かず。何度試しても、gosu-example の画面が出てこない…。真っ暗なまま…。
未だに成功してないけど、試してみた作業についてメモ。ちなみに環境は、Raspberry Pi Zero W + raspbian stretch。
今までてっきり、gosu は OpenGL にしか対応してないと思い込んでたけど、OpenGL ES にも対応していたのか…。であれば、ひょっとして、Raspberry Pi Zero W 上でもそこそこの速度で動くのではあるまいか。
てなわけで、Pi Zero W 上で gosu がインストールできないか試していたのだけど。これがなかなか上手く行かず。何度試しても、gosu-example の画面が出てこない…。真っ暗なまま…。
未だに成功してないけど、試してみた作業についてメモ。ちなみに環境は、Raspberry Pi Zero W + raspbian stretch。
◎ OpenGLを有効にすればインストールできなくもない。 :
Pi Zero W 上でも、GL driver を有効にして、Pi2 / Pi3 と同様のインストール手順を踏めば、一応は gosu をインストールできるし、gosu-example の画面も表示されることは確認できた。
_Getting Started on Linux - gosu/gosu Wiki
ただ、Zero W 上では、良くて20FPS前後しか出ない。これでは話にならない。Pi3 上なら、もうちょっと滑らかに動いたのだけどなあ…。
_Getting Started on Linux - gosu/gosu Wiki
sudo apt install build-essential libsdl2-dev libsdl2-ttf-dev libpango1.0-dev libgl1-mesa-dev libopenal-dev libsndfile-dev libmpg123-dev libgmp-dev sudo apt install ruby-dev sudo gem install gosu --pre sudo apt install ruby-rmagick libmagickcore-dev libmagickwand-dev pulseaudio freeglut3 freeglut3-dev sudo gem install chipmunk opengl glu glut rmagick sudo gem install gosu-examples gosu-examples
ただ、Zero W 上では、良くて20FPS前後しか出ない。これでは話にならない。Pi3 上なら、もうちょっと滑らかに動いたのだけどなあ…。
◎ OpenGLを有効にしないでインストールしたい。 :
Pi Zero系は、公式にはOpenGLをサポートしてないので、できれば OpenGL を使わない形でインストールしたい。以下のページに従ってインストールすれば動くのかな、と思ったのだけど…上手く行かない…。
_Getting Started on Raspbian (Raspberry Pi) - gosu/gosu Wiki
とりあえず、失敗事例としてメモ。
ビルドに必要なパッケージをインストール。
後になって分かったけど、どうやら libmpg123-dev も必要らしい。
_Getting Started on Raspbian (Raspberry Pi) - gosu/gosu Wiki
とりあえず、失敗事例としてメモ。
ビルドに必要なパッケージをインストール。
sudo apt-get install ruby ruby-dev build-essential libfreeimage-dev libopenal-dev libpango1.0-dev libsndfile-dev libudev-dev libasound2-dev「注意、'libsndfile-dev' の代わりに 'libsndfile1-dev' を選択します」と言われてしまったが、一応インストールできた。
後になって分かったけど、どうやら libmpg123-dev も必要らしい。
sudo apt-get install libmpg123-dev
◎ SDL2をビルド。失敗事例その1。 :
SDL2 をビルドする。まずは、SDL2関係を入れておくためのディレクトリを作っておいて。
SDL2関係のソースをDL。現行版は 2.0.7 だった。また、SDL_ttf 2.0 もDLしておく。
_Simple DirectMedia Layer - SDL version 2.0.7 (stable)
_SDL_ttf 2.0
SDL2のソースを解凍してmakeする。1時間以上かかる、と件の説明ページには書かれてたけど、Zero W では30分ぐらいで済んだ。
ビルドできたようなら root権限でインストール。
SDL_ttfのソースも解凍してmakeする。これは1分もかからなかった。
何か言ってきた。「/opt/SDL2/lib にインストールしたぞ」「共有ライブラリとして使えるようにするには以下を参考にしろ」と言ってるのかな。
これでSDL2関係はインストールできたはず。なのだけど…。
mkdir ~/Package cd ~/Package mkdir gosu cd gosu
SDL2関係のソースをDL。現行版は 2.0.7 だった。また、SDL_ttf 2.0 もDLしておく。
_Simple DirectMedia Layer - SDL version 2.0.7 (stable)
_SDL_ttf 2.0
wget https://www.libsdl.org/release/SDL2-2.0.7.tar.gz wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-2.0.14.tar.gz
SDL2のソースを解凍してmakeする。1時間以上かかる、と件の説明ページには書かれてたけど、Zero W では30分ぐらいで済んだ。
tar zxvf SDL2-2.0.7.tar.gz cd SDL2-2.0.7/ ./configure --prefix=/opt/SDL2 --disable-video-x11 make
- configure に指定してる --prefix=/opt/SDL2 は「ビルド後のファイルのインストール場所を /opt/SDL2 にしろ」てな指定。この指定が無い場合、 /usr/local/ 以下にビルドしたファイルがインストールされる模様。
- --disable-video-x11 は、動作に X を必要としない設定にしろ、という指定じゃないかな。たぶん。
ビルドできたようなら root権限でインストール。
sudo make install
SDL_ttfのソースも解凍してmakeする。これは1分もかからなかった。
cd .. tar zxvf SDL2_ttf-2.0.14.tar.gz cd SDL2_ttf-2.0.14 ./configure --prefix=/opt/SDL2 make sudo make install
何か言ってきた。「/opt/SDL2/lib にインストールしたぞ」「共有ライブラリとして使えるようにするには以下を参考にしろ」と言ってるのかな。
---------------------------------------------------------------------- Libraries have been installed in: /opt/SDL2/lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to `/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ----------------------------------------------------------------------
これでSDL2関係はインストールできたはず。なのだけど…。
◎ gosuをビルド。失敗事例。 :
gosu をインストール、というかビルド。
エラーが出た。
ひょっとすると、SDL2をビルドする際の configure のオプションが違うのかもしれない。 _Getting Started on Raspbian (Raspberry Pi) - gosu/gosu Wiki には、
この状態で、もう一度 gosu をインストール。…さっきと同じエラーが出た。
エラーメッセージには、「mpg123.h が見つからねえよ」と書いてあるようにも見える。ググってみたら、以下のやり取りに遭遇。「mpg123.h が欲しいなら libmpg123-dev を apt でインストールしてみろや」と言ってるのかな。
_Play mp3 on raspberry with mpg123 and c++ - Stack Overflow
libmpg123-dev とやらをインストールしてみる。
もう一度 gosu をインストール。15分以上時間がかかったけど、ビルドが通ってインストールできたっぽい。
ということは、libmpg123-dev が足りてなかっただけか…。であれば、最初の configure オプションで SDL2 を make し直して、gosu もアンインストール・再インストールしてみよう…。
gosuをアンインストール。
その後、SDL2を、オプションを変えてビルドし直して、インストール。gosu も再インストール。
gosu-examples をインストールして動作確認。
画面が出ない…。すると、たくさんオプションがついてるほうの configure で SDL2 をビルドしないとダメってことかな。
たくさんオプションがついてるほうで試してみたけど、やっぱり画面が出ない。うーん。
sudo gem install gosu -- --with-cflags=-I/opt/SDL2/include/SDL2 --with-cppflags=-I/opt/SDL2/include/SDL2 --with-ldflags=\"/opt/SDL2/lib/libSDL2.a /opt/SDL2/lib/libSDL2_ttf.a\"
エラーが出た。
$ sudo gem install gosu -- --with-cflags=-I/opt/SDL2/include/SDL2 --with-cppflags=-I/opt/SDL2/include/SDL2 --with-ldflags=\"/opt/SDL2/lib/libSDL2.a /opt/SDL2/lib/libSDL2_ttf.a\" Fetching: gosu-0.12.1.gem (100%) Building native extensions with: '--with-cflags=-I/opt/SDL2/include/SDL2 --with-cppflags=-I/opt/SDL2/include/SDL2 --with-ldflags="/opt/SDL2/lib/libSDL2.a /opt/SDL2/lib/libSDL2_ttf.a"' This could take a while... ERROR: Error installing gosu: ERROR: Failed to build gem native extension. current directory: /var/lib/gems/2.3.0/gems/gosu-0.12.1/ext/gosu /usr/bin/ruby2.3 -r ./siteconf20171024-11477-11cwjm7.rb extconf.rb --with-cflags=-I/opt/SDL2/include/SDL2 --with-cppflags=-I/opt/SDL2/include/SDL2 --with-ldflags="/opt/SDL2/lib/libSDL2.a /opt/SDL2/lib/libSDL2_ttf.a" The Gosu gem requires some libraries to be installed system-wide. See the following site for a list: https://github.com/gosu/gosu/wiki/Getting-Started-on-Linux checking for TTF_RenderUTF8_Blended() in -lSDL2_ttf... no checking for main() in -lopenal... yes checking for AL/al.h... yes creating Makefile To see why this extension failed to compile, please check the mkmf.log which can be found here: /var/lib/gems/2.3.0/extensions/arm-linux/2.3.0/gosu-0.12.1/mkmf.log current directory: /var/lib/gems/2.3.0/gems/gosu-0.12.1/ext/gosu make "DESTDIR=" clean current directory: /var/lib/gems/2.3.0/gems/gosu-0.12.1/ext/gosu make "DESTDIR=" compiling ../../src/Audio.cpp In file included from ../../src/Audio.cpp:24:0: ../../src/MPEGFile.hpp:9:20: fatal error: mpg123.h: そのようなファイルやディレクトリはありません #include <mpg123.h> ^ compilation terminated. Makefile:231: ターゲット 'Audio.o' のレシピで失敗しました make: *** [Audio.o] エラー 1 make failed, exit code 2 Gem files will remain installed in /var/lib/gems/2.3.0/gems/gosu-0.12.1 for inspection. Results logged to /var/lib/gems/2.3.0/extensions/arm-linux/2.3.0/gosu-0.12.1/gem_make.out
ひょっとすると、SDL2をビルドする際の configure のオプションが違うのかもしれない。 _Getting Started on Raspbian (Raspberry Pi) - gosu/gosu Wiki には、
If you are already using Raspbian Jessie, try this variant of the ./configure command instead:とか書いてあるし…。オプションを変えて、SDL2をビルドし直してみる。
cd .. cd SDL2-2.0.7 make clean ./configure --host=armv7l-raspberry-linux-gnueabihf --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl make sudo make install
- --host=armv7l-raspberry-linux-gnueabihf は、Pi2 / Pi3 の場合に渡すオプションだった。この時点では意味が分からず指定しちゃってる。
- Pi1 や Zero 系は ARMv6 なので、--host=arm-raspberry-linux-gnueabihf を指定するのだろうか? それとも、そこは何も指定しなくてもいいのだろうか?
- --disable-* で色々な機能を無効化してる。--disable-video-opengl で OpenGL を無効にすることで、OpenGL ES が使われるようになる、のかな。自信無し。
この状態で、もう一度 gosu をインストール。…さっきと同じエラーが出た。
エラーメッセージには、「mpg123.h が見つからねえよ」と書いてあるようにも見える。ググってみたら、以下のやり取りに遭遇。「mpg123.h が欲しいなら libmpg123-dev を apt でインストールしてみろや」と言ってるのかな。
_Play mp3 on raspberry with mpg123 and c++ - Stack Overflow
libmpg123-dev とやらをインストールしてみる。
sudo apt install ilbmpg123-dev
もう一度 gosu をインストール。15分以上時間がかかったけど、ビルドが通ってインストールできたっぽい。
ということは、libmpg123-dev が足りてなかっただけか…。であれば、最初の configure オプションで SDL2 を make し直して、gosu もアンインストール・再インストールしてみよう…。
gosuをアンインストール。
sudo gem uninstall gosu
その後、SDL2を、オプションを変えてビルドし直して、インストール。gosu も再インストール。
gosu-examples をインストールして動作確認。
sudo gem install gosu-examples gosu-examples --fullscreen
画面が出ない…。すると、たくさんオプションがついてるほうの configure で SDL2 をビルドしないとダメってことかな。
たくさんオプションがついてるほうで試してみたけど、やっぱり画面が出ない。うーん。
◎ gosuに必要なgemをインストール。 :
そういえば、gosu-examples を実行した際、「○○がねえよ」と怒られた。他にも、rmagick、chipmunk、gl 等が必要らしい。そのあたりも全部インストールしておく。
sudo apt install ruby-rmagick libmagickcore-dev libmagickwand-dev pulseaudio freeglut3 freeglut3-dev sudo gem install chipmunk opengl glu glut rmagick
◎ SDL2をまたビルド。 :
以下のページで、Raspberry Pi に SDL2 をインストールする方法について説明されてた。今度は、この内容に従ってビルドしてみよう…。
_Raspberry Pi - Building SDL 2 on Raspbian | Solarian Programmer
make clean を実行してビルドしたファイルを消去してから、configure を実行。
もう一度 make して、sudo make install をする。
gosu をアンインストールして、再インストール。
gosu-example を実行してみた。ダメだった。
_Raspberry Pi - Building SDL 2 on Raspbian | Solarian Programmer
sudo apt-get install build-essential libfreeimage-dev libopenal-dev libpango1.0-dev libsndfile-dev libudev-dev libasound2-dev libtiff5-dev libwebp-dev automake前述のページの説明では libjpeg8-dev もインストールしてるけど、試してみたら、libjpeg8-dev が、libjpeg-dev、libjpeg62-turbo-dev と競合すると言ってきたので、そこだけは除外した。
make clean を実行してビルドしたファイルを消去してから、configure を実行。
cd ~/Package/gosu/SDL2-2.0.7 make clean mkdir build && cd build ../configure --prefix=/opt/SDL2 --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl件のページによると、「--host=armv7l-raspberry-linux-gnueabihf の指定は Raspberry Pi2用」と書いてあるな…。そこだけ除外しておけばいいのかな?
もう一度 make して、sudo make install をする。
make sudo make install
gosu をアンインストールして、再インストール。
sudo gem uninstall gosu sudo gem install gosu -- --with-cflags=-I/opt/SDL2/include/SDL2 --with-cppflags=-I/opt/SDL2/include/SDL2 --with-ldflags=\"/opt/SDL2/lib/libSDL2.a /opt/SDL2/lib/libSDL2_ttf.a\"
gosu-example を実行してみた。ダメだった。
◎ 他のSDL2関係もインストール。 :
SDL_image 2.0 等も必要になるのだろうか。そっちもインストールしてみるか…。
_SDL_image 2.0
_SDL_mixer 2.0
_SDL_image 2.0
_SDL_mixer 2.0
cd ~/Package/gosu wget https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.0.2.tar.gz wget https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.2.zip
tar zxvf SDL2_image-2.0.2.tar.gz cd SDL2_image-2.0.2/ mkdir build cd build ../configure --prefix=/opt/SDL2 make sudo make install
cd ../../SDL2_ttf-2.0.14 ../configure --prefix=/opt/SDL2 make sudo make install
◎ SDL2インストールの別記事を参考にして作業。 :
別記事も見かけたので、そちらに従ってインストールもしてみたり。この場合、/usr/local/ にインストールされる模様。
_SDL2-2.0.6 on Raspberry Pi - ChoccyHobNob
この例では、hg (Mercurial) を使って、SDL2 の最新版のソースをクローンしてる模様。
ビルドは以下。この例では、--host=arm-raspberry-linux-gnueabihf を指定してるな…。
他の SDL関係をビルドしてインストール。
これでもダメだった。
_SDL2-2.0.6 on Raspberry Pi - ChoccyHobNob
sudo apt-get install libfontconfig-dev qt5-default automake mercurial libtool libfreeimage-dev libopenal-dev libpango1.0-dev libsndfile-dev libudev-dev libtiff5-dev libwebp-dev libasound2-dev libaudio-dev libxrandr-dev libxcursor-dev libxi-dev libxinerama-dev libxss-dev libesd0-dev freeglut3-dev libmodplug-dev libsmpeg-dev libgmp-dev
この例では、hg (Mercurial) を使って、SDL2 の最新版のソースをクローンしてる模様。
hg clone http://hg.libsdl.org/SDL cd SDL
ビルドは以下。この例では、--host=arm-raspberry-linux-gnueabihf を指定してるな…。
./autogen.sh ./configure --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-opengl --host=arm-raspberry-linux-gnueabihf makesudo make install sudo make install
他の SDL関係をビルドしてインストール。
cd cd code wget https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.0.2.tar.gz wget https://www.libsdl.org/projects/smpeg/release/smpeg2-2.0.0.tar.gz wget https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.2.tar.gz wget https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.0.1.tar.gz wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-2.0.14.tar.gz
tar zxvf SDL2_image-2.0.2.tar.gz tar zxvf smpeg2-2.0.0.tar.gz tar zxvf SDL2_mixer-2.0.2.tar.gz tar zxvf SDL2_net-2.0.1.tar.gz tar zxvf SDL2_ttf-2.0.14.tar.gz
cd SDL2_image-2.0.1 ./autogen.sh ./configure make sudo make install cd ..
cd SDL2_ttf-2.0.14 ./autogen.sh ./configure make sudo make install cd ..
これでもダメだった。
◎ ビルドしてインストールしたアレコレをアンインストール。 :
ビルドしてインストールしてしまったアレコレをアンインストールする時は、以下でいいらしい。たぶん。自信無いけど。
ちなみに、make する際に作られたアレコレは以下で削除できる。のかな。たぶん。
sudo make uninstall
ちなみに、make する際に作られたアレコレは以下で削除できる。のかな。たぶん。
make clean
◎ libsdl2-dev等のパッケージを再インストール。 :
一応メモ。自分でSDL2 をビルドせずに、公式リポジトリから再インストールする際は以下。
sudo aptitude reinstall libsdl2-2.0-0 libsdl2-dev sudo aptitude reinstall libsdl2-image-2.0-0 libsdl2-image-dev sudo aptitude reinstall libsdl2-mixer-2.0-0 libsdl2-mixer-dev sudo aptitude reinstall libsdl2-ttf-2.0-0 libsdl2-ttf-dev libsdl-ttf2.0-0 libsdl-ttf2.0-dev
◎ Raspberry Pi上でgosuを利用する際の注意点。 :
まだ動かせてないわけだけど、説明ページでは、以下の注意事項が書いてあるように見えた。一応メモ。
_inoremap/shut-term-keys: Workaround for keystrokes leaking into terminal on Raspbian
- 「キー入力が端末に打ち込まれていくので危ないよ。知らない間にヤバイ系のコマンドを実行しちゃうかもしれないよ」
- 「Raspberry Pi上で gosu を使うとフルスクリーンでしか描画できないよ」
_inoremap/shut-term-keys: Workaround for keystrokes leaking into terminal on Raspbian
◎ 関係ありそうなページをメモ。 :
要するに、Pi Zero上での SDL2 のビルドとインストールが鬼門なのだろうけど…。
_Golang と SDL2 でゲームを作る - KaoriYa
_Getting Started on Raspbian (Raspberry Pi) - gosu/gosu Wiki
_Getting Started on Linux - gosu/gosu Wiki
_SDL2-2.0.6 on Raspberry Pi - ChoccyHobNob
_Raspberry Pi - Building SDL 2 on Raspbian | Solarian Programmer
_Problems using SDL2 on raspberry pi without X11 running - SDL Development - Simple Directmedia Layer
_SDL2 version 2.0.4 package availability - Raspberry Pi Forums
_Installing SDL2 on Raspbian Jessie
_[SOLVED]Building/Installing SDL2 on RaspBerryPi - SDL Development - Simple Directmedia Layer
_Play mp3 on raspberry with mpg123 and c++ - Stack Overflow
_SDL2 hardware acceleration - Raspberry Pi Forums
「SDL_ttf 2.0 は OpenGLにしか対応してなくて、OpenGL ES には非対応」という話が気になる。そのせいで画面が出なかったのだろうか…?
しかし、gosu の起動時に、EGL display が get できなかった、というエラーメッセージが表示されてた時もあったし…。そもそも EGL が使えていない気配も…。
_Golang と SDL2 でゲームを作る - KaoriYa
_Getting Started on Raspbian (Raspberry Pi) - gosu/gosu Wiki
_Getting Started on Linux - gosu/gosu Wiki
_SDL2-2.0.6 on Raspberry Pi - ChoccyHobNob
_Raspberry Pi - Building SDL 2 on Raspbian | Solarian Programmer
_Problems using SDL2 on raspberry pi without X11 running - SDL Development - Simple Directmedia Layer
_SDL2 version 2.0.4 package availability - Raspberry Pi Forums
_Installing SDL2 on Raspbian Jessie
_[SOLVED]Building/Installing SDL2 on RaspBerryPi - SDL Development - Simple Directmedia Layer
_Play mp3 on raspberry with mpg123 and c++ - Stack Overflow
_SDL2 hardware acceleration - Raspberry Pi Forums
「SDL_ttf 2.0 は OpenGLにしか対応してなくて、OpenGL ES には非対応」という話が気になる。そのせいで画面が出なかったのだろうか…?
しかし、gosu の起動時に、EGL display が get できなかった、というエラーメッセージが表示されてた時もあったし…。そもそも EGL が使えていない気配も…。
[ ツッコむ ]
#2 [raspberrypi][python][pygame] Raspberry Pi Zero W上でpygameを動かしてみたけど
以前作成した、640x480 のウインドウ内で BG x 2 + スプライト160枚を pygame で描画するスクリプトを、Raspberry Pi Zero W + raspbian stretch 上で動かしてみたけれど。
8FPSしか出なかった…。
スプライトを非表示にしても17fpsとかそんな感じなので厳しいなと。やはり Zero系の非力なCPUで、ソフトウェア描画なんてするもんじゃない、ということかなと。
8FPSしか出なかった…。
スプライトを非表示にしても17fpsとかそんな感じなので厳しいなと。やはり Zero系の非力なCPUで、ソフトウェア描画なんてするもんじゃない、ということかなと。
[ ツッコむ ]
以上、1 日分です。