2022/08/01(月) [n年前の日記]
#1 [ruby] ruby-gtk2をWindows10上で動かしたい
Windows10 x64 21H2 + Ruby で、ruby-gtk2 を動かしたい。昨日動作確認したところ、どのバージョンの Ruby でも動いてくれなかったのだけど、しつこく試していたら動く組み合わせが少しだけ見つかった。
Ruby は、RubyInstaller 版。
_RubyInstaller for Windows
前提知識として、各gem に x86-mingw32 や x64-mingw32 とついているバージョンは、バイナリ(*.soファイル)も含んでいるのでインストール時にビルドしなくて済む。ついてないバージョンはソースからビルドすることになるので、DevKit のインストールも必要になる。
Ruby は、RubyInstaller 版。
_RubyInstaller for Windows
前提知識として、各gem に x86-mingw32 や x64-mingw32 とついているバージョンは、バイナリ(*.soファイル)も含んでいるのでインストール時にビルドしなくて済む。ついてないバージョンはソースからビルドすることになるので、DevKit のインストールも必要になる。
◎ Ruby 2.2.6 x86 の場合。 :
Windows10 x64 21H2 + Ruby 2.2.6 p396 x86-mingw32 では、以下の組み合わせで動作した。
ただし、Ruby 2.2.6 x86 をインストールした直後は、gem が使えなかった。
gem を使うためには、rubygems-update-2.7.11.gem をダウンロードして、ローカルからインストールして、gem (rubygems)をアップデートする必要がある。ちなみに、rubygems-update 2.7.11 の次バージョンは 3.0.0 になるけれど、そこからは Ruby 2.3.0 以上を要求されるので Ruby 2.2.6 では使えない。
gem のアップデートは、以下のページを参考にして作業した。
_Windowsでgem installでSSLのエラーが出た話 - Qiita
gem のアップデートができたら、cairo、glib2、gtk2 を、バージョンを指定してインストール。
そんなわけで、Ruby 2.2.6 x86-mingw32 + cairo 1.15.9 x86-mingw32 + gtk2 3.1.1 x86-mingw32 の組み合わせなら、ruby-gtk2 が一応動いてくれた。
- Ruby 2.2.6 x86-mingw32 + cairo 1.15.9 x86-mingw32 + gtk2 3.1.1 x86-mingw32
> ruby -v ruby 2.2.6p396 (2016-11-15 revision 56800) [i386-mingw32] > gem list | grep -E "gobject|gio2|gdk_pixbuf2|cairo|pango|atk|gtk2|glib2" atk (3.1.1 x86-mingw32) cairo (1.15.9 x86-mingw32) gdk_pixbuf2 (3.1.1 x86-mingw32) gio2 (3.1.1 x86-mingw32) glib2 (3.1.1 x86-mingw32) gobject-introspection (3.1.1 x86-mingw32) gtk2 (3.1.1 x86-mingw32) pango (3.1.1 x86-mingw32)
ただし、Ruby 2.2.6 x86 をインストールした直後は、gem が使えなかった。
gem を使うためには、rubygems-update-2.7.11.gem をダウンロードして、ローカルからインストールして、gem (rubygems)をアップデートする必要がある。ちなみに、rubygems-update 2.7.11 の次バージョンは 3.0.0 になるけれど、そこからは Ruby 2.3.0 以上を要求されるので Ruby 2.2.6 では使えない。
gem のアップデートは、以下のページを参考にして作業した。
_Windowsでgem installでSSLのエラーが出た話 - Qiita
wget https://rubygems.org/downloads/rubygems-update-2.7.11.gem gem install --local ./rubygems-update-2.7.11.gem update_rubygems --no-ri --no-rdoc
gem のアップデートができたら、cairo、glib2、gtk2 を、バージョンを指定してインストール。
gem install cairo -v 1.15.9 gem install glib2 -v 3.1.1 gem install gtk2 -v 3.1.1
- cairo 1.15.9 (2017/06/03) ならインストールできたし、require "cairo" も実行できた。
- しかし、gtk2 3.2.1 をインストールしたら、pango.so がロードできなくてエラーになった。
- cairo 1.15.9 と同時期の pango は 3.1.6 のはずだけど、glib2 3.1.6 や gtk2 3.1.6 をインストールしても pango.so がロードできなくてエラーになった。
- gtk2 3.1.1 をインストールしたところ、require "gtk2" が通った。
そんなわけで、Ruby 2.2.6 x86-mingw32 + cairo 1.15.9 x86-mingw32 + gtk2 3.1.1 x86-mingw32 の組み合わせなら、ruby-gtk2 が一応動いてくれた。
◎ Ruby 2.3.3 x86 の場合。 :
手元のメモによると、2019/04/19 の時点では、以下の組み合わせでも動いていたらしいのだけど…。
2022/08/01現在、上記の組み合わせでは何故か動かなくなっていた。
しかし、バージョンを変えて試していったところ、以下の組み合わせなら動作した。
ただ、インストール時に注意点がある。glib2 3.1.1 その他をインストールしようとした際、何故か cairo 1.15.14 も一緒にインストールされてしまう。cairo 1.15.14 は Ruby 2.3.3 x86 上で動かないので、そのままだと require "gtk2" をした時に「cairo.so が読み込めない」と言ってきて動かない。gem uninstall cairo で 1.15.14 をアンインストールして、1.15.9 だけを残した状態にすれば動く。
ちなみに、Ruby 2.3.3 x86-mingw32 も、インストールした直後は gem が動かない。rubygems-update 最新版を入手してアップデートする必要がある。
_Download RubyGems | RubyGems.org
rubygems-3.3.19.zip を入手して解凍。中に入って、ruby setup.rb を実行すればアップデートされる。
- Ruby 2.3.3 x86-mingw32 + cairo 1.15.14 x86-mingw32 + gtk2 3.2.9 x86-mingw32
- Ruby 2.3.3 x86-mingw32 + cairo 1.15.11 x86-mingw32 + gtk2 3.2.1 x86-mingw32
2022/08/01現在、上記の組み合わせでは何故か動かなくなっていた。
しかし、バージョンを変えて試していったところ、以下の組み合わせなら動作した。
- Ruby 2.3.3 x86-mingw32 + cairo 1.15.9 x86-mingw32 + gtk2 3.1.1 x86-mingw32
> ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [i386-mingw32] > gem list | grep -E "gobject|gio2|gdk_pixbuf2|cairo|pango|atk|gtk2|glib2" atk (3.1.1 x86-mingw32) cairo (1.15.9 x86-mingw32) cairo-gobject (3.1.1 x86-mingw32) gdk_pixbuf2 (3.1.1 x86-mingw32) gio2 (3.1.1 x86-mingw32) glib2 (3.1.1 x86-mingw32) gobject-introspection (3.1.1 x86-mingw32) gtk2 (3.1.1 x86-mingw32) pango (3.1.1 x86-mingw32)
ただ、インストール時に注意点がある。glib2 3.1.1 その他をインストールしようとした際、何故か cairo 1.15.14 も一緒にインストールされてしまう。cairo 1.15.14 は Ruby 2.3.3 x86 上で動かないので、そのままだと require "gtk2" をした時に「cairo.so が読み込めない」と言ってきて動かない。gem uninstall cairo で 1.15.14 をアンインストールして、1.15.9 だけを残した状態にすれば動く。
ちなみに、Ruby 2.3.3 x86-mingw32 も、インストールした直後は gem が動かない。rubygems-update 最新版を入手してアップデートする必要がある。
_Download RubyGems | RubyGems.org
rubygems-3.3.19.zip を入手して解凍。中に入って、ruby setup.rb を実行すればアップデートされる。
◎ Ruby 1.8.7 の場合。 :
◎ 余談。 :
それにしても、昔は Ruby の各バージョンで動いてたのに、どうして動かなくなってしまったのか…。Windows10 x64 21H2 側に原因があるのだろうか。それとも自分の環境に起因している不具合なのだろうか。
どうも Windows上でGTK関係は鬼門だなと…。
どうも Windows上でGTK関係は鬼門だなと…。
[ ツッコむ ]
#2 [ruby] ruby-gtk2は殺されていた
関連情報をググっていて今頃知ったのだけど、gtk2 (ruby-gtk2) は 3.4.3 が最終版で、3.4.4 以降は存在していない模様。
_mikutter GTK3対応(4) ?そして 5.0リリースへ? - tsutsuiの作業記録置き場
_News (2021-04-22 No.1) - Ruby-GNOME2 Project Website (WebArchive)
_ruby-gnome/NEWS at master - ruby-gnome/ruby-gnome
Ruby-GNOME (かつては ruby-gtk2 と ruby-gtk3 の両方を含んでいた) は、3.4.4 で色々なサポートを打ち切っていたらしい。
Windows版 Ruby 2.6.10 (x86-mingw32) 上で gtk2 をインストールしようとしてもエラーになるのはそのせいだった。
つまり、Windows版 Ruby 2.6.x でビルドが通る gtk2 のソースはそもそも存在してなかった、というオチだった。道理で、何度インストールを試みてもビルドエラーになってしまうわけで…。
_mikutter GTK3対応(4) ?そして 5.0リリースへ? - tsutsuiの作業記録置き場
_News (2021-04-22 No.1) - Ruby-GNOME2 Project Website (WebArchive)
_ruby-gnome/NEWS at master - ruby-gnome/ruby-gnome
Ruby-GNOME (かつては ruby-gtk2 と ruby-gtk3 の両方を含んでいた) は、3.4.4 で色々なサポートを打ち切っていたらしい。
- CentOS 6、Ubuntu Linux 16.04 のサポートを打ち切った。
- Ruby 2.4、Ruby 2.5 のサポートも打ち切った。
- そして、3.4.4 になったタイミングで、Ruby/GTK2 (ruby-gtk2) も削除(remove)されていた。
Windows版 Ruby 2.6.10 (x86-mingw32) 上で gtk2 をインストールしようとしてもエラーになるのはそのせいだった。
- glib2 については、3.4.3 になった際に、Windows上でもビルドができるように修正されていた。(「NEWS」内を「3.4.3」で検索すれば変更内容が把握できる。「Windows: Fixed a link errors.」と書いてある。) だから、gem install glib2 -v 3.4.3 でビルドが通った。
- しかし、gtk2 3.4.3 については放置されてしまったっぽい。だから gem install gtk2 -v 3.4.3 をしてもビルドエラーになる。
- 更に、3.4.4 になった際に ruby-gtk2 自体が削除された・非サポートになった。
つまり、Windows版 Ruby 2.6.x でビルドが通る gtk2 のソースはそもそも存在してなかった、というオチだった。道理で、何度インストールを試みてもビルドエラーになってしまうわけで…。
◎ ruby-gtk3は生きている。 :
ちなみに、Ruby 2.6.10 x86-mingw32、及び、Ruby 3.0.4 x86-mingw32 上で gtk3 をインストールしたら(gem install gtk3)、cairo 1.17.1 + gtk3 3.5.1 のビルドが通って gtk3 を使うことができた。
ruby-gtk2 は削除されてしまったけれど、ruby-gtk3 は今もメンテナンスされているし、一般的なGUIアプリを作りたいなら ruby-gtk3 を使えば済むはず、という状況ではあるらしい。
ruby-gtk2 は削除されてしまったけれど、ruby-gtk3 は今もメンテナンスされているし、一般的なGUIアプリを作りたいなら ruby-gtk3 を使えば済むはず、という状況ではあるらしい。
◎ 将来的な不安。 :
しかし、困った…。Windows上ではともかく、Debian Linux上では、まだ ruby-gtk2パッケージが用意されているから、ruby-gtk2 を使ったアプリも作れるだろうし、xscreensaver用のスクリーンセーバを Ruby + ruby-gtk2 で書くことだってできるのかもしれないけれど。公式には ruby-gtk2 が殺されてしまったわけだから、将来的には Debian Linux 上でも ruby-gtk2パッケージが消滅してしまいそうな気がする。そうなると、xscreensaver用スクリーンセーバを Ruby で書くこともできなくなるわけで…。ノリとしては、今から Flash を使ってスクリーンセーバを書くぞ、みたいなソレに結構近い可能性もありそうだなと。
ruby-gtk2 ではなく、ruby-gtk3 を使って xscreenaver用のスクリーンセーバを書くことができればいいのだろうけど、そのあたりは gtk3 に詳しい人じゃないとできないことだよな…。しかし、gtk3 でそんなことができるのかどうか…。
ruby-gtk2 ではなく、ruby-gtk3 を使って xscreenaver用のスクリーンセーバを書くことができればいいのだろうけど、そのあたりは gtk3 に詳しい人じゃないとできないことだよな…。しかし、gtk3 でそんなことができるのかどうか…。
この記事へのツッコミ
[ ツッコミを読む(1) | ツッコむ ]
以上、1 日分です。
Ruby 2.6.10 x86-mingw32 + cairo 1.17.x x86-mingw32 + gtk2 3.4.3 x86-mingw32 + popplerで動かしています!
いつの間にかmsysのgccが上がってそのままではRuby/Gtk2 gemでインストール時にビルドに失敗しますね。
上記の環境では、gcc 7.xだとRuby/Gtk2(3.4.3)すんなり入りました!