From: Katsuyuki Komatsu Date: 1999-07-27T13:04:55+09:00 Subject: [ruby-dev:7430] [PATCH] mswin32 support ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="iso-2022-jp" Content-ID: <4766.933041158.1@ultra2.sarion.co.jp> Content-Transfer-Encoding: 7bit 小松です。 mswin32対応です。 だいたいよさそうなので、出してしまいます。 patchは1999/7/22のcheckinに対するdiffです。 1. instruby.rb mswin32の場合、win32/win32.hもインストールする必要があった ので、インストール先にwin32ディレクトリを作ってそこに インストールするように変更した。 また、rubymw.libもインストールする必要があった。 2. mkconfig.rb win32/config.statusに、 s%@MAJOR@%1%g s%@MINOR@%3%g s%@TEENY@%5%g を入れるとリリース毎に書き換える必要があって面倒だし、 自動的に生成させるにはmswin32の環境で存在を仮定できる ツールはほとんどないので、rbconfig.rbを作成する際に、 config.statusにMAJOR, MINOR, TEENYが無ければ mkconfig.rbが、VERSION (現在1.3.5) から、 CONFIG["MAJOR"] = "1" CONFIG["MINOR"] = "3" CONFIG["TEENY"] = "5" のような行を生成して追加するようにした。 3. ext/extmk.rb.in SRC_EXTに"m"と"cpp"を追加した。 $OBJEXTを導入した。 mswin32で、$local_flagsを使用するようにした。 append_library()を追加した。 ext/Setupがある場合、"miniruby -Xext extmk.rb static"の後の cleanで、Setupにのっていない物はmake cleanが呼ばれないのを 修正した。 4. ruby/ext/extmk.rb.nt SRC_EXTを導入した。 $OBJEXTを導入した。 append_library()を追加した。 $topdirの設定で、 $topdir = File.expand_path("..") $topdir = File.expand_path($topdir) としているが、ドライブ名が相対パスとみなされてうまく動作 しないため、 $topdir = File.expand_path("..") のみに変更した。 LINKとCPPの"> nul"があると、Windows 98ではxsystem()の 結果が常にtrueとなってしまうため削除した。 LINKとCPPの"-Zi -O"はvc60.pdbが残ってしまうので削除した。 have_library(), have_func()のテストコードを変更した。 install_rb()を他と合わせた。 $libsをnilから""で初期化するようにしたextmk.rb.inの変更を反映した。 have_func()の中の消し忘れを削除した。 dependの".o"を".#{$OBJEXT}"に置換するようにした。 $makeを導入した。 extmk.rb.inに合わせてinstallにftoolsを使用するようにした。 $"が"win32api.so"になるのがいやなので、Dir["*"]の結果よりも extconf.rbのcreate_makefile()の引数の方を優先するようにした。 ext/Setupがある場合、"miniruby -Xext extmk.rb static"の後の cleanで、Setupにのっていない物はmake cleanが呼ばれないのを 修正した。 5. ext/socket/extconf.rb "*.o"を"*.#{$OBJEXT}"で置き換えた。 6. lib/ftools.rb Windows 98で0555でインストールしたファイルを更新できなかった ので、install()のunlinkをsafe_unlinkに変更した。 7. lib/mkmf.rb SRC_EXTを導入した。 $OBJEXTを導入した。 append_library()を追加した。 have_library(), have_func()のテストコードをmswin32かどうか で振り分けるようにした。 mswin32で、$local_flagsを使用するようにした。 8. win32/Makefile installの./miniruby.exeを.\miniruby.exeに変更した。 ([ruby-dev:6811]の小田さんのパッチの一部の適用もれみたいです) cleanの"2> nul || true"を削除した。 9. win32/config.status 最新のconfigure.inの出力するconfig.statusとwin32/Makefileに 合わせるように修正した。 動作確認は、以下の2プラットフォームのみ行いました。 Windows 98 + Visual C++ 6.0 SP3 cd win32 ntsetup nmake nmake test nmake install Solaris 2.5.1 + egcs-1.1.2: env CFLAGS='-O2' ../configure \ --with-readline-dir=/usr/local --with-make-prog=gmake gmake gmake test sudo gmake install p $"は以下のような感じです。 C:\lang\ruby-1.3.5>ruby -ve 'p $"' ruby 1.3.5 (1999-07-15) [i386-mswin32] ["marshal.so", "fcntl.so", "md5.so", "nkf.so", "sdbm.so", "socket.so", "tkutil.s o", "Win32API.so"] C:\lang\ruby-1.3.5> -- 小松克行 / Katsuyuki Komatsu ------- =_aaaaaaaaaa0 Content-Type: application/x-gzip; name="mswin32.diff.gz" Content-ID: <4766.933041158.2@ultra2.sarion.co.jp> Content-Transfer-Encoding: base64 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 OTKhDyHIoieA/w1JJ0xs8HkAAA== ------- =_aaaaaaaaaa0--