[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:001791] Re: GTK対応 RubyDCL



神代です.

CygwinでのGTK対応RubyDCLの話題ですが,

At Wed, 30 Jun 2004 15:57:24 +0900, Seiya Nishizawa wrote:

> > > ソースを眺めながら思い出しました。
> > > gtk対応の場合 ruby-dcl は ruby-gtk に依存します。
> > 
> > ありがとうございます.すっきりしました.
> > 一括インストーラでもそのように対処します.

この件は一応解決したはずだったのですが,実際にデモプログラムを動かすと,

$ ruby ximg01.rb 
/usr/lib/ruby/site_ruby/1.8/i386-cygwin/numru/dcl_raw.so: dlopen: Win32 error 126 - /usr/lib/ruby/site_ruby/1.8/i386-cygwin/numru/dcl_raw.so (LoadError)
        from /usr/lib/ruby/site_ruby/1.8/numru/dcl.rb:2
        from ximg01.rb:12:in `require'
        from ximg01.rb:12

とエラーになるのにしばらく悩まされていました.
どうも,あらかじめ glib2.so がロードされていないと,Ruby が dcl_raw.so
の dlopen に失敗してしまう,ということのようです.

$ irb
irb(main):001:0> require "numru/dcl"
LoadError: dlopen: Win32 error 126 - /usr/lib/ruby/site_ruby/1.8/i386-cygwin/numru/dcl_raw.so
        from /usr/lib/ruby/site_ruby/1.8/i386-cygwin/numru/dcl_raw.so
        from /usr/lib/ruby/site_ruby/1.8/numru/dcl.rb:2
        from (irb):1:in `require'
        from (irb):1

$ irb
irb(main):001:0> require "glib2"
=> true
irb(main):002:0> require "numru/dcl"
=> true

というわけで,Cygwinで GTK対応の場合のみ,dcl.rb の最初で

require "narray"
require "numru/dcl_raw"

となっているところを

require "narray"
require "glib2"
require "numru/dcl_raw"

と一行追加するように,extconf.rb のパッチを作ってみました.

# 前回ご指摘した "- lruby-glib2" の部分はお手元では直していただいた
# ということでしたが,そのライブラリのチェック方法とエラーメッセージ
# も変更したほうがよさそうなので,そこも含めて,ruby-dcl-1.4.0 に対す
# るパッチとなっています >堀之内さま 

よろしくお願いします.

それから,以前西澤さんが作ってくれた Cygwinバイナリパッケージは,私が
引き継ぐことになりました.
それについても近々更新したいと思います.

--- ruby-dcl-1.4.0_orig/extconf.rb	2004-03-05 13:46:02.000000000 +0900
+++ ruby-dcl-1.4.0/extconf.rb	2004-07-13 14:41:48.000000000 +0900
@@ -3,7 +3,26 @@
 
 require "mkmf"
 require "ftools"
+require "tempfile"
 
+def insert(path, start_line, data)
+  temp = Tempfile.new("mytemp", File.dirname(path))
+  File.open(path) do |file|
+    start_line.times do
+      if line = file.gets
+        temp.write(line)
+      end
+    end
+    temp.write(data)
+    while line = file.gets
+      temp.write(line)
+    end
+  end
+  mode = File.stat(path).mode
+  File.rename(temp.path, path)
+  File.chmod(mode, path)
+end
+  
 dir_config('narray',$sitearchdir,$sitearchdir)
 if ( ! ( have_header("narray.h") && have_header("narray_config.h") ) ) then
    print <<-EOS
@@ -72,9 +91,10 @@
 end
 
 if /cygwin|mingw/ =~ RUBY_PLATFORM
-   have_library("narray") || raise("ERROR: narray library is not found")
+   have_library("narray") || raise("ERROR: narray import library is not found")
    if gtkversion == "2"
-     $LOCAL_LIBS += "- lruby-glib2"
+      have_library("ruby-glib2") || raise("ERROR: ruby-glib2 import library is not found")
+      insert("lib/dcl.rb", 1, "require \"glib2\"\n")
    end
 end