Just another Ruby porter,

〜2001年2月上旬〜


<Prev(,) | Next(.)> | Recent(/)>> | RDF

2001-02-01 (Thu)

Perl for Windows CE

emacsもあるようだ。

GNU tarのbzip2サポート

ChangeLogを見ると最初は-y。でもすぐ取り消し。 と思ったらやっぱり-yを追加。そのあとなぜか-Iへ変更。 で最新は-jだ。
もう一文字はあきらめたほうがいいと思う。--bzip2でいいじゃん。

_ --bzip2:

が、甘かった。tar 1.12はバグってる *1。 --bzip2では引数を要求される。
% tar cfv foo.tar.bz2 foo --bzip2
tar: option `--bzip2' requires an argument
Try `tar --help' for more information.
% tar cfv foo.tar.bz2 foo --bzip2=
foo

_ --us=bzip2:

結局--use-compress-program=bzip2を使うのがいいみたい *2
% tar cfv foo.tar.bz2 foo --use-compress-program=bzip2
foo
--us=bzip2まで省略可能。

*1: tar 1.13では直ってる。
*2: あ、いや最初からpipeで十分なんだけど。

opendir

原因は_dev_tのサイズの違いだった。
/usr/include/mingw/sys/types.h:
...
#ifdef __MSVCRT__
typedef unsigned int _dev_t;
#else
typedef short _dev_t;
#endif
...
/usr/include/mingw/sys/stat.h:
...
struct _stat
{
        _dev_t  st_dev;         /* Equivalent to drive number 0=A 1=B ... */
        _ino_t  st_ino;         /* Always zero ? */
        _mode_t st_mode;        /* See above constants */
...
libmingw32.aのdirent.cが-D__MSVCRT__でコンパイルされてないから、 dirent.cの
  if (!S_ISDIR (statDir.st_mode))
    {
      /* Error, stat reports not a directory. */
      errno = ENOTDIR;
      return (DIR *) 0;
    }
で、st_modeに正しくアクセスできなくなる。
つまりstatを使うとはcrtdllとmsvcrtで共有できないわけだ。 opendir関係は外に出したほうがいい気がする。
あ、というより-mno-cygwinはmsvcrt用になったんだから、 やっぱりspecsに-D__MSVCRT__を追加するのが筋なんだろう。

cygwin 1.1.8-2

heapサイズは1GBから256MBになった。 これでWin9X/MEでも レジストリをいじる必要はない。
Ruby 1.6.3が出る頃にはクロスの環境も1.1.8-2にしよう。

2001-02-02 (Fri)

vrswin 010128

% mkdir vrswin010128
% cd vrswin010128
% lha xt /hoge/vrswin010128.lzh
% mkdir cygwin mingw
% cd cygwin
% ruby -rfake_TARGET -s ../extconf.rb -target=i386-cygwin
% make
% upx *.so
% make site-install
% cd ../mingw
% ruby -rfake_TARGET -s ../extconf.rb -target=i386-mingw32
% make
% upx *.so
% make site-install
% cd ..
% cat >../vrswin.contents
DOC=Files.txt Readme.rd.* dtest.rb test*.rb
CONTENTS=usr/local/lib/ruby/site_ruby/$(RUBYVER)/$(TARGET)/swin.so
% make -f ../Makefile.pack PACKAGE=vrswin VERSION=010128 TARGET=i386-cygwin
% make -f ../Makefile.pack PACKAGE=vrswin VERSION=010128 TARGET=i386-mingw32

vruby 010125

% mkdir vruby010125
% cd vruby010125
% lha xt /hoge/vruby010125.lzh
% cp -av vr ~/dist/i386-cygwin/usr/local/lib/ruby/site_ruby/1.6
% cp -av vr ~/dist/i386-mingw32/usr/local/lib/ruby/site_ruby/1.6
% cat >../vruby.contents
DOC=DLLManager.rb Files.txt Readme.rd.* tests vrinstall.rb
CONTENTS=usr/local/lib/ruby/site_ruby/$(RUBYVER)/vr/*
% make -f ../Makefile.pack PACKAGE=vruby VERSION=010125 TARGET=i386-cygwin
% make -f ../Makefile.pack PACKAGE=vruby VERSION=010125 TARGET=i386-mingw32

ext/

なんか増えてきたので拡張ライブラリはext/を掘ってそこに移動。 それに伴い Makefile.packも更新。

amazon.co.jp

今月も送料無料だ。本当にそれでやってけるのか?

2001-02-03 (Sat)

cygwin 1.1.8-2, gcc-2.95.2-7 on Linux

今回はCVSじゃなくてリリースされたものを使う。
mingw, w32apiのソースはcygwin-1.1.8-2-src.tar.gzにも含まれているので必要ない。
% tar xfvz cygwin-1.1.8-2-src.tar.gz
% tar xfvz gcc-2.95.2-7-src.tar.gz
% mkdir build
% cd build
% lndir ../cygwin-1.1.8-2
% mkdir gcc libio libstdc++
% for i in gcc libstdc++ libio;do mkdir $i;cd $i;\
  lndir ../../gcc-2.95.2-7/$i;cd ..;done
% mkdir obj
% cd obj
% CFLAGS=-Os CXXFLAGS=-Os ../configure --target=i686-pc-cygwin \
  --prefix=/usr/local/cygwin --enable-languages=c,c++
% time make |& tee make.log
...
make 2>& 1  3605.69s user 316.80s system 94% cpu 1:08:50.54 total
tee make.log  0.11s user 0.91s system 0% cpu 1:08:50.46 total
% make install
lndirが面倒なら
% tar xfvz cygwin-1.1.8-2-src.tar.gz
% tar xfvz gcc-2.95.2-7-src.tar.gz
% cd cygwin-1.1.8-2
% mv ../gcc-2.95.2-7/{gcc,libstdc++,libio} .
% mkdir obj
% cd obj
% <あとは同じ>
でもいい。

specs

例によってspecsの パッチ

bmingw package

libgcc.aからimpure_ptrへの参照がなくなったのでcygwinのlibgcc.aを使って も問題ない。というわけでlibgcc.aもsymlinkに。
これで大物はlibstdc++.aだけか。 bmingw-20010203.tar.gz

DJGPPでsymlink

stubify.exeかstubedit.exeがあればsymlinkもどきも可能。
% ./ruby -ve 'File.symlink "ruby.exe", "hoge.exe"'
ruby 1.6.2 (2001-02-02) [i386-msdosdjgpp]
% ls -l hoge.exe
-rwxr-xr-x   1 watanabe ruby         2048 Feb  3 16:46 hoge.exe
% ./hoge -v
ruby 1.6.2 (2001-02-02) [i386-msdosdjgpp]
でもできるのは.exeだけ。

uconv 0.4.5

% tar xfvz uconv-0.4.5.tar.gz
% cd uconv
% mkdir cygwin mingw
% cd cygwin
% ruby -rfake_TARGET -s ../extconf.rb -target=i386-cygwin
% make
% upx *.so
% make site-install
% cd ../mingw
% ruby -rfake_TARGET -s ../extconf.rb -target=i386-mingw32
% make
% upx *.so
% make site-install
% cd ..
% cat >../uconv.contents
DOC=MANIFEST README* samples
% make -f ../Makefile.pack PACKAGE=uconv VERSION=0.4.5 TARGET=i386-cygwin
% make -f ../Makefile.pack PACKAGE=uconv VERSION=0.4.5 TARGET=i386-mingw32

tmail 0.8.18

% tar xfvz tmail-0.8.18.tar.gz
% cd tmail-0.8.18
% ruby -rfake_TARGET -s setup.rb -target=i386-cygwin config \
  --ruby-path=/usr/local/bin/ruby
% ruby -rfake_TARGET -s setup.rb -target=i386-cygwin setup
ここで破綻。そろそろsetup.rbをまじめに読むか。
ふむふむsystemしてるね。 --ruby-pathを指定しないと クロスで作ったrubyを実行しようとしてるからまずい。
--ruby-path=/usr/local/bin/rubyすると fake_TARGETなしになるからこれもまずい。

_ i386-cygwin-ruby:

じゃ i386-cygwin-rubyを用意しよう *1
% rm config.save
% i386-cygwin-ruby setup.rb config \
  --ruby-path=/usr/local/bin/i386-cygwin-ruby
% i386-cygwin-ruby setup.rb setup
% upx ext/*/*.so
% i386-cygwin-ruby setup.rb install
わらわらとインストールされる。
パッケージとしてはtmailだけあればいいと思うから、tmail.contentsは
DOC=LGPL README.* doc.* sample
CONTENTS=usr/local/lib/ruby/site_ruby/$(RUBYVER)/tmail/* \
usr/local/lib/ruby/site_ruby/$(RUBYVER)/$(TARGET)/tmail/*
としとくか。
% make -f ../Makefile.pack PACKAGE=tmail VERSION=0.8.18 TARGET=i386-cygwin

_ i386-mingw32-ruby:

たぶんいろいろ要らないものがあるだろうから--withoutしてみる。
% i386-cygwin-ruby setup.rb clean
% rm config.save ext/*/Makefile ext/*/*.def
% i386-mingw32-ruby setup.rb config \
  --ruby-path=/usr/local/bin/i386-mingw32-ruby \
  --without=ext/cparse,ext/cscan,lib/amstd,lib/raccrt,lib/strscan
% i386-mingw32-ruby setup.rb setup
% rm ext/*/*.so
% i386-mingw32-ruby setup.rb install
% make -f ../Makefile.pack PACKAGE=tmail VERSION=0.8.18 TARGET=i386-mingw32

*1: bin/racc/raccのようなのはsetup後に修正するとして。

mingw32版rubyの-rが遅い

_ kconv:

mingw32版をWin98でruby -rtmail/tmail -e0してテストしたら返ってこない。 なぬーってことで同じように内部的に.soをrequireしてるkconvで実験。
% time c:/usr/local/bin/ruby -v -rkconv -ep
ruby 1.6.2 (2001-02-02) [i386-mingw32]
c:/usr/local/bin/ruby -v -rkconv -ep  0.00s user 0.00s system 0% cpu 2.580 total
% time ruby -v -rkconv -ep  
ruby 1.6.2 (2001-02-02) [i386-cygwin]
ruby -v -rkconv -ep  0.00s user 0.00s system 0% cpu 0.280 total
kconvですらこんなに差がある。何の違いだろう?

_ jcode:

.soをrequireしないjcodeでテスト。
% time c:/usr/local/bin/ruby -v -rjcode -ep
ruby 1.6.2 (2001-02-02) [i386-mingw32]
Warning: $KCODE is NONE.
c:/usr/local/bin/ruby -v -rjcode -ep  0.00s user 0.00s system 0% cpu 8.840 total
% time ruby -v -rjcode -ep 
ruby 1.6.2 (2001-02-02) [i386-cygwin]
Warning: $KCODE is NONE.
ruby -v -rjcode -ep  0.00s user 0.00s system 0% cpu 0.330 total
どうも、scriptのparseにものすごく時間がかかってるようだ。
% time c:/usr/local/bin/ruby -v -wc c:/usr/local/lib/ruby/1.6/jcode.rb
ruby 1.6.2 (2001-02-02) [i386-mingw32]
Syntax OK
c:/usr/local/bin/ruby -v -wc c:/usr/local/lib/ruby/1.6/jcode.rb  \
0.00s user 0.00s system 0% cpu 8.840 total
あ、cygwin上のshellから実行すると遅くなるようだ。うーむ。
C:\usr\local\bin>c:\cygwin\bin\time ./ruby -v -wc ../lib/ruby/1.6/jcode.rb
ruby 1.6.2 (2001-02-02) [i386-mingw32]
Syntax OK
0.00user 0.00system 0:00.77elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+0minor)pagefaults 0swaps

AJICO

よく見るとベースはRIZEのTOKIEだな。

CREA

あ、本人か。
〜浜崎あゆみ/evolutionを聴きながら〜

2001-02-04 (Sun)

Ruby/zlib 0.4.0

_ zlib:

zlib 1.1.3ってついこの間xdeltaのときに作ったが、 クロスのほうもついでに作っとこう。
% CC='i686-pc-cygwin-gcc -bmingw' \
  AR='i686-pc-cygwin-ar rc' \
  RANLIB=i686-pc-cygwin-ranlib \
  prefix=/usr/local/mingw \
  ./configure
% make
% make install

_ Ruby/zlib:

% tar xfvz ruby-zlib-0.4.0.tar.gz
% cd ruby-zlib-0.4.0
% mkdir cygwin mingw
% cd cygwin
% i386-cygwin-ruby ../extconf.rb
% make
% upx zlib.so
% make site-install
% cd ../mingw
% i386-mingw32-ruby ../extconf.rb
% make
% upx zlib.so
% make site-install
% cd ..
% cat >../ruby-zlib.contents
DOC= ChangeLog MANIFEST zlib.*.html
CONTENTS=usr/local/lib/ruby/site_ruby/$(RUBYVER)/$(TARGET)/zlib.so
% make -f ../Makefile.pack PACKAGE=ruby-zlib VERSION=0.4.0 TARGET=i386-cygwin
% make -f ../Makefile.pack PACKAGE=ruby-zlib VERSION=0.4.0 TARGET=i386-mingw32

RubyWin 0.0.2.6

% unzip -a rubywin-0.0.2.6.zip
% cd rubywin
% mkdir cygwin mingw
% cd cygwin
% i386-cygwin-ruby ../config.rb
% make
...
i686-pc-cygwin-windres --include-dir .. --define USE_WINDRES ../resource.rc resource.o
../resource.rc:6: windows.h: No such file or directory
i686-pc-cygwin-windres: ../resource.rc:17: parse error
make: *** [resource.o] Error 1
windres問題はちょっと面倒だね。 そろそろCygwin MLで文句が出るかもしれない。
--- config.rb.orig	Fri Feb  2 00:00:00 2001
+++ config.rb	Sat Feb  3 23:36:07 2001
@@ -49,7 +49,7 @@
 
   $RESCC = <<STR
 resource.o: $(srcdir)/resource.rc $(srcdir)/resource.h
-	#{CONFIG['WINDRES']} --include-dir $(srcdir) --define USE_WINDRES $(srcdir)/resource.rc resource.o
+	#{CONFIG['WINDRES']} --preprocessor '$(CC) -E -xc-header -DRC_INVOKE #{CONFIG["MWIN32"]||""}' --include-dir $(srcdir) --define USE_WINDRES $(srcdir)/resource.rc resource.o
 STR
 
 end
でもう一度。
% make
% i686-pc-cygwin-strip rubywin.exe
% upx rubywin.exe
% make install RUBYOPT1='-rfake_TARGET -s' RUBYOPT2=-target=i386-cygwin
% cd ../mingw
% i386-mingw32-ruby ../config.rb
% make
% i686-pc-cygwin-strip rubywin.exe
% upx rubywin.exe
% make install RUBYOPT1='-rfake_TARGET -s' RUBYOPT2=-target=i386-mingw32
% cd ..
% make 

setup.rb

そうか。~/dist/TARGET/usr/local/bin/rubyをfakeにしとけってことか。 今のところruby.exeが本体だから、rubyという名前で置いといてもokではある。

GTK+ for MinGW

そろそろRuby/GTKを用意しなきゃ。
GIMP for Win32のDLLを使うとすぐ互換性がなくなるので、 statically libraryを作るところから始める。
Ruby porterの主な仕事はlibraryの移植とも言える。 拡張ライブラリは普通C libraryのwrapperにだしね。

pthreads

まずはpthreadsだ。これはpthreads-snap-1999-05-30.tar.gzを使う。 GIMP for Win32が未だにこれを使っているからだけど、 Cygwinにある最新を使ったほうがいいのかもしれない。 configureしても無駄だったので適当にMakefileを修正。
% diff -u1 Makefile.in Makefile
--- Makefile.in Sat May 29 23:48:25 1999
+++ Makefile    Sun Feb  4 15:32:59 2001
@@ -1 +1,2 @@
+# Generated automatically from Makefile.in by configure.
 #
なんだそれは?きっと最新はちゃんとしてるんだろう。
さらに_timeb関係が当時と違うようなので、 timebではなく_timebを使うように削除。
makeしてlibpthread32.aとpthread.hを/usr/local/mingw/{lib,include}へコピー。

glib

glib-src-20001226.zipを使う。 サブモジュールがあるため各ディレクトリのmakefile.mingwは、 共通のbuild/win32/make.mingwをincludeするようになっている。
CC, CXX, DLLTOOLにi686-pc-cygwin-をつける。
このままではDLLを作ってしまうが、 build-dllというshell scriptで作るようになっているので、 DLLを作るところで

i686-pc-cygwin-ar rcu lib$libname.a $objs

してお茶を濁すことにした。

_ iconv:

読みが甘かった。glibはiconvを使うようになってるらしい。
gconvert.c:23: iconv.h: No such file or directory
gconvert.c:48: #error libiconv in use but included iconv.h not from libiconv
make: *** [gconvert.o] Error 1
じゃ、次はiconvだな。

libiconv

使うのは libiconv-1.5.1.tar.gzだ。

_ configure:

% CC='i686-pc-cygwin-gcc -bmingw' \
  CFLAGS=-Os \
  AR=i686-pc-cygwin-ar \
  NM=/usr/local/cygwin/bin/i686-pc-cygwin-nm \
  RANLIB=i686-pc-cygwin-ranlib \
  ./configure \
  --target=i386-mingw32 \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux \
  --prefix=/usr/local/mingw
毎度お馴染の環境変数、オプションを指定する。 NMはなぜか絶対パスかどうかのチェックが入っている。

_ make:

すんなりmakeは通る。unicodeのテーブルを抱いてるから結構大きい。
% ls -l lib/.libs/libiconv.a
-rw-r--r--   1 watanabe ruby       646550 Feb  4 16:12 lib/.libs/libiconv.a
vim6とかRubyのiconv拡張ライブラリとか考えるとDLLにしてもいいかな。
sudo make installして完了。

glibに戻る

gmarshalあたりでエラーになるが、libraryはできてるので気にしないことにする。
headerは/usr/local/mingw/lib/glib/includeへ、 libraryは/usr/local/libへインストールする。

_ glib-config:

Linuxのglib-configをほげって glib-1.3-config.mingwを作成。

gtk+/gdk

まずはgdkだ。 ../../build/win32/make.mingwをglibで作ったものと置き換える。
make -f makefile.cygwinすると
In file included from gtkcolorsel.c:34:
gtkintl.h:7: libintl.h: No such file or directory
make: *** [gtkcolorsel.o] Error 1
と言われる。先にgettextか。

gettext

これもconfigureしづらいのでmakefile.cygwinを使う。 intlだけmakeすればよさそう。 できあがったlibintl.aを/usr/local/mingw/libへ、 libintl.hを/usr/local/mingw/includeへコピー。

再びgtk+/gdk

make: *** No rule to make target `win32/libgdk-win32.a', needed by `gdk-1.3.dll'.  Stop.
先にwin32のほうをmakeしなきゃいけないのか。
タブレットは要らないよね。../../config.hのHAVE_WINTABをコメントアウト。
makefile.cygwinも適当に修正。
で戻る。 リンク時に_imp__fooがundefinedになるので、 gtktypes.hのextern __declspec(dllimport)がexternになるように修正。 glibのほうもdllimportを一掃。 と思ったらdllexportのほうも修正しないとだめだね。

gtk

同じように__declspec対応する。 いろんなテストプログラムができあがるのでWin98上で動くかどうか確認。 wineでもsimple.exeが動いた。 最後にheaderは/usr/local/mingw/include/{gtk,gdk}へ、 libraryは/usr/local/mingw/libへコピーした。
gtk-configもLinuxのを参考に gtk-1.3-config.mingwを用意した。

Ruby/GTK

やっと準備完了。imlibはもういいや。
それはそれとしてRuby/GTKの最新ってどうなってるんだっけ? とりあえず ここからgnome-ruby-snapshot-20010122.tar.gzを取ってきた。
% tar xfvz gnome-ruby-snapshot-20010122.tar.gz
% cd gnome-ruby-snapshot-20010122/gtk

_ extconf.rb:

gtk/extconf.rbにはちょっとしたパッチをあてた。
--- gtk/extconf.rb.orig	Fri Jan 19 20:52:55 2001
+++ gtk/extconf.rb	Sun Feb  4 20:26:29 2001
@@ -64,3 +64,3 @@
   lib_ary = []
-  if /cygwin/ =~ PLATFORM
+  if /cygwin|mingw/ =~ PLATFORM
   elsif /mswin32/ !~ PLATFORM

_ __declspec:

なぜかdllをリンクするとこでエラー。
% i386-mingw32-ruby extconf.rb gtk-1.3-config.mingw
% make RUBY=i386-mingw32-ruby AR=i686-pc-cygwin-ar
...
global.o(.text+0x2b9):global.c: undefined reference to \
  `_imp__GTK_TYPE_GDK_EVENT'
global.o(.text+0x315):global.c: undefined reference to \
  `_imp__GTK_TYPE_CTREE_NODE'
rbgtkobject.o(.text+0x1f1):rbgtkobject.c: undefined reference to \
  `_imp__GTK_TYPE_GDK_EVENT'
collect2: ld returned 1 exit status
あれ?__declspecは撲滅したはずなのになあ。 gtktypebuiltins.hはawkで作るようになってるのか。 じゃscriptを直さないと。 とりあえず/usr/local/mingw/include/gtk/gtktypebuiltins.hを修正して再開。

_ make:

% make RUBY=i386-mingw32-ruby AR=i686-pc-cygwin-ar
% ls -l src/gtk.so
-rwxr-xr-x   1 watanabe ruby      2299904 Feb  4 21:32 src/gtk.so
% upx src/gtk.so
% ls -l src/gtk.so
-rwxr-xr-x   1 watanabe ruby      1027584 Feb  4 21:32 src/gtk.so
やっとできた。iconvも含んでいるからでかいと思い込んでいたが、 g_iconv*をRuby/GTKは呼んでないから純粋にこんなもんなんだろう。 これだけで他のDLLは要らないんだからよしとする。

_ -fnative-struct:

てゆうかそんなことを言うのはちゃんとWin98で動いてからにせよ。
Gtk-ERROR **:Imcompatible build!
The code using GTK+ thinks GtkWindow is of different
size than it actually is in this build of GTK+.
On Windows, this probably means that you have compiled
your code with gcc without the -fnative-struct switch.
aborting...
がーん。なるほどねえ。 gtk-1.3-config.mingwに-fnative-structを追加。 もう一度makeし直してWin98上でsample/helloworld.rbがちゃんと表示されることを確認。

_ Makefile.pack:

じゃパックしよう。とここでちょっと困る。Makefile.packは
include ../$(PACKAGE).contents
と固定になっているからだ。gnome-*の場合gtkのみをパッキングしたい。 ちょっと考えて こうすることにした。
-include ../$(PACKAGE).contents
ifndef DOC
-include ../../$(PACKAGE).contents
endif
深いのが出たらまた追加しよう。
% cat >../../gtk.contents
DOC=BUGS COPYING* ChangeLog ENVIRONMENT MANIFEST README* ToDo doc sample
% make -f ../../Makefile.pack PACKAGE=gtk VERSION=20010122 TARGET=i386-mingw32
cygwinはまた今度。

2001-02-05 (Mon)

libsocket for DJGPP

試してみるかと思って見に行ったら開発終了。

make menuconfig on 1.1.8

Cygwin上でLinuxのカーネルをクロスコンパイルしようとする兵がいようとは。

libiconv

Cygwin版も作っとこう。
% CC='i686-pc-cygwin-gcc' \
  CFLAGS=-Os \
  AR=i686-pc-cygwin-ar \
  NM=/usr/local/cygwin/bin/i686-pc-cygwin-nm \
  RANLIB=i686-pc-cygwin-ranlib \
  ./configure \
  --target=i686-pc-cygwin \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux \
  --prefix=/usr/local/cygwin-local
% make 
% make install

iconv

% tar xfvz iconv-0.4.3.tar.gz
% cd iconv-0.4.3
% mkdir cygwin mingw

_ i386-cygwin:

% cd cygwin
% i386-cygwin-ruby ../extconf.rb --with-opt-dir=/usr/local/cygwin-local
checking for iconv.h... yes
checking for iconv() in -liconv... no
checking for rb_obj_freeze()... yes
checking for rb_block_given_p()... yes
creating Makefile
-liconvを見つけてくれない。 /usr/local/cygwin-local/include/iconv.hが
#ifndef LIBICONV_PLUG
#define iconv libiconv
#endif
となってるからだ。なんかよくわからん。とりあえず
--- extconf.rb.orig	Thu Sep 21 05:03:37 2000
+++ extconf.rb	Mon Feb  5 02:13:20 2001
@@ -9,3 +9,3 @@
 if have_header("iconv.h")
-  have_library("iconv", "iconv")
+  have_library("iconv", "iconv") || have_library("iconv", "libiconv")
   if method(:have_func).arity != 1
としてみる。
% i386-cygwin-ruby ../extconf.rb --with-opt-dir=/usr/local/cygwin-local
checking for iconv.h... yes
checking for iconv() in -liconv... no
checking for libiconv() in -liconv... yes
checking for rb_obj_freeze()... yes
checking for rb_block_given_p()... yes
creating Makefile
% make
% upx iconv.so
% make site-install
よさそうだ。

_ i386-mingw32:

% cd ../mingw
% i386-mingw32-ruby ../extconf.rb --with-opt-dir=/usr/local/mingw
% make
% upx iconv.so
% make site-install

_ pack:

% cd ..
% cat >../iconv.contents
DOC=MANIFEST iconv.rlog rd.css
% make -f ../Makefile.pack PACKAGE=iconv VERSION=0.4.3 TARGET=i386-cygwin
% make -f ../Makefile.pack PACKAGE=iconv VERSION=0.4.3 TARGET=i386-mingw32
あれ?以前はiconv.rdもあったよね。てゆうかrd.cssだけあっても意味がないし。 MANIFESTからもれてるのが原因かな?

grep競争

ruby惨敗。
perlの場合メタ文字を含んでないかつ$& $` $'を使わないと、 indexに自動的に切り替わるので、indexで勝負したほうがいいだろう。

_ //とindex:

とりあえずrubyで//とindexではどのくらい違うのかを計る。
% TIMEFMT='%E real  %U user  %S sys  %P cpu'     
% ls -l ruby-talk.0101
-rw-------   1 watanabe ruby      5663931 Feb  2 01:11 ruby-talk.0101

% time perl -ne 'print if index($_,"HOGE")>0' ruby-talk.0101
5.92s real  5.70s user  0.37s sys  102% cpu

% time perl -ne 'print if /HOGE/' ruby-talk.0101          
5.92s real  5.62s user  0.36s sys  101% cpu

% time ruby -ne 'print if /HOGE/' ruby-talk.0101 
8.86s real  8.56s user  0.34s sys  100% cpu

% time ruby -ne 'print if $_.index "HOGE"' ruby-talk.0101
14.08s real  13.60s user  0.52s sys  100% cpu

なぬ?rubyの場合 indexのほうが遅い。こりゃまいったね。indexは基本的には単純なmemcmpでしかないしね。 perlはBM法を使ってるもんなあ。

2001-02-06 (Tue)

eruby

eruby 0.1.3はwin32ではSEGVしてしまう。 2000-12-22に対応したのでCVSから取り寄せる。 正月に導入したcvsupのおかげでいつでも好きなときにcoできる。

_ i386-cygwin:

% cvs -d ~ruby/cvs co eruby
% cd eruby
% mkdir cygwin mingw
% cd cygwin
% i386-cygwin-ruby ../Makefile.RB
% make
% i686-pc-cygwin-strip eruby.exe
% upx eruby.exe
% make install
...
/usr/local/lib/ruby/1.6/ftools.rb:32:in `open': No such file or directory \
  - "/home/watanabe/dist/i386-cygwin/usr/local/include/eruby.h" (Errno::ENOENT)
        from /usr/local/lib/ruby/1.6/ftools.rb:32:in `syscopy'
        from /usr/local/lib/ruby/1.6/ftools.rb:59:in `copy'
        from /usr/local/lib/ruby/1.6/ftools.rb:179:in `install'
        from -e:1
make: [install] Error 1 (ignored)
...
あ、これはまずいね。includeはあらかじめ作っておくことにしよう。
% mkdir ~/dist/i386-{cygwin,mingw32,msdosdjgpp}/usr/local/include
% make install
../eruby.h -> /home/watanabe/dist/i386-cygwin/usr/local/include/eruby.h
chmod 0644 /home/watanabe/dist/i386-cygwin/usr/local/include/eruby.h

_ i386-mingw32:

% cd ../mingw
% i386-mingw32-ruby ../Makefile.RB
% make
% i686-pc-cygwin-strip eruby.exe
% upx eruby.exe
% make install

_ pack:

% cd ..
% cat >../eruby.contents
DOC=ChangeLog README.* eruby.rd
CONTENTS=usr/local/bin/eruby.exe \
usr/local/man/man1/eruby.1
% make -f ../Makefile.pack PACKAGE=eruby VERSION=20001222 TARGET=i386-cygwin
% make -f ../Makefile.pack PACKAGE=eruby VERSION=20001222 TARGET=i386-mingw32

libstdc++.a

Cygwin MLを見てるとMinGW用のlibstdc++.aを/usr/lib/mingwへ置こうという話が出てる。 そうなるとbmingw packageのlibstdc++.aも要らなくなる。 -D__MSVCRT__の話も出てるけど、どうなるんだろう?

2001-02-07 (Wed)

windres

heliumにこっそり--target=i686-pc-cygwinな環境を作ったら、
winver_stamp: mkvers.sh include/cygwin/version.h winver.rc $(DLL_OFILES)
        @echo "Making version.o and winver.o";\
        $(SHELL) ${word 1,$^} ${word 2,$^} ${word 3,$^} $(WINDRES) && \
        touch $@ && \
        $(COMPILE_CXX) -o version.o version.cc
でエラーに。 windresがi686-pc-cygwin-gccを呼ぼうとするが、 今作ってるんだからあるわけがない。とりあえず一時的に
% ln -s /usr/bin/gcc ~/bin/i686-pc-cygwin-gcc
してごまかす。これはすでにインストールされてる環境だとcrossといえども 気づきにくい。nativeだとgccが呼ばれるだけだからエラーにもならないし。

expat 1.95.0

ruby-talk MLを見ててxmlparserを思い出す。 まずはexpatだ。

_ i386-cygwin:

% tar xfvz expat-1.95.0.tar.gz
% cd expat-1.95.0
% mkdir cygwin mingw
% CC=i686-pc-cygwin-gcc \
  NM=i686-pc-cygwin-nm \
  AR=i686-pc-cygwin-ar \
  RANLIB=i686-pc-cygwin-ranlib \
  LD=i686-pc-cygwin-ld \
  CFLAGS=-Os \
  ../configure \
  --target=i386-cygwin \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux \
  --prefix=/usr/local/cygwin-local
% make
% make install
...
/usr/bin/ginstall -c -m 644 expat.h /usr/local/cygwin-local/include
/usr/bin/ginstall: expat.h: No such file or directory
make[1]: *** [install] Error 1
...
あ、srcdirに対応してないなあ。面倒なのでcygwin/lib/Makefileを書き換える。

APIHEADER = $(srcdir)/expat.h

と思ったがこれからMinGWもあるのでlib/Makefile.inを書き換える。

_ i386-mingw:

% cd ../mingw
% CC='i686-pc-cygwin-gcc -bmingw' \
  NM=i686-pc-cygwin-nm \
  AR=i686-pc-cygwin-ar \
  RANLIB=i686-pc-cygwin-ranlib \
  LD=i686-pc-cygwin-ld \
  CFLAGS=-Os \
  ../configure \
  --target=i386-mingw32 \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux \
  --prefix=/usr/local/mingw
...
checking whether byte ordering is bigendian... configure: error: \
  can not run test program while cross compiling
あ、bigendianチェックがあったのか。ac_cv_c_bigendian=yesを追加。
% CC='i686-pc-cygwin-gcc -bmingw' \
  NM=i686-pc-cygwin-nm \
  AR=i686-pc-cygwin-ar \
  RANLIB=i686-pc-cygwin-ranlib \
  LD=i686-pc-cygwin-ld \
  CFLAGS=-Os \
  ac_cv_c_bigendian=yes \
  ../configure \
  --target=i386-mingw32 \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux \
  --prefix=/usr/local/mingw
% make
% make install

xmlparser 0.6.1

% tar xfvz xmlparser-0.6.1.tar.gz
% cd xmlparser
% mkdir cygwin mingw

_ i386-cygwin:

% cd cygwin
% i386-cygwin-ruby ../extconf.rb
% make
...
xmlparser.o(.text+0x15):xmlparser.c: \
  undefined reference to `_imp__XML_ParserFree'
...
あれ?これも_imp__か。うーむ。結局
/usr/local/cygwin-local/include/expat.h
/usr/local/mingw/include/expat.h
を書き換えることにした。
% make clean
% make
% upx *.so
% make site-install

_ i386-mingw32:

% cd ../mingw
% i386-mingw32-ruby ../extconf.rb
% make
% upx *.so
% make site-install
そういえばlib/*.rbがインストールされてない。 そもそもMakefileに出てこない。 mkmf.rbがsrcdirに対応してないようだ。 明日考えよう。

2001-02-08 (Thu)

mkmf.rb

というわけでcommitした。

xmlparserの続き

_ pack:

% cat >../xmlparser.contents
DOC=Encodings MANIFEST README* obsolete samples
CONTENTS=usr/local/lib/ruby/site_ruby/$(RUBYVER)/$(TARGET)/xmlparser.so \
usr/local/lib/ruby/site_ruby/$(RUBYVER)/{\
sax.rb,xmldigest.rb,xmltree.rb,xmltreevisitor.rb,\
saxdriver.rb,xmlencoding-ja.rb,xmltreebuilder-ja.rb,\
wget.rb,xmlparser.rb,xmltreebuilder.rb}
% make -f ../Makefile.pack PACKAGE=xmlparser VERSION=0.6.1 TARGET=i386-cygwin
% make -f ../Makefile.pack PACKAGE=xmlparser VERSION=0.6.1 TARGET=i386-mingw32
{}を使いたくなったので Makefile.packにSHELL=/bin/bashを追加した。

ruby 1.6.2 (2001-02-08)

更新した。

2001-02-09 (Fri)

gcc-2.95.2-7

いつのまにかcurrentからtestになってるような気がする。

libstdc++.a for MinGW

これは次回のリリースには/usr/lib/mingwへ置かれそう。 そうなるとbmingw packageはなくてもいいね。

c:/usr/local/bin\ruby.exe

niftyのFEXTというフォーラムで先週djgpp版のrubyの挙動について質問があった。 RUBYLIBを設定しないとkconvがrequireできないという。 で、その方が調べた結果、__dos_argv0には

c:/usr/local/bin\ruby.exe

が入ってるという話。それはかなり予想外だ。 Win98ではどう頑張っても

C:\USR\LOCAL\BIN\RUBY.EXE

にしかならない。PATH=c:/usr/local/binしても同じ。
どうせ/に変換するわけだから、先にすることにした。 これで「表bin」というディレクトリに置かれていた場合にも、 正しく対応できるようになるってかなり苦しいいいわけではある。


2001-02-10 (Sat)

xmms 1.2.4

_ xmms-1.2.4j-20010104:

xmms-1.2.4j-20010104.diff.bz2をあててconfigure。
% CFLAGS=-Os ./configure --enable-kanji
...
Note: Configure has discovered that you already have xmms installed and
it do not match with the given --prefix. You have xmms installed in
/usr/local/bin/xmms and you chose /usr/local/bin/bin/xmms
Rerun configure with the --prefix option set to the correct location
of the old xmms.
Or simply uninstall the old xmms.
と脅しがかかる。 なんかよくわからんが--prefix=/usr/localをつけてもう一度。
% CFLAGS=-Os ./configure --enable-kanji --prefix=/usr/local
% make
% sudo make install
% sudo ldconfig
% xmms

Segmentation fault

あなたはXMMSのバグを見つけたようです。
http://www.xmms.org/bugs を開いてバグレポートを送ってください。
どうもxmms-1.2.4j-20010104.diff.bz2をあてるとSEGVるようだ。 とりあえず最新をまた探してこよう。

_ xmms-1.2.4j-20010119:

xmms-jaに行ってみると最新はxmms-1.2.4j-20010119になっていたので、 これでもう一度やってみる。
% CFLAGS=-Os ./configure --enable-kanji --prefix=/usr/local
% make
cd . && aclocal
aclocal: configure.in: 10: macro `AM_DISABLE_STATIC' not found in library
aclocal: configure.in: 11: macro `AM_PROG_LIBTOOL' not found in library
aclocal: configure.in: 180: macro `AM_GNU_GETTEXT' not found in library
make: *** [aclocal.m4] Error 1
% ls -l --fu aclocal.m4 configure.in              
-rw-r--r--   1 watanabe ruby        77183 Sat Feb 10 19:44:16 2001 aclocal.m4
-rw-r--r--   1 watanabe ruby        14949 Sat Feb 10 19:44:17 2001 configure.in
patchをあてるタイミングでconfigure.inのほうが新しくなってしまったのが原因だ。 アルファベット的にもconfigure.inのほうが新しくなる確率は高い *1。 touchすると今度はautomakeしようとするし、あー面倒。 autoconfしちゃえばいいんだけど、どうもautoconf 2.49あたりに依存してい るらしく、なんかこれも面倒。というわけでtouch作戦を敢行。
% touch aclocal.m4
% touch Makefile.in
% touch configure
% touch config.status
% touch stamp-h.in
% make
でよさそうだ。なんでもかんでもMakefileに書くのも善し悪しだ。

_ タイトル:

タイトルが化ける。sjis2eucを2回してるような化けかただな。

*1: RubyのCVSでconfigureを含めないのはこれが理由。 cvs updateでconfigureよりconfigure.inが新しくなる可能性がある。 autoconfの違いで作られるconfigureも違ってしまい、 次回のcvs updateでconflictする。

autoconf on DJGPP

DJGPPの環境はあまり追い掛けてなかったんだけど、 ずいぶん前からautoconf 2.13が使えるようになっているようだ。 試してみよう。

_ bash:

こういうシェルスクリプトは/bin/shが基本なので
bash-2.04$ mkdir c:/bin
bash-2.04$ cp c:/djgpp/bin/bash.exe c:/bin/sh.exe
しておく。

_ autoconf:

rubyのソースを展開したらautoconfする。 これでDJGPPの環境に合ったconfigureが作られる。 bash上なら単に
bash-2.04$ autoconf
で実行できるが、MS-DOSプロンプト上の場合は
> bash autoconf
とする。

_ configure:

configureも同じ要領。

_ make:

なぜか

process.c:796: too many arguments to function `getpgrp'

で止まる。configure時に

checking whether getpgrp takes no argument... no

になってしまうのが原因だがなぜだろう?できあがったconfigureを見る。 なるほど。forkしてるのか。DJGPPはdummyのforkがあったりするのでこのテス トは無意味だ。クロスじゃないけどac_cv_func_getpgrp_void=yesを指定する のがいいね。それよりはconfigure.inに入れてしまったほうがいいような気も する。

_ /dev/env:

makeしてる様子をなにげなく見てると

gcc -Os -I. -I. -I/dev/env/DJDIR/include -c array.c

と表示されている。/dev/env/DJDIRなんてあり? kb.infoを見るとこういうことらしい。

You can use the special `/dev/env/foo/' construct in file names to
expand it into the value of the environment variable `foo' at run time.
`/dev/env/foo~bar~' will expand to `bar' if `foo' is undefined, or if
its value is empty.
$DJDIR/includeと同じ意味ってことか。なるほどねえ。

_ /dev/X/:

なんとなくまだありそうな気がするので、kb.infoを探ってみた。
File names which begin with `/dev/X/', where X is a drive letter, are
converted to the DOS `X:/' form; this is required for running some
Unix shell scripts which take apart the `PATH' variable where colons
separate directories.
Cygwinの/cygdriveに相当するものだ。
`PATH' to pseudo-Unix form.  For example, if the original
value of `PATH' is like this:

      PATH=c:\djgpp\bin;d:\gnu\emacs\bin

then setting `PATH_SEPARATOR=:' converts it to this:

      PATH=/dev/c/djgpp/bin:/dev/d/gnu/emacs/bin
のようにPATH_SEPARATORでPATHも変化する。 なかなか面白い仕組だ。

_ ruby.exe:

早速できあがったruby.exeで試してみる。
bash-2.04$ ./ruby -e 'print ARGF.gets' /dev/env/HOME/.zshrc
setenv() { export $1=$2 }
これだとcommand.comとかshellに依存することなく環境変数を参照できるわけだ。

<Prev(,) | Next(.)> | Recent(/)>> | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!