Just another Ruby porter,

〜2002年7月中旬〜


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

2002-07-11 (Thu)

研修合宿

代々木で研修合宿だ。


2002-07-12 (Fri)

研修合宿

二日目。疲れた。


2002-07-13 (Sat)

[Linux] dietlibc 0.18

Changes: There are new ports to x86_64 and IA64, stpcpy, expanded
large file support, better support for signals (signal now has BSD
signal semantic), a clone for PA-RISC, better support for gcc 3, and
header cleanups.

ということなので、Rubyも変更しなくていいかと思ったが、その辺りに変化なし。

[Ruby] OptionParser 0.9

更新。


2002-07-14 (Sun)

[Ruby] date2 3.3-1

というわけで、date.rb, parsedate.rbを足してrepackして3.3-1として更新。

[Ruby] bdb 0.3.2

更新。

[Ruby] YARAA Index

7/10の夜から死んでるようだ。WWWOFFLEのcacheだと

更新日時: Wed Jul 10 20:00:14 JST 2002

が最後。 本家は250KBもあるのでちとつらい。

B-DASH |ちょ|

歌詞に驚く。


2002-07-15 (Mon)

[Ruby][Cygwin] 拡張ライブラリ

以前はCygwin上でRubyの拡張ライブラリを作るには、 まずライブラリ自身の移植から始めていたが、 もうその必要もないようだ。 DLLもそのインポートライブラリ用意されてるし、 ライブラリを静的にリンクするのはやめようかな。

Boehm

残念ながら名前が違います。どう発音するのか難しい。

[Ruby] if /re/

warningになるので将来的には通らなくなるかもしれないけど、 わざわざwarn_unless_e_option()を作ってるので、 one-liner的には残るのかもしれない。

% echo '$_="a"; p true if /a/' | ruby-1.7.2
-:1: warning: regex literal in condition
true
% ruby-1.7.2 -e '$_="a"; p true if /a/'
true

で、結局は これですね。

[Ruby] cross cygwin環境

それはきっとgcc 3.1.1に違いない。 gcc-mingwを見ると何をすればいいかがわかるというか、 構造はbmingwとある意味そっくりだったり。


2002-07-16 (Tue)

Available for test: gcc-3.1.1-3, gcc2-2.95.3-9, gcc-mingw-3_1-20020516-2

やっと 全部 解消。file.cの問題もなくなった。

RubyWin

というわけで パッチです。


2002-07-17 (Wed)

[Cygwin] Linux上にgcc 3.1.1-3のクロス環境の作る

面倒なので、ライブラリとかヘッダはCygwinのパッケージをそのまま使うことにしよう。 用意するもの:

cygwin-1.3.12-2.tar.bz2
mingw-runtime-2.0-2.tar.bz2
w32api-1.5-1.tar.bz2
gcc-mingw-3_1-20020516-2.tar.bz2
binutils-20020706-2-src.tar.bz2
gcc-3.1.1-3-src.tar.bz2

binutilsは特になにも準備しなくてもmake可能。 gccは途中で<stdio.h>が必要になるので、 あらかじめ展開してそれなりの場所に置いとく。 というわけで順番としては

1. パッケージの展開と移動
2. binutilsのmake, install
3. gccのmake, install

となる。とりあえずprefixは/usr/local/test/cygwinとして、全く新規に作る。

% prefix=/usr/local/test/cygwin
% mkdir -p $prefix/i686-pc-cygwin
% tar xfv cygwin-1.3.12-2.tar.bz2 --us=bzip2 usr/{include,lib}
% tar xfv mingw-runtime-2.0-2.tar.bz2 --us=bzip2 usr/{include,lib}
% tar xfv w32api-1.5-1.tar.bz2 --us=bzip2 usr/{include,lib}
% mv usr/{include,lib} $prefix/i686-pc-cygwin

これで準備ok。binutilsは簡単。

% tar xfv binutils-20020706-2-src.tar.bz2 --us=bzip2
% cd binutils-20020706-2
% CFLAGS=-Os ./configure --prefix=$prefix --target=i686-pc-cygwin
% make
% make install

Cygwin上でgcc -vした結果を参考にconfigureのオプションを決める。

% tar xfv gcc-3.1.1-3-src.tar.bz2 --us=bzip2
% cd gcc-3.1.1-3
% mkdir cygwin; cd cygwin
% CFLAGS=-Os CXXFLAGS=-Os ../configure --enable-languages=c,c++ \
  --enable-threads=posix --with-system-zlib --enable-nls \
  --without-included-gettext --disable-shared --enable-interpreter \
  --disable-sjlj-exceptions --disable-version-specific-runtime-libs \
  --target=i686-pc-cygwin --enable-haifa --prefix=$prefix
% make
% make install

これでCygwinはok。で、

% touch foo.c
% i686-pc-cygwin-gcc -mno-cygwin foo.c 
i686-pc-cygwin-gcc: installation problem, cannot exec `cc1': No such file or directory

となるのはsymlinkやその他が足りないわけだ。ここでgcc-mingwを使う。

% mkdir -p $prefix/i686-pc-mingw32
% cd $prefix/i686-pc-mingw32
% ln -s ../i686-pc-cygwin/bin .
% ln -s ../i686-pc-cygwin/include/mingw include
% ln -s ../i686-pc-cygwin/lib/mingw lib        
% cd ~-/../..
% tar xfO gcc-mingw-3_1-20020516-2.tar.bz2 --us=bzip2 \
  etc/postinstall/gcc-mingw-3.1-20020516-1.tar | \
  tar xfv - -C $prefix

このままだと.exeつきのsymlinkなので、.exeを削除したsymlinkを張る。

% cd $prefix/lib/gcc-lib/i686-pc-mingw32/3.1.1
% ln -s ../../i686-pc-cygwin/3.1.1/cc1 .
% ln -s ../../i686-pc-cygwin/3.1.1/cc1plus .
% ln -s ../../i686-pc-cygwin/3.1.1/ccp0 .   
% ln -s ../../i686-pc-cygwin/3.1.1/tradcpp0 . 

要らないsymlinkを削除。

% rm *.exe

これでいけるはずだ。でも-vの結果はちょっと変だな。

ignoring nonexistent directory "/usr/local/test/cygwin/i686-pc-mingw32/sys-include/usr/local/test/cygwin/lib/gcc-lib/i686-pc-mingw32/3.1.1/../../../../i686-pc-mingw32/include`@ "
ignoring nonexistent directory "/usr/local/test/cygwin/i686-pc-mingw32/include"(

と、なんか壊れてるっぽい。うーむ。


2002-07-18 (Thu)

gcc 3.1.1-3 buffer overrun

-mno-cygwinを指定すると、"-cygwin"を"-mingw32"へ置換するようになった。 たとえばspecsのある

$prefix/lib/gcc-lib/i686-pc-cygwin/3.1.1

$prefix/lib/gcc-lib/i686-pc-mingw32/3.1.1

になる。これを見るとわかるように"-mingw32"は"-cygwin"より1バイト多い。 それがgcc/config/i386/cygwin.hのこのコメントの意味。

/* Allocate space for all of the machine-spec-specific stuff.
   Allocate enough space for cygwin -> mingw32 munging. */

実体は

char cygwin_cross_include_dir[sizeof (CROSS_INCLUDE_DIR) + 1] = CROSS_INCLUDE_DIR;

のように1バイト余分に確保している。 しかし、1バイトじゃ足りないのだ。実際は

$prefix/lib/gcc-lib/i686-pc-cygwin/3.1.1/../../../../i686-pc-cygwin/sys-include

のように"-cygwin"が複数回現われる。2個あるから本当は2バイト必要。 3.1.1では正規化もしてるのでその後で展開すればよさそうだが、 面倒なのと3個以上は出てきそうにないので、+ 2してお茶を濁すことにする。 問題になるのはCROSS_INCLUDE_DIRとTOOL_INCLUDE_DIRの2つ。 あ、prefixに"-cygwin"を含ませるとすごくまずいねえ。注意。

でもこれってcrossじゃなくても起きると思うんだけど、 なぜnativeでは問題ないんだろう?違ったpath表現になるのか?

gcc-3.1.1でのクロス環境構築

あのパッチはcrossとnativeで同じbmingw packageを使えるようにするためのものなので、 ふつうに使う分には要りません。mingwの-lstdc++問題もgcc-mingwで解決できるし。 gcc-mingwの構成については、 これ でわかるかなあ。

もはやbmingw packageはext/etcを通すだけの単なるライブラリにすぎないので、 ext/etcとwin32/のほうへmargeしてしまう方向で考えたほうがよさそう。

collect2

あ、

% ln -s ../../i686-pc-cygwin/3.1.1/collect2 .

を忘れてた。


2002-07-19 (Fri)

[Linux] hdparm

信じられないことに、hdparm -c 1 -d 1してないことに気づく。 というより、このPCは古すぎてDMAはサポートしてないようだ。

とりあえず32-bit I/O supportだけでもenableにしてみる。

% sudo hdparm -t /dev/hdb  

/dev/hdb:
 Timing buffered disk reads:  32 MB in  9.42 seconds = 3.40 MB/sec
% sudo hdparm -t -c 1 /dev/hdb

/dev/hdb:
 setting 32-bit I/O support flag to 1
 I/O support  =  1 (32-bit)
 Timing buffered disk reads:  32 MB in  5.82 seconds = 5.50 MB/sec

これだけでも結構違う。

試しにLinux 2.5.26をmake bzImageしてみる。

PATH=/usr/bin:$PATH make SHELL=/bin/bash bzImage \
  2054.73s user 163.83s system 98% cpu 37:27.74 total

前回 は54分。


2002-07-20 (Sat)

bash 2.05b

CHANGESを見るとマルチバイト対応が入ったようだ。

3.  New Features in Bash
<snip>
c.  New code to handle multibyte characters.

Perl 5.8.0

/.-Jによるとリリースされたらしい。 例によってperl-currentをrsyncしてみるとpatchlevel.hが変だ。

static  char    *local_patches[] = {
        NULL
        "DEVEL17641",
        ,NULL
};

これじゃ、もちろんエラーになる。 リリース時には間になにもはさまないはずだから大丈夫か。

もともとはこうなっている。

static  char    *local_patches[] = {
        NULL
        ,NULL
};

あまり見ない形式だ。 Cでは最後のcommaが許されるからこういう書き方は普通しない。 だからこそ起きたミスだ。

そういえば最後のjperlも

  static        char    *local_patches[] = {
        NULL
+       ,"jperl5.005_03-20000401.pat - April Fool"
        ,NULL
  };

としたんだっけ。

make testするとPerlIO/scalar.pmやPerlIO/via.pmがないと言われる。 PerlIO/Scalar.pmとPerlIO/Via.pmはあるな。typoか? やっぱtarballを取ってこないとだめだな。11MBだと?でかすぎ。


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