ruby-gnome2 for win32 作業中

全体の流れ(予定)

  1. 必要なものを集める
    1. MinGW, MSYS
    2. ruby-1_8_6 current
    3. ruby-gnome2-all-0.18.1
    4. rcairo-1.6.3
    5. Gtk for win32
      1. gtk-dev-2.12.9-win32-2: gladewin32
      2. その他いろいろ
    6. NSIS
  2. rubymingw で build
  3. ruby-gnome2 を build
  4. NSIS でインストーラ作成

基本的には ruby-gnome2/win32installer/trunk/HOWTO.txt あたりをトレース.
Masao 神.


ちなみに,作業ディレクトリはこんな感じ.

  • C:/
    • GTK/ .............. gladewin32
    • ruby-gnome2/
      • rcairo-1.6.3/
      • ruby-1_8_6/
      • ruby-gnome2-all-0.18.1/
      • win32installer/trunk/
      • target/ .......... dist

ruby の build

./configure --prefix=/ruby-gnome2/target
make
make install

まあここまでは楽勝.

PKG_CONFIG_PATH の設定

export PKG_CONFIG_PATH=C:\\GTK\\lib\\pkgconfig

はい,gladewin32 を使ってないのがバレてますね

ruby-gnome2/glib の build

まずは glib

cd glib
/c/ruby-gnome2/target/bin/ruby.exe extconf.rb --ruby=/c/ruby-gnome2/target/bin/ruby.exe
make

make install
make install しない

rcairo の build

gladewin32 の cairo が 1.6.4 なので,rcairo-1.6.3 を持ってきてみた.

gladewin32 の lib/pkgconfig/cairo.pc の修正

win32 版の cairo-1.6.4 は pixman-1 を static link してるので不要.
gnome.org から落とせる cairo-dev-1.6.4-2.zip の cairo.pc では修正されている.
参考: http://www.nabble.com/pixman-1-was-not-found-in-the-pkg-config-td16842574.html

--- cairo.pc.org        Sun Apr 20 01:14:48 2008
+++ cairo.pc    Sat Dec  6 19:34:08 2008
@@ -7,7 +7,7 @@
 Description: Multi-platform 2D graphics library
 Version: 1.6.4
 
-Requires.private: freetype2 >= 9.7.3 fontconfig libpng12 pixman-1 >= 0.10.0 
+Requires.private: freetype2 >= 9.7.3 fontconfig libpng12 
 Libs: -L${libdir} -lcairo
 Libs.private: -lz -lz -lm
 Cflags: -I${includedir}/cairo
なぜか cairo が見つからないー見つけられないー

めんどくさいので cairo-dev-1.6.4-2/include/cairo/*.h と libcairo.dll.a をこぴぺ
参照: http://www.ruby-forum.com/topic/161513

やっとこさ build
/c/ruby-gnome2/target/bin/ruby.exe extconf.rb --ruby=/c/ruby-gnome2/target/bin/ruby.exe
make
make install

make install する

おなかすいた

ごはんまだーー

了解

まずは GTK-dev for win32 を作らないとなのね

再開

基本的には http://ftp.gnome.org/pub/binaries/win32 から
hoge.zip と hoge-dev.zip を落としてきて展開して C:\GTK にガッとコピー.
あとは pkgconfig がなんとかしてくれる?
バージョンは基本的には 2.24 系を回避しつつ適宜新しいのを選んでみた.
特に根拠はない.
以下は ruby-gnome2 のサブディレクトリと,突っ込んだ gnome のライブラリ群.この順.
依存関係は多分 C:\GTK\lib\pkgconfig\*.pc をひたすら読むのが速い.
動いてくれたらいいなー

glib

なし

pango

なし

gtk

なし

atk

なし

gdkpixbuf
  • gail-1.22.0
gconf
  • GConf-2.20.0
  • ORBit2-2.14.3
libart

jpeglib の boolean やら INT32 やらが MinGW 標準の header と衝突してハマる.
INT32 は int と long なのでとりあえずスルーすることにして (#define XMD_H),
boolean は int (jmorecfg.h) と unsigned char (rpcndr.h < winsock2.h < windows.h) なので困った.
というか,boolean なんて勝手に定義してんじゃねーです.
まあ,どうせここで rpcndr.h なんて使わないし,めんどくさいので,こんな感じで回避.怖.
これはさすがにあんまりやなぁ…

--- rbart_canvas.c          Thu Oct 23 22:24:04 2008
+++ rbart_canvas.c.mingw32  Sat Dec  6 23:36:02 2008
@@ -11,7 +11,17 @@
 
 **********************************************************************/
 
+/* jpeglib conflicts with the headers in MinGW
+ * INT32: long (jmorecfg.h) <=> int (basestd.h)
+ * boolean: int (jmorecfg.h) <=> unsigned char (rpcndr.h)
+ *
+ * use INT32 of basestd.h and boolean of jpeglib
+ */
+#define XMD_H
+
+#define boolean boolean2
 #include "rbart.h"
+#undef boolean
 
 #include <jpeglib.h>
 #include <png.h>
gnomeprint
  • libgnomeprint-1.12.1
gnomeprintui
  • libgnomeprintui-1.12.1
gnomecanvas
  • libgnomecanvas-2.22.0
gnome
  • libgnome-2.20.1
  • libgnomeui-2.22.1

rbgnome.h が sys/time.h を include してるが,これが ruby/win32/win32.h と衝突する.
とりあえず sys/time.h を回避.

--- rbgnome.h          Thu Oct 23 22:24:04 2008
+++ rbgnome.h.mingw32  Sun Dec  7 00:02:45 2008
@@ -20,7 +20,9 @@
 
 #define ENABLE_NLS 1
 
+#ifndef __MINGW32__
 #include <sys/time.h>
+#endif
 #include <gnome.h>
 
 #undef PATH_SEP
gtkglext

なし

libglade

なし

goocanvas
  • goocanvas-0.12
rsvg

なし

gtksourceview
  • gtksourceview-1.8.5
gtksourceview2
  • gtksourceview-2.2.2
bonoboui
  • libbonoboui-2.22.0
bonobo
  • libbonobo-2.22.0

はい,win32 に X なんてあるはずがないですね.

--- rbbonobo-main.c          Sun Dec  7 01:03:22 2008
+++ rbbonobo-main.c.mingw32  Sun Dec  7 01:03:46 2008
@@ -97,7 +97,10 @@
 rbonobo_setup_x_error_handler(self)
     VALUE self;
 {
+#ifdef __MINGW32__
+#else
     bonobo_setup_x_error_handler();
+#endif
     return self;
 }
gstreamer

パス

gtkhtml2

今はgtkhtml3なのでぁ…?

gtkmozembed

ぁぅー

panel-applet

知るか

vte

うにゅー

poppler

ひぎぃ

ということでまとめ
Target libraries: glib, gdkpixbuf, pango, atk, gtk, bonobo, bonoboui, gconf, gnome, gnomecanvas, gnomeprint, gnomeprintui, gnomevfs, goocanvas, gtkglext, gtksourceview, gtksourceview2, libart, libglade, rsvg
Ignored libraries: gstreamer, gtkhtml2, gtkmozembed, panel-applet, poppler, vte

まあ,このぐらいで勘弁してください.
というか,win32 でほんとにテストしてるのかと言いたい.言い放ちたい.


…してるわけないですよねごめんなさい.

動いたー

ktkr

/c/ruby-gnome2/target/bin/ruby -e "require 'gtk2'; w = Gtk::Window.new; w.signal_connect('destroy') { Gtk.main_quit }; w.s
how_all; Gtk.main"

いや,画像はないけどさ
註:本当は make install してないので動きません

インストーラを作る

基本的には HOWTO.txt のトレースでよいのだが,仕様変更も多いので注意.

rake をインストール

ruby/zlib を入れるのを忘れたので,gem 経由ではなく直接入れる.

Rakefile の修正
  • ruby/lib/ruby/site_ruby/1.8/i386-msvcrt が作成されない
  • cairo の入れる場所が違う
--- Rakefile.org        Mon Feb 12 11:37:25 2007
+++ Rakefile    Sun Dec  7 06:05:13 2008
@@ -105,7 +105,8 @@
   mkdir_p dest_dir unless File.exist? dest_dir
   cp_r(File.join(sitelibdir, "cairo.rb"), dest_dir)
   mkdir_p File.join(dest_dir, "cairo") unless File.exist? File.join(dest_dir, "cairo")
-  cp_r(Dir.glob(File.join(sitelibdir, "cairo")), File.join(dest_dir, "cairo"))
+  mkdir_p File.join(dest_dir, "i386-msvcrt") unless File.exist? File.join(dest_dir, "i386-msvcrt")
+  cp_r(Dir.glob(File.join(sitelibdir, "cairo")), dest_dir)
   cp_r(Dir.glob(File.join(sitelibdir, "i386-msvcrt", "cairo.so")), File.join(dest_dir, "i386-msvcrt"))
   cp_r(Dir.glob(File.join(sitelibdir, "i386-msvcrt", "rb_cairo.h")), File.join(dest_dir, "i386-msvcrt"))
 end
makeinstall という名のファイル列挙

ruby-gnome2 の make install をもう一度.install.log がいるっぽい
てぃがーぅ.HOWTO.txt の誤植.

--- HOWTO.txt.org       Sun Dec  7 02:57:56 2008
+++ HOWTO.txt   Sun Dec  7 02:58:01 2008
@@ -15,7 +15,7 @@
 
 5. Install ruby-gnome2 with MinGW.
    $ rake clean
-   $ rake make_install
+   $ rake makeinstall
 
 6. Copy GTK+ files. Run this when you have new GTK+ only.
    $ rake copygtk

これは target に ruby-gnome2 をインストールする処理ではなく,
パッケージになにを収めたらよいかを調べる処理なのです.
それが install.log.
で,0.16 の時には気にしなくてよかった余計な行が約 1 行あるので,消す.

install -c -m 0755 c:/ruby-gnome2/ruby-gnome2-all-0.18.1/libglade/bin/ruby-glade-create-template c:/ruby-gnome2/target/bin
Rakefile の編集

HOWTO.txt のとおり.

setup.nsi の編集

バージョンをうっかり 0.16 のままにしてしまうと悲しすぎる

--- setup.nsi.org       Mon Feb 12 11:37:24 2007
+++ setup.nsi   Sun Dec  7 02:24:06 2008
@@ -6,7 +6,7 @@
 
 ; HM NIS Edit Wizard helper defines
 !define PRODUCT_NAME "Ruby-GNOME2"
-!define PRODUCT_VERSION "0.16.0-1"
+!define PRODUCT_VERSION "0.18.1-1"
 !define PRODUCT_PUBLISHER "Masao Mutoh"
 !define PRODUCT_WEB_SITE "http://ruby-gnome2.sourceforge.jp/"
 !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
作成

はい.ここも HOWTO.txt と違う

rake copygtk
rake copyglade
rake copydoc
rake copysamples
rake copyrcairo # さっきの処理をやっとかないと死ぬ
rake copyrgnome2
rake makensis

理由は知らん

テスト

できたのを one-click ruby installer などのインストールされたディレクトリにインストール.
すると…

うごいたのーすごいのえらいのねむたいのー

まとめ

また明日.今日はもう寝るの.おやすみなさいなの.
こっそりさらしておきますが,かなりぁゃιぃので命が惜しくない人はテストしていただければ.
One-click installer for Ruby-Gnome2 0.18.1 nora build