森下 @ CAC と申します。

  Ruby を使うのは初めてです。
  先月の NSUG で、まつもとさんの講演をお聞きしたときに「Ruby の
本が出たら、勉強してみようと思います」と言って Ruby のスレッドの
扱いについて質問させていただいたことがあります。その時の約束通
り(^^?)、近所の本屋さんで「オブジェクト指向スクリプト言語 Ruby」
を見かけて買ってきましたのでさっそく読み始めています。面白いです。
とても楽しく読ませていただいています(といってもまだ100 ページに
満たないところなのですが(^^;))。
  で、付属の CD-ROM の ruby-1.4.2.tar.gz をソースから make しよ
うとしているのですが、どうもうまくいかないところがあるので、どな
たかご教授いただければ幸いです。m(__;)m

  環境は以下の通りです。
・OS: Windows NT 4.0 Workstation SP5
・Cygwin: Cygwin B20.1、というかたぶん B20.1 だと思います。(^^;
  正確なバージョンチェックの仕方を知らないのですが、cygcheck -v -r -s 
  すると、HKEY_LOCAL_MACHINE\Software\Cygnus Solution\Cygwin B20\B20.1
  というキーがあること、cygwin1.dll の日付が 1998/12/04 になって
  いることからそうだろうと思っています。シェルは付属の bash を使っ
  ています。

  状況を一言で言うと、./configure --enable-shared で作成した
ruby のバイナリが、make test で落ちる、というものです。CD-ROM
内の rbcw142.zip も、私の環境がおかしいのか同様な落ち方をします。

$ sh ./configure --enable-shared
$ make -f GNUmakefile
#ここは -f GNUmakefile は余計なんでしょうか? なんとなくそれらし
#いことが書いてありそうな気がしてこちらを使ってみたのですが。
$ make test

とすると、

タイトル: ruby.exe アプリケーションエラー
内容: "0x6105afaa" の命令が "0x0a032004" のメモリを参照しました。
      メモリが "read" になることはできませんでした。
というメッセージボックスが出てきます。ここで「キャンセル」ボタン
を押して VC++ 6.0 を立ち上げると、「ハンドルされていない例外は
ruby.exe(CYGWIN1.DLL)にあります: 0xC0000005: Access Violation。」
というメッセージボックスが出ます。
  ここでコールスタックを見ると、
CYGWIN1! 6105afaa()
CYGWIN1! 6101a4a7()
CYGWIN1! 6101a3f6()
CYGWIN1! 6100d92e()
CYGWIN1! 6105f248()
CYGWIN1! 610190b9()
CYGWIN1! 61030c1e()
CYGWIN1! 6102ff3e()
CYGWIN1! 6102dd60()
CYGWIN1! 6100b4f1()
CYGWIN1! 6100b2f2()
CYGWIN1! 6100b36b()
RUBYCW! 6d108913()
RUBYCW! 6d108af8()
RUBYCW! 6d0e3213()
RUBYCW! 6d0e4d0c()
RUBYCW! 6d0d31fe()
RUBYCW! 6d0d378f()
RUBYCW! 6d0d3ec9()
RUBYCW! 6d0d40dc()
RUBYCW! 6d0d0674()
RUBYCW! 6d0cf1a7()
RUBYCW! 6d0cf47d()
RUBYCW! 6d0cdf80()
RUBYCW! 6d0cc144()
RUBYCW! 6d0cc2d1()
RUBY! 00401061()
CYGWIN1! 61004402()
CYGWIN1! 61004420()
RUBY! 004011a2()
RUBY! 0040103a()
KERNEL32! BaseProcessStart@4 + 64 bytes

となっています。ここでデバッガを閉じますが、bash のプロンプトは
戻ってこず、Ctrl-C で中断してやると、

$ make test
//f/usr/local/src/ruby/ruby-1.4.2/sample/test.rb:764: Interrupt (RuntimeError)
        from //f/usr/local/src/ruby/ruby-1.4.2/sample/test.rb:764:in `call'
        from //f/usr/local/src/ruby/ruby-1.4.2/sample/test.rb:892:in ``'
        from //f/usr/local/src/ruby/ruby-1.4.2/sample/test.rb:892
./rubytest.rb:26:in ``': Interrupt
        from ./rubytest.rb:26
make: *** [test] Error 1

$

となります。

ちなみに、
$ ls -l ruby*.{exe,dll} libruby*
-rw-r--r--   1 544      everyone   451616 Nov  8 23:34 libruby.a
-rw-r--r--   1 544      everyone  2211668 Nov  8 23:33 librubys.a
-rwxr-xr-x   1 544      everyone   306498 Nov  8 23:35 ruby.exe*
-rw-r--r--   1 544      everyone   493568 Nov  8 23:34 rubycw.dll
です。

では Ruby 本の CD-ROM に入っていた rbcw142.zip はどうなん
だろうと思い、こちらは展開しただけの状態で、展開したディレクトリ
に CD-ROM 内に入っていた cygwin1.dll を置き、

$ ./ruby.exe rubytest.rb

  とすると、

タイトル: ruby.exe アプリケーションエラー
内容: "0x610199f8" の命令が "0x000001c4" のメモリを参照しました。
      メモリが "read" になることはできませんでした。
というメッセージボックスが出てきます(先ほどとアドレスは違います
が)。ここで「キャンセル」ボタンを押して VC++ 6.0 を立ち上げると、
「ハンドルされていない例外は ruby.exe(CYGWIN1.DLL)にあります:
0xC0000005: Access Violation。」というメッセージボックスが出ます。
同様にコールスタックを見ると、

CYGWIN1! 610199f8()
CYGWIN1! 610597da()
CYGWIN1! 61055542()
CYGWIN1! 61055a76()
CYGWIN1! 6101b3ca()
CYGWIN1! 6101b28e()
CYGWIN1! 6101b5e7()
CYGWIN1! 610197a6()
CYGWIN1! 61004130()
CYGWIN1! 61004541()
RUBY! 004011a2()
RUBY! 0040103a()
KERNEL32! BaseProcessStart@4 + 64 bytes

となっています。こちらの方は、デバッガを終了するとすぐに bash の
プロンプトが戻ってきます。

  なお ruby-1.4.2 のソースから、スタティックリンクの状態で作成し
た ruby は、
$ sh ./configure --with-static-linked-ext
#ext/Setup の行頭の `#' をすべて外してみる。
$ mv sample/mine.rb sample/mine.ORG; nkf -s sample/mine.ORG > sample/mine.rb
$ make test
test succeeded
$

となり、うまく動作しているように見えます。
  というわけで、スタティックリンク版でガマンすれば OK っぽいので
すが、今ひとつ納得がいきません。(^_^;;

  Cygwin の環境で、ソースからダイナミックリンク版の ruby をビル
ドするには、どのような手順を踏むのが正しいのでしょうか?
手順を記したドキュメントを見落としているのではないかという気もす
るのですが...
  どなたかご教授いただければ幸いです。m(__;)m

--
もりした みんぺい