Just another Ruby porter,

〜2001年4月上旬〜


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

2001-04-01 (Sun)

hoge

homeと打とうとしてついhogeと打ってしまうことはないだろうか? 指が勝手に動いてる。

[Cygwin] gcc 2.95.3-2

_ make install:

いきなりmake installしてしまうとなにがどこにインストールされるのか、 ちと心配になるというのはよくあるよね。 そういうときはprefixをコマンドラインで指定して、 全然違う場所にインストールして様子を見てみよう。
% make install prefix=$HOME/cygwin/gcc-2.95.3-2
のように *1
i686-pc-cygwin-gcc -V 2.95.2-7
とかで過去のバージョンも呼び出せるんだから気にしなくてもいいかもしれない。 が、 gcc 2.95.3からはcppじゃなくてcpp0を呼び出すようになってしまったので、 あらかじめln -s cpp cpp0しとくとか工夫が必要。
Cygwinでsetup.exeを使ってgccをインストールし直すと、 御丁寧にも過去バージョンを消してくれるので注意。

_ tooldir:

いろいろ調べてみると、Cygwinのgcc-2.95.3-2.tar.gzは
% make install tooldir=/usr
で作ってあるらしい。このバージョンに限らないけど。 これで${prefix}/i686-pc-cygwinじゃなくなるわけでspecs問題も解決か? specs自体はmake時にbuild_tooldirを元に決めてるから、 これを指定すればうまくいきそうだが、 build_tooldirはasとかにもからんでくるのでmake時に指定するのはまずい。 よって、make install時にはtooldirだけ指定し、specsはその後、手で修正する。
% sudo make install tooldir=/usr/local/cygwin
このままだとgccだけなので、 以前インストールしたCygwin 1.1.8-2も同じようにインストールし直す。 で、これで-mno-cygwin環境がましになったので、 Cygwin 1.1.8-2を最初からmakeし直すことにした。 最初からgccといっしょにmakeしとけばいいと今になって気づく。まあいいや。

_ libstdc++.a:

-lstdc++が見つからないエラーで止まる。 見てみるとtooldirを指定しても強制的に間にi686-pc-cygwinが入るようになってるようだ。 しょうがないから手でsymlinkを張り直す。
% cd /usr/local/cygwin/lib/gcc-lib/i686-pc-cygwin/2.95.3-2
% sudo rm libstdc++.a
% sudo ln -s ../../../../lib/libstdc++.a.2.10.0 libstdc++.a
これで最後まで通る。同じように
% sudo make install tooldir=/usr/local/cygwin
する。修正したspecsは差分じゃなくてそのまま ここに置いとこう。

*1: Rubyの場合はDESTDIRを使う。

JARH

$><<{'Just another Ruby hacker,'=>''}.default=0

2001-04-02 (Mon)

[mingw32] opendirと-mno-cygwin

mswin32版はwin32/win32.cのopendirを使っているが、 mingw32版は-lmingw32のopendirを使ってる。 これは最初に移植した際missing/dir.hをincludeするとエラーになってしまい、 面倒なのでmingw32が提供してるものを使おうと日和ったからだが、 MSVCRTとCRTDLLとの違いがもろに出るのでまじめに対応することにした。
これでstat問題はひとまず関係なくなる。 つまりbmingw packageを使わなくても-mno-cygwinでいける。

[Cygwin] specs

昨日のspecsだとdllwrap経由の時に-lcygwinが見つからないというエラーになる。 tooldir=/usr/local/cygwinの所為だ。 dllwrapに-vをつけて様子を見るとgccに-nostartfilesをつけてる。 -L/usr/local/cygwin/libは*startfile:にあるから、これじゃ見つからない。 というわけでlib:に移動。

i586-pc-msdosdjgpp-gcc

Ruby 1.6.4までにgcc 2.95.3のi586-pc-msdosdjgpp-gccを用意しようと思っているんだけど、 いつもstddef.hあたりでエラーになる件はもう問題ない?
i386-wrs-vxworks5.xのときも悩んだ記憶がある。

JARH

print eval 'Just another Ruby hacker,'.dump

2001-04-03 (Tue)

YAPC, YARPC

やぷしー、やるぷしーと読む。

[Cygwin] cygcheck -s

なんか変だなと思ったら
% cygcheck -s
しよう。まじで。

1000000000

fj.os.ms-windows.programmingを見てたら「2001年9月9日問題」とか出てた。 なんだそれはと思ったら、
% ruby -e 'p Time.at 1000000000'
Sun Sep 09 10:46:40 JST 2001
ということらしい。 つまりこの日に9桁から10桁になるわけだ。 そんなとこに依存するバグを作るのも難しいと思うんだけど。

JARH

print 'Just another Ruby hacker'.concat ?,

2001-04-04 (Wed)

[DJGPP] gcc-2.95.3

% tar xfvz gcc-2.95.3.tar.gz
% cd gcc-2.95.3
% mkdir obj; cd obj
% CFLAGS=-Os CXXFLAGS=-Os \
  ../configure \
  --target=i586-pc-msdosdjgpp \
  --enable-languages=c,c++ \
  --enable-shared \
  --enable-c-mbchar
% sudo mkdir -p /usr/local/lib/gcc-lib/i586-pc-msdosdjgpp/2.95.3
% make
やっぱり、size_tとwchar_tがまずいね。ちと調査が必要だな。

JARH

print 'Just another Ruby hacker,'.intern.to_s

2001-04-05 (Thu)

[Cygwin] w3m

WinNTでSEGVる件は
char *p = "";
*p = '\0';
が原因だった。WinNTは保護されてるんだね。 なにしろgdb上で実行すると
% w3m http://host/index.html > index.html
と同じような感じになり、ちゃんと動いてしまうからデバッグにならない。 termcapのacが問題だからTERMがcygwinとかlinuxなら問題なく動く。 これ以外に設定してる人かつWinNTとなるとかなり確率は低い。
パッチは ここに置いとこう。
回避するには-fwritable-stringsでもいいけど、 このオプションを使うとなんか負けた気分になるのであまり使いたくない。
Linuxでの実行例:
% cat hoge.c
main()
{
    char *p = "";
    *p = '\0';
}
% gcc hoge.c
% ./a.out
zsh: segmentation fault  ./a.out
% gcc -fwritable-strings hoge.c
% ./a.out                      
%

[ANNOUNCEMENT] Added: apache_1.3.20 will support Cygwin

1.3.20ではout-of-the-boxでサポートされる。 っていつの間にか1.3.19になってたのか。 ついこの間まで1.3.14だと思ってたのに。

JARH

print 'Just another Ruby hacker,'.dump[1..-2]

2001-04-06 (Fri)

sh-elf-gcc

会社でshでelfなcross gccをCygwin上に構築。
multilibを作る途中のconfigureで、 どうもcross-compileしたものを無理矢理実行するテストがあるような気がする。 Windowsが出すalertがうるさい。

_ cross compilerをcrossで作る:

Cygwin上で動くsh-elf-gccをLinuxで作るには
% ./configure 
  --target=sh-elf \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux-gnu
という感じでconfigureを実行すればよい。 もちろんあらかじめ--target=i686-pc-cygwinで作ったクロスの環境は必要だけど。
mingw32版rubyはそんな感じの指定になっている。
% env CC='i686-pc-cygwin -mno-cygwin' \
  ./configure \
  --target=i386-mingw32 \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux-gnu \
  ...

JARH

'Just another Ruby hacker,'.each_line do |x| print x end

2001-04-07 (Sat)

花見

というか花吹雪見物。それはそれで見物であったが。

sh-elf-gcc

訂正。Linux上に必要なのは--target=sh-elfな環境だった。

JARH

['JUST ANOTHER ', 'RUBY HACKER,'].each do |x| print x.capitalize end

2001-04-08 (Sun)

[Cygwin] gcc-2.95.3-2

gcc -mno-cygwinで-mwin32相当もonになったはずだが、肝心の変更が
%{mwin32|no-cygwin:...}
じゃ、-no-cygwinのときだから全然だめだよ。 rubyは-mwin32が新設されたときに強制的につけるようにしたから問題ない。 GNU dbmを作っていて気づいた。

GNU dbm

cygwin版もmingw32版もndbmはGNU dbmのndbm互換インターフェースを使っているけど、 Win9x/MEではファイルをLockFileしたままCopyFileしようとするとエラーになる。 WinNT/2kでは問題ない。こういうよくわからない非互換性は面倒だよね。 mignw32版gdbmはなぜかLockFileすらできないし。うーむ。 というわけでWin9x/MEだったらLockしないことにする。 更新は次回に。

JARH

printf '%.25s', 'Just another Ruby hacker,JARH'

2001-04-09 (Mon)

WinNT/2k vs. Win9x/ME

例の
% ruby -e 'Thread.new{`echo test`}.join'
なんだけど、WinNTだとまったく問題なし。 [ruby-dev:12795]のスクリプトもちゃんと動く。どうしてこんなに違うんだ?

[Cygwin] GNU dbm

crossでconfigureしようとしたらなんか変だ。 明日考えよう。

JARH

print 'Just another Ruby hacker,'.split(/Z/)[0]

2001-04-10 (Tue)

ruby-talk ML

流量が急に落ちてる気がする。爆発以前に戻ったというか。 そのくらいで落ち着いてくれるとありがたい。

GNU dbm

_ configure:

% tar xfvz gdbm-1.8.0-3-src.tar.gz
% cd gdbm-1.8.0
% CC=i686-pc-cygwin-gcc \
  LD=i686-pc-cygwin-ld \
  AR=i686-pc-cygwin-ar \
  RANLIB=i686-pc-cygwin-ranlib \
  NM=/usr/local/cygwin/bin/i686-pc-cygwin-nm \
  ./configure \
  --target=i686-pc-cygwin \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux-gnu \
  --prefix=/usr/local/cygwin-local
<中略>
checking host system type... \
Invalid configuration `i686-pc-cygwin': system `cygwin' not recognized
<後略>
なんとcygwinが認識されない。なぜに?
% ls -l config.sub
-rwx------   1 watanabe ruby        19802 May 19  1999 config.sub
なるほど2年前だとするとcygwin32じゃないとだめか。 中を見るとやはり-cygwin32*になってる。というわけで
--host=i686-pc-cygwin32
にしてもう一回。 binutils軍団は全部i686-pc-cygwinをつけてるから、 実のところ--hostはほとんど意味なし。

_ make:

早速makeすると
/bin/sh ./libtool --mode=compile i686-pc-cygwin-gcc -c   -I. -I. -O dbminit.c
i686-pc-cygwin-gcc -c -I. -I. -O dbminit.c
dbminit.c: In function `dbminit':
dbminit.c:49: function `dbminit' definition is marked dllimport
make: *** [dbminit.lo] Error 1
該当する行を見ると
GDBM_EXPORT(int, dbminit) (file)
     char *file;
となってる。 GDBM_EXPORTはsystems.hで定義されている。DLL絡みだな。 じーっと見ると-DGDBM_STATICすればよさそう。てゆうか
Makefile.cygwin
なんてのがあるじゃん。なぬ?
つづく。

JARH

print 'Just another Ruby hacker,'.split(//)

<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!