Just another Ruby porter,

〜2001年1月上旬〜


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

2001-01-01 (Mon)

gcc-2.95.2-6

cygwin projectがいじってるgccは-5とか後ろについたりする。 Debianもたしかそんな感じだったか。

_

いつのまにか gcc-2.95.2-6が出てる。

_

gcc-2.95.2-5のときはversion.hの中身がgcc-2.95.2-4のままで /usr/local/lib/gcc-lib/i686-pc-cygwin/gcc-2.95.2-4/ というディレクトリ名になっていて気持ち悪かった。 クロスの環境を作るときに-5に直してmakeしたんだけど、 bmingwでも影響してnativeの windows側ではln -s gcc-2.95.2-{4,5} したりして、よくわからない状況に。

_

[ruby-dev:8817]を見ると年越しmakeしてる。 *1というわけで今年も年越しmakeだ。 Cygwin自体はCVSでupdateしてるでの常に最新のソースはある。 一応cygwin-1.1.7-1-src.tar.gzもgetしてはあるが,cvsupdateの メッセージを見てると1.1.7をリリースして以来あまり更新されてない。

_

最近はこんな感じでmakeしている。 *2
% cd /pub/cygwin
% tar xfvz gcc-2.95.2-6-src.tar.gz
% mkdir build
% cd build
% lndir ../src # /pub/cygwin/src に cvs co してるので
% for i in gcc libstdc++ libio
for> do
for> mkdir $i
for> cd $i
for> lndir ../../gcc-2.95.2-6/$i
for> cd ..
for> done
% mkdir obj # これ大事
% cd obj # この階層じゃないと make に失敗する. cygwin って変.
% CFLAGS=-Os CXXFLAGS=-Os ../configure --target=i686-pc-cygwin \
  --prefix=/usr/local/cygwin --enable-languages=c,c++ \
  --enable-targets=i686-pc-cygwin,i386-msdosdjgpp
% make
% sudo make install
このままだとspecsに/usr/include とか入っていてまったくもってクロスのことを考えてないので パッチを用意してみた。
% echo 'main(){}' > foo.c
% i686-pc-cygwin-gcc -v foo.c
で確認を。PATHを通すのも忘れずに。

*1: まだB20.1だったなあ。
*2: プロンプトは%だけどzsh。てゆうかzshのdefaultは PS1='%m%# 'なので%でいいじゃん。 てゆうか、なぜかtcshは'> 'だ。

2001-01-02 (Tue)

bmingw(1)

-bmingwと指定するからbmingwpackageなんだけど、じゃ-bmingwってなに?
% gcc --help | grep -e -b
  -b <machine>             Run gcc for target <machine>, if installed
ということだ。b mingw packageでももちろんいい。

_ gcc:

binutils, gccでクロスの環境をいくつか作っていると、 ディレクトリ構成がどうなっているのか自ずとわかってくる。
$prefix/bin
$prefix/include
$prefix/lib
$prefix/$target
$prefix/$target/bin
$prefix/$target/include
$prefix/$target/lib
ここで$prefixはdefaultだと/usr/local *1、$targetはcygwinだとi686-pc-cygwinが入る。
gccは$prefix/lib/gcc-lib/$target/$versionが結構重要だ。 このディレクトリにはcc1等がある。 たとえば過去のバージョンを残していれば
% i686-pc-cygwin-gcc -V 2.95.2-5 -v
Reading specs from /usr/local/cygwin/lib/gcc-lib/i686-pc-cygwin/2.95.2-5/specs
gcc driver version 2.95.2-6 19991024 (cygwin experimental) executing gcc version 2.95.2-5
という感じで呼び出すことができる。 *2
同じ$prefixで違う$targetのgccがインストールしてある場合は、 -bオプションでtargetを切り替えることもできる。

_ crtdll.dll と msvcrt.dll:

Cygwin用のgccでは現在-mno-cygwinというオプションでcygwin1.dll を必要としない実行ファイルを作ることができる。 これはcrtdll.dllを対象にしたものだ。 crtdll.dllはwindowsのシステムディレクトリに最初からある。

_

crtdll.dllは名前からわかる通りCのRunTimeライブラリのDLLだ。 同じようなものにmsvcrt.dllがある。 こちらのほうがサイズから見ても高機能。 *3

_

-mno-cygwinはcrtdll.dll固定になる。 -lmsvcrtと指定しても、その他のlibmoldname.aやcrt?.o はmsvcrt.dll用のものに切り替わるわけではないので、 正しい実行ファイルが作れない。 [ruby-dev:10361][ruby-dev:10362]

_

crtdll.dllを対象にした実行ファイルでも全然構わないんだけど、 最初に移植したmingw版rubyはperlを参考にしたため、 ばりばりmsvcrt.dllに依存している。 というわけで、できればmsvcrt.dllを使うようにしたい。

_

libmoldname.aなどのライブラリは、 他のディレクトリに置いといて-Lで指定すればいい。 crt?.oを探すときは-Bで指定したディレクトリを見る。 じゃ-mno-cygwinのようにspecsでそのように書いてあげればいいかと思うが これが結構悩む。 specsを変更するということはバージョンアップするたびに パッチをあてる必要がある。 配布されてるファイルをいじることにもなるし、 メンテナンス性が悪い。 *4そこで-bオプションを使いディレクトリごと分けることにした。 これでlibmoldname.aのように同じ名前のライブラリも安心して、 違うディレクトリに置くことができる。 実は-mno-cygwinのlibstdc++にも似たような問題があるのだが これも解決できる。

_ bmingw:

-bオプションを指定した場合gccはtargetを切り替えて実行する。 -bmingwと指定すればspecsは

$prefix/lib/gcc-lib/mingw/$version/specs

を使おうとするし、

$prefix/mingw/bin/{as,ld}

等を内部的に実行しようとする。ライブラリも

$prefix/mingw/lib

をまず探す。

_

symbolic link等を使いこれらのディレクトリに必要なものを配置する。 これが mingw packageだ。

_

つづく。

*1: わたしは/usr/local/cygwinにしている。
*2: このspecsにはcpp, cc1, as, ldなどに渡すオプションを指定できる。
*3: てゆうかthread-safeにしたいときはmsvcrt.dllにせざるを得ないらしい。
*4: bmingw packageはnativeのcygwinも一応考えている。

2001-01-03 (Wed)

bmingw(2)

昨日からのつづきだ。

_

import libraryはcygwinのものをそのまま使えばいいからsymlinkで対処。 できれば specs で対応できればいいんだけど。

_

header fileもw32api/やmingw/をそのまま使える。 これも以前はsymlinkを張っていたが、今はspecsで-Iを指定している。 w32apiを分けてくれたので助かる。

_

その他msvcrt固有のファイルはmingwというディレクトリの配下に置く。

_

その作業は mingw-runtimeを実際にmakeしてからだな。
% tar xfvz mingw-runtime-0.4-20001204.tar.gz
% cd mingw-runtime-0.4-20001204
% mkdir obj
% CC=i686-pc-cygwin-gcc CFLAGS=-Os CXXFLAGS=-Os ../configure \
  --target=i686-pc-cygwin \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux-gnu
% make
これできたが、このままmake installしてもあまり意味がないので、 必要なファイルだけを/usr/local/cygwin/mingw以下のコピーする。 なにをコピーするかはCRT0SとLIBSを参考に。
% sudo mkdir -p /usr/local/cygwin/mingw/lib
% sudo cp -av crt2.o dllcrt2.o CRT_noglob.o crtmt.o crtst.o \
  libmingw*.a libmoldname.a /usr/local/cygwin/mingw/lib/
残りはcrtdll.dll用なので要らない。

_

bmingwという名前はなんとなく違うが気がしてきた。 bmsvcrtにすべき?でもこれだけ子音が並ぶのもなんかやだな。 あ、-msvcrtとできればいいのか。 いやそれじゃspecs書き換え問題があるんだよって昨日書いたじゃん。

_

つづく。

日記

日記が流行ってる。21世紀になったことだしおいらも日記をつけてみよう。 て、なぜ一昨日そう書かない?

_

hns-2.10では静的にも作れるようになったらしい。h14mって
% echo -n 'hypernikkisystem'|wc
      0       1      16
ということか。

今日のCD

やたら気に入っている。 Last Smileのcouplingなんだけど。
〜LOVE PSYCHEDELICO/Wastingを聴きながら〜

2001-01-04 (Thu)

CVSup

ruby-1.3.1-990201.tar.gzというfileがまだMO に保存してあったりする自分に驚いたりする [ruby-list:26937]。でも、どのMOだったっけとか探したりするわけで、 正月だしrepositoryごと欲しくなるよね?

_

[ruby-dev:11887]を参考に CVSup Home Pageからたどって、とりあえずsourceだなと ここというか mirrorからsourceをgetした。Installを見るとModula-3が必要とあり PM3から、それもgetしようと考えた。ところがこれがとんでもなくでかい。 tarballで25MBもある。 Modula-3には興味ないし、正月とはいえこれを持ってくるほど豪気じゃない。 後から追加するものは一応自分でmakeする主義なんだけどこれはやめよう。

_

というわけでさっきのmirror siteのbinariesというディレクトリを覗く。 README.linuxを読むとcvsup.nogui-linux-ix86-libc6-16.1.tar.gz が目当てのpackageのようだ。 Modula-3も静的にリンクされてるので好都合。 てゆうか、なぜにModula-3を使うのだ、CVSupよ。
 % ldd cvsup
        libz.so.1 => /usr/lib/libz.so.1 (0x40019000)
        libm.so.6 => /lib/libm.so.6 (0x40027000)
        libc.so.6 => /lib/libc.so.6 (0x40043000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Installに従い/usr/local/binに置く。

_

例では/home/rubyみたいな感じになっているので
% sudo useradd -m ruby
% sudo chown -R watanabe ~ruby
% cd ~ruby
% mkdir cvs
% cat >cvs-ruby.sup
*default compress delete use-rel-suffix
*default host=cvs.ruby-lang.org
*default base=/home/ruby
*default release=cvs
*default prefix=/home/ruby/cvs
cvs-ruby
しておいた。準備OK。やってみよう。
% cvsup -gL2 ~ruby/cvs-ruby.sup
...
 Create www/whats.rd,v
 Create www/whos.rd,v
 Create www/wwwgen.rb,v
 SetAttrs www
Shutting down connection to server
Finished successfully
doc, ruby, wwwの各コレクションが取ってこれた。 15分ほどで無事終了。 noguiを取ってきたから-gはなくてもいい。
% du -s ~ruby
15667   /home/ruby
15MBか。 56Kモデムだけどこれだけ速いということは結構圧縮が効いてる。

_

これで次回からは差分データのやりとりになるから速くなるわけだ。

_

実際に1999-02-01あたりのparse.yを取り出してみると commitされてなかった。 そういえばあの頃はまだCVSがあまり活用されてなかった。
〜ポルノグラフィティ/サボテンを聴きながら〜

2001-01-05 (Fri)

bmingw(3)

すっかり忘れてたがbmingwだ。

_

まだなにも設定してないので
% i686-pc-cygwin-gcc -bmingw -v
Using builtin specs.
gcc version 2.95.2-6 19991024 (cygwin experimental)
のように-bmingwをつけてもspecsはbuiltinのものが使われる。 このチェックはちゃんと設定できたかどうかの確認にもなるで重要。

_

% sudo mkdir -p /usr/local/cygwin/lib/gcc-lib/mingw/2.95.2-6
% sudo touch /usr/local/cygwin/lib/gcc-lib/mingw/2.95.2-6/specs
% i686-pc-cygwin-gcc -bmingw -v
Reading specs from /usr/local/cygwin/lib/gcc-lib/mingw/2.95.2-6/specs
gcc version 2.95.2-6 19991024 (cygwin experimental)
このようにspecsを置くとgccは読んでくれる。

_

あとはsymlinkの設定だ。
% cd /usr/local/cygwin/lib/gcc-lib/mingw/2.95.2-6
% ln -s ../../i686-pc-cygwin/2.95.2-6/* .
ln: ./specs: File exists
% ls
SYSCALLS.c.X  cc1plus   cpp      libgcc.a     specs
cc1           collect2  include  libstdc++.a
% cd /usr/local/cygwin/mingw
% ln -s ../i686-pc-cygwin/bin .
libgcc.a,libstdc++.aはcygwin用なのでこのままでは実はまずい。 mingw用と差し替える必要がある。 これはmingw用gccを作らないと得られないのだが、面倒なので これのlibgcc.aとlibstdc++.aを使ってる。 今なら MingGW Project Infoからgccのbinaryを取ってきたほうがいいだろう。

_ libbmingw:

どこから持ってきたかも忘れてしまったんだけど *1、mingwにはsupplement packageというのがあった。 これの一部を使ってrubyのext/etcが使えるようなlibraryを作った。 *2。それがlibbmingwだ。specsには-lbmingwが入ってる。

_ bmingw-20000105.tar.gz:

% cd /usr/local/cygwin
% env GZIP=-9 tar cfvz /tmp/bmingw-20010105.tar.gz lib/gcc-lib/mingw mingw
これでやっとできた。 bmingw-20010105.tar.gzはcrossじゃないnativeのcygwinでもそのまま展開すれば使えるようになっている。
% cd /usr
% tar xfvz bmingw-20010105.tar.gz
% gcc -bmingw -v
Reading specs from /usr/lib/gcc-lib/mingw/2.95.2-6/specs
gcc version 2.95.2-6 19991024 (cygwin experimental)

_ (cygwin) tar-1.13.18:

どうもcygwinのtar-1.13.18は変だ。bmingw-20001128.tar.gzの symlinkがちゃんと展開されない。サイズ0になってしまう。 やっぱmakeinstallするようにしないとだめか。

*1: Earnieのweb pageのような気もする。
*2: それとopendir(3)でCharPrevを使うことでmultibyte対応にしてある。

2001-01-06 (Sat)

Cygwin 1.1.7-1

寒い。

_ mingw-runtime:

なにげにCygwin1.1.7-1の/usr/lib/mingwを見てみると、 いつのまにかmingw-runtime20001204相当のライブラリが既に入っているようだ。
% ls /usr/lib/mingw
CRT_noglob.o    crtmt.o         dllcrt2.o       libmingw32.a    libmsvcrt.a
crt1.o          crtst.o         libcoldname.a   libmingwthrd.a  libmsvcrt20.a
crt2.o          dllcrt1.o       libcrtdll.a     libmoldname.a   libmsvcrt40.a
ということは当然crossのほうにも同じようにあるわけで、うーむ、 一体何をやってたんだ俺は。
% ls /usr/local/cygwin/i686-pc-cygwin/lib/mingw
CRT_noglob.o  crtmt.o    dllcrt2.o      libmingw32.a    libmsvcrt.a
crt1.o        crtst.o    libcoldname.a  libmingwthrd.a  libmsvcrt20.a
crt2.o        dllcrt1.o  libcrtdll.a    libmoldname.a   libmsvcrt40.a

_ GNU fileutils:

あれ? 微妙に間隔が違う。そうか、 CygwinのほうはまだGNU fileutils 4.0にしてなかったんだ。
% ls --version
ls (GNU fileutils) 3.16
気づかなかったけど、こんな違いがあるとは。

_ bmingw:

ということは$prefix/mingw/libの大半は不要だな。 specsはどうしようかな。 native cygwinのほうはlibbmingw.aだけ残して消しちゃえばokだけど、 crossのほうはcrt2.oがどこにあるかを指定する方法がないから、 残すかsymlinkにするしかない。でもcrossのほうは間にi686-pc-cygwin というディレクトリを狭んでいるからsymlinkだとまずそう。 native cygwinは消しても動くわけだしsymlinkでもいいかな。

_ *multilib:

こういうときはやっぱ*multilibでしょ。というわけでspecsは
*multilib:
../../../../i686-pc-cygwin/lib/mingw ;
にしてみた。

_ *cross_compile:

まずいな。今までcross_compileを1にしてなかった。 ということはnative cygwinと同じspecsには絶対できないじゃん。 defaultは0にしてcrossの場合は書き換えてもらうことにしよう。 もしくは1にしてnative cygwinでもcrt2.oが見つかるようにするか? 結局0にしてmultilibでいくことにした。

_ -mno-cygwin:

そういえばcrossのほうで-mno-cygwinが
cannot open crt1.o: No such file or directory
になることに今頃気づいた。こっちのspecsのmultilibも直さないとだめだ。
*multilib:
../../../../i686-pc-cygwin/lib/mingw mno-cygwin;
*multilib_matches:
mno-cygwin mno-cygwin;
を追加。 パッチ

_ 今日の bmingw:

bmingw-20010106.tar.gzは昨日のよりさらに小さくなっている。
-rw-r--r--   1 watanabe ruby       173822 Jan  5 20:00 bmingw-20010105.tar.gz
-rw-r--r--   1 watanabe ruby       164825 Jan  6 20:49 bmingw-20010106.tar.gz
もっともmsvcrt.dll版rubyを作るだけなら、 1.1.7-1ではすでに材料は揃っているわけで、 bmingw packageは要らない気もする。 crt2.oを指定できればいいんだけど。
〜Mr.Children/NOT FOUNDを聴きながら〜

2001-01-07 (Sun)

ChangeLog

Rubyは国際派なもんだから,いつのころからかChangeLogから日本語が消えた。 英語はちょー苦手だからChangeLogを書くのは苦痛なんだけど、 過去に似たような記述があるかどうか探して、 怪しいコメントを書いている。

_ Change Log mode:

EmacsではM-xadd-change-log-entryとかすれば Change Log modeに移行するので楽だ。 customで昔の形式にしてある。
(custom-set-variables
 '(add-log-time-format (quote current-time-string)))
最近のEmacsだとこの変数はdefaultで
'add-log-iso8601-time-string
になっているので
Sat Jan  6 00:17:18 2001  WATANABE Hirofumi  <eban@ruby-lang.org>
ではなく
2001-01-06  WATANABE Hirofumi  <eban@ruby-lang.org>
という形式になる。そのうち誰かがこの形式で入れるかもしれない。

_ Vi:

英語しか書かないとなるとviでもいいじゃんって思う。 というわけで~/.jvimrcに
map ch 1G:-r!env LANG=C date +"\%a \%b \%e \%X \%Y  WATANABE Hirofumi  <eban@ruby-lang.org>"^V^M
と書いてある。chで日付が入るだけだから大したことはない。でも便利。 ^Vと^Mは実際は制御文字なので注意.

viのcommandmodeではアルファベットのほとんどが使われてしまっているので、 mapで追加するときに悩むことがある。 vimではさらに増えてるので特にそうだ。 でもcとかdのように複数のstrokeが必要なcommandをprefixにして しまえばいいとある日気づいた。 chはもともと一文字前をcするという意味だけど、 10年以上viを使っていても一度もそんな操作をしたことがない。 だから潰しても問題ない。 vimを使うようになってv系でrangeを指定できるのも大きいかな。 オリジナルのviでcをmappingしようとすると

Too dangerous to map that

と怒られる。

Microsoft.NET

なんとなく.NET Framework SDKをインストールしてしまった。 「C#で学ぶ.NETプログラミング」技術評論社

_ C# で Hello world:

やっぱり最初は「こんにちは世界」だ。
using System;

public class hello
{
    public static void Main()
    {
        Console.Write("こんにちは" + "世界" + "\n");
    }
}
これをUnicodeでセーブして(hello.cs)、コンパイル。
% csc hello.cs
Microsoft (R) Visual C# Compiler Version 7.00.9030 [CLR version 1.00.2204.21]
Copyright (C) Microsoft Corp 2000. All rights reserved.

% ./hello
こんにちは世界
Windows 2000だとUnicodeなファイルをメモ帳で簡単に作れるけど、 Windows 95/98/Meだとそれなりのエディタが必要かもしれない。

_ jvim:

そこでjvimだ。vim3.0をベースに独自の道を歩んでいる。 *1これはE, S, JのほかにUnicode, UTF-8も扱える。 *2

_ SJIS:

C#コンパイラのcsc.exeはUnicodeのsourcefile しか扱えないというような記述があった。 じゃSJISで書いて試してみよう。
  Console.Write("こんにちは" + "表" + "世界" + "\n");
お約束の"表"を追加してみた(hello-sjis.cs)。
% csc hello-sjis.cs
Microsoft (R) Visual C# Compiler Version 7.00.9030 [CLR version 1.00.2204.21]
Copyright (C) Microsoft Corp 2000. All rights reserved.

% ./hello-sjis
こんにちは表世界
なんとエラーにならずにコンパイルできてしまった。 しかもちゃんと化けずに表示されるし。 ってことは一応マルチバイト対応もしてるんだなあ。

_ (17:39)初雪:

寒いわけだ。

*1: ここからたどってね。
*2: てゆうかRuby使いならuconvかiconv拡張ライブラリで変換でしょ。
〜小松未歩/未来を聴きながら〜

2001-01-08 (Mon)

Cygwin, MinGW

Mingw32は当初長崎大学のColin Petersって人が始めたものだ。 Minimalist GNU-Win32と表記していた。 これはCygwinがまだGNU-Win32と名乗っていたからだ。 現在はMinGW - Minimalist GNU for Windowsとなっている。 MinGW今流行りのsourceforgeで管理されている。

_ Mingw32:

最初の頃はCygwinとは別にinclude, libのディレクトリを用意して、 GCC_EXEC_PREFIX, LIBRARY_PATH, C_INCLUDE_PATH, CPLUS_INCLUDE_PATH の各環境変数を設定するような感じだった。
印象的だったのは
typedef void    FILE;
と定義してあったことだ。なつかしい。

_ -mno-cygwin:

一昨日の/usr/lib/mingwを見てて思ったんだけど
% ls /usr/lib/mingw
CRT_noglob.o    crtmt.o         dllcrt2.o       libmingw32.a    libmsvcrt.a
crt1.o          crtst.o         libcoldname.a   libmingwthrd.a  libmsvcrt20.a
crt2.o          dllcrt1.o       libcrtdll.a     libmoldname.a   libmsvcrt40.a
いつのまにかlibcoldname.aがある。 元々はlibmoldname.aしかなかった。 このmはmingwのmを意味していたと思われるが、 msvcrtの意味に変わったらしい。cはもちろんcrtdllだ。 とするとspecsの中身が気になるが、libcoldname.aが使われていない。 gccのほうがまだ追従してない。 問題になるのは
% diff -u1 moldname-{crtdll,msvcrt}.def
--- moldname-crtdll.def	Sat Nov 18 08:12:18 2000
+++ moldname-msvcrt.def	Sat Nov 18 08:12:18 2000
@@ -1,3 +1,3 @@
 ;
-; moldname-crtdll.def 
+; moldname-msvcrt.def 
 ;
@@ -36,2 +36,4 @@
 
+daylight DATA
+
 dup
@@ -114,2 +116,4 @@
 tempnam
+
+timezone DATA

のようにdaylightかtimezoneを使ったときだ、たぶん。 でもほとんど問題にならないだろう。

-msvcrt, -Zmsvcrt

specsを変更するのは どーのこーのと書いたが,では-msvcrtオプションを追加することは本当に可能なのか? やってみよう。native cygwin上で実験。
このまま-msvcrtをつけたらgccは知らないオプションなので、 cc1が文句を言ってエラーになる。
% gcc -msvcrt foo.c
cc1.exe: Invalid option `svcrt'
あ、こりゃだめだ。しょうがない-Zmsvcrtにしよう。
% gcc -Zmsvcrt foo.c   
gcc: unrecognized option `-Zmsvcrt'
今度はcc1に渡らなかったので一応最後まで通った。 *cppに%{Zmsvcrt:-D__MSVCRT__}を追加してみる。
% gcc -specs=$PWD/specs -Zmsvcrt foo.c
OK。これでなんとなくできそうな予感がしてくる. *1

_ -mno-win32:

*cppのところを見てて驚いたんだけど、 いつのまにか-mno-win32というのが増えてる。 これは指定されると
-D_WIN32 -DWINNT -idirafter /usr/include/w32api 
のオプションが外れる。まさに完全UNIX modeだ。

_ *cpp, *link, *lib:

それはいいんだけど、余計な作業が増えるので実は厄介だ。 %{mno-cygwin:...}には|でZmsvcrt を追加。 %{!mno-cygwin:...}には更に%{!Zmsvcrt:...}で囲む。 という作業と最初に追加した%{Zmsvcrt:-D__MSVCRT__}で*cppは完了。 *link, *libも同じ要領。

_ *libgcc:

ここはmsvcrt用の設定が必要。と同時に-mno-cygwinのときは-lcoldname をlinkするように修正。

_ *startfile:

かなりややこしい。基本的に-Zmsvcrtが指定されたときだけcrt2.oが linkされるようにすればいい。

_ specs.Zmsvcrt:

そしてできあがったのが specs.Zmsvcrtだ。

_ -Zmsvcrt:

これで
gcc -specs=specs.Zmscvrt -Zmsvcrt foo.c
が可能になる。specs.Zmsvcrtを /usr/lib/gcc-lib/i686-pc-cygwin/2.95.2-6/specs へコピーすれば、どこからでも-Zmsvcrtできる。もとのspecsはbuiltin specsと同じなので保存しなくてもいい。
% cmp /usr/lib/gcc-lib/i686-pc-cygwin/2.95.2-6/specs =(gcc -dumpspecs)
ところで-specsを指定したときに気になるのは最初にspecsを読んでることだ。
% gcc -specs=specs.Zmsvcrt -v                              
Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/2.95.2-6/specs
Reading specs from specs.Zmsvcrt
gcc version 2.95.2-6 19991024 (cygwin experimental)
これって差分だけでいいんじゃない? どうやらそういうことみたい。 ここではたと気づく。 じゃ-Zmsvcrtすら要らなくてspecsの指定だけで切り替えればいいじゃん. このspecsを指定したときはmsvcrt専用ということにして。 あとはcrossも考えて-lbmingwもlinkするようにしないとね。

_ specs.msvcrt:

そしてできあがったのが specs.msvcrtだ。

*1: (02:36)5cmぐらい積もったようだ。

gawk 3.0.6

native cygwin 上の話.

_ -mno-cygwin:

CC='gcc -mno-cygwin' で gawk 3.0.6 を configure してたら
checking whether getpgrp takes no argument
をチェックしてるところでハング。
% objdump -p conftest.exe | grep 'DLL Name'
        DLL Name: KERNEL32.dll
        DLL Name: cygwin1.dll
        DLL Name: crtdll.dll
なぜかcygwin1.dllがlinkされてる。config.logを見ると
gcc -mno-cygwin -o conftest -Os   conftest.c -lm
と実行されている。一見問題なさそう。 が、ここはfork()を使ってるから、 そもそもconftest.exeは作られずエラーになるはず。 としたらもう原因は-lmしかない。
% cd /usr/lib
% ls -l libm.a
lrw-r--r--   1 watanabe ruby           22 Dec 29 17:14 libm.a -> libcygwin.a
うーむ。なにそれ? libm相当のものはCygwin DLLに含まれているから、 libm.aが必要ないというのわかるけど、これはひどい。
% ar rcv libm.a
で空のlibraryを作ればすむ話なのに。
% ls -l libm.a
-rw-r--r--   1 watanabe ruby            8 Jan  8 15:50 libm.a
しかもsymlinkよりもサイズは小さい。

_ Ruby は?:

Rubyでなぜ問題にならないかというとcygwin, mingw32のときは -lmはlinkしないようになっている。 具体的にはconfigure.inのこのあたり。
cygwin*)        rb_cv_have_daylight=no;;
mingw*)         LIBS="-lwsock32 -lmsvcrt $LIBS"
                ac_cv_header_a_out_h=no
                ac_cv_header_pwd_h=no
                ac_cv_header_utime_h=no
                ac_cv_header_sys_ioctl_h=no
                ac_cv_header_sys_param_h=no
                ac_cv_header_sys_resource_h=no
                ac_cv_header_sys_select_h=no
                ac_cv_header_sys_times_h=no
                ac_cv_func_times=yes;;
defautl は
*) LIBS="-lm $LIBS";;
だ。

_ make:

gawkのほうはconfigureも通ってmake。
gcc -mno-cygwin -c -DGAWK -I. -I.  -DHAVE_CONFIG_H -Os -DDEFPATH='".:/usr/local/share/awk"' ./gawkmisc.c
./gawkmisc.c:31: gawkmisc.pc: No such file or directory
gawkmisc.pcがないという。 なんか変なの。pc/Makefileを見るとここで makeするのが正しいってことなんだろうけど。

_ pc/:

そうじゃなくて
% cp -a pc/* .
% make mingw32
ってことらしい。このままだとCC=gccのままなのでCC='gcc -mno-cygwin' に変更。 main.cのenviron関係で
main.o(.text+0x1200):main.c: undefined reference to `_environ_dll'
になるが
        extern char **environ;
の所為なので、他のplatformと同じように#if ... #end。 これでできた。-specs.msvcrtも試す。ok。
〜クリンゴン/珈琲を聴きながら〜

2001-01-09 (Tue)

configure のオプション

いま与えてるconfigureのオプションはかなり複雑になっている。

_ i386-cygwin:

cygwinではこんな感じ。
#!/bin/sh
CFLAGS=-Os CC='i686-pc-cygwin-gcc' \
  ac_cv_func_getpgrp_void=yes \
  ac_cv_func_setpgrp_void=yes \
  ../ruby-1.6.2/configure \
  --target=i386-cygwin \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux-gnu \
  --program-prefix='' \
  --includedir=/usr/local/cygwin-local/include \
  --srcdir=../ruby-1.6.2 \
  --cache=../config.cache-cygwin \
  --with-tcl-dir=/usr/local/mingw \
  --with-tk-dir=/usr/local/mingw \
  --enable-tcltk_stubs \
  --with-tcllib=tclstub83 \
  --with-tklib=tkstub83 \
  --with-opt-dir=/usr/local/cygwin-local \
  --enable-shared
/usr/local/cygwin-localというのがいかにも怪しいが、 /usr/local/cygwin/{include,lib}に他のライブラリ関係を置いてしまうと、 Cygwinのものと混ざってしまいバージョンアップとかがしづらくなるので分けた。 でも気にいらないので考え中。
% ls /usr/local/cygwin-local/{include,lib}
/usr/local/cygwin-local/include:
curses.h     cursesw.h  gd.h       gdfontl.h   ncurses.h      readline   zlib.h
cursesapp.h  cursslk.h  gd_io.h    gdfontmb.h  ncurses_dll.h  tcpd.h
cursesf.h    dbm.h      gdbm.h     gdfonts.h   ndbm.h         termcap.h
cursesm.h    expat.h    gdcache.h  gdfontt.h   png.h          ucl
cursesp.h    freetype   gdfontg.h  iconv.h     pngconf.h      zconf.h

/usr/local/cygwin-local/lib:
libcurses.a      libgd.a       libiconv.a        libreadline.a  libz.a
libcurses.dll.a  libgdbm.a     libiconv.la       libtermcap.a
libexpat.a       libgdbm.la    libncurses.dll.a  libttf.a
libexpat.la      libhistory.a  libpng.a          libwrap.a

_ i386-mingw32:

mingw のほうはこんな感じ。
#!/bin/sh
CFLAGS=-Os CC='i686-pc-cygwin-gcc -specs=specs.msvcrt -Zbmingw' \
  ac_cv_func_getpgrp_void=yes \
  ac_cv_func_setpgrp_void=yes \
  ac_cv_c_bigendian=no \
  ../ruby-1.6.2/configure \
  --target=i386-mingw32 \
  --host=i686-pc-cygwin \
  --build=i586-pc-linux-gnu \
  --program-prefix='' \
  --includedir=/usr/local/mingw/include \
  --enable-shared \
  --cache=../config.cache-mingw \
  --enable-tcltk_stubs \
  --with-tcllib=tclstub83 \
  --with-tklib=tkstub83 \
  --with-opt-dir=/usr/local/mingw
/usr/local/mingwも同じような理由。 Tcl/TkはどちらもWin32版をlinkしている。 CygwinについてくるTcl/Tkは8.0なので日本語化パッチをあてないと、 日本人には辛いと思うし。なぜ未だに8.0のままなのか謎だ。
% ls /usr/local/mingw/{include,lib} 
/usr/local/mingw/include:
X11          gd.h       gdfontl.h   ndbm.h     tclDecls.h        zconf.h
dbm.h        gd_io.h    gdfontmb.h  png.h      termcap.h         zlib.h
expat.h      gdbm.h     gdfonts.h   pngconf.h  tk.h
expat.h.bak  gdcache.h  gdfontt.h   readline   tkDecls.h
freetype     gdfontg.h  iconv.h     tcl.h      tkIntXlibDecls.h

/usr/local/mingw/lib:
libexpat.a   libgdbm.la      libiconv.la      libtermcap.a  tclstub83.lib
libexpat.la  libhistory.a    libpng.a         libttf.a      tkstub83.lib
libgd.a      libhistory.old  libreadline.a    libttf.la
libgdbm.a    libiconv.a      libreadline.old  libz.a
Tcl/TkはStubsを使うようにしてるので tclstub83 と tkstub83 だけあればいい。 ldは-lfooでfoo.libもlinkしてくれるようになっている。

_ bmingw:

結局-lbmingwだけ残った形になってる。 C++を考えなきゃこれでいいんだけど…。 あ、RubyWinをmakeするときに困ったことになるかもしれないなあ。 libgcc.a, libstdc++.aをPREFIX/mingw/libに移動したほうがよさそう。

_ Ruby Binaries:

Ruby Binariesはruby-lang.orgに移そうと思ってる。 てゆうか、すでに Ruby Binariesがあるんだけど、手抜きでindex.htmlがない。 で、今度はばらばらにして、更にxdeltaのバイナリ差分も用意しようと思う。 じゃないとアップロードもしんどいんだよう。

2001-01-10 (Wed)

cross-compiling

configureに指定するオプションに--target, --host, --buildがある。 クロスコンパイル時に指定するわけだが、 この三つは一体になにを意味しているのか? targetはまさにターゲットだ。 hostはクロス環境のツール類のために指定する。 buildは実際にコンパイルするホストを意味する。

_ Ruby の configure:

Cygwin の場合には
--target=i386-cygwin \
--host=i686-pc-cygwin \
--build=i586-pc-linux-gnu \
と与えている。 つまりクロスのツール類はi686-pc-cygwin-fooのような名前になっている ことをconfigureに教えているわけだ。 targetとhostだけでもよさそうだけど、 この二つだけだとbuildはhostと同じものになってしまいまずい。 buildを指定する必要がある。

_ ac_cv_foo:

昨日のオプションに
ac_cv_func_getpgrp_void=yes \
ac_cv_func_setpgrp_void=yes \
ac_cv_c_bigendian=no \
という環境変数の設定があった。 これは実行ファイルを作り、 実際にBUILD上で実行した結果から判断するテストで、 クロスの環境では不可能なものである。 これなしで進めると
cannot check getpgrp if cross compiling
のようなメッセージを残してconfigureは異常終了してしまう。 このあたりは実際にやってみて エラーが起きたらconfigureを確認し変数を見つけ出すという作業になる。 Rubyの場合はこの3つを指定すればOK。 実際の値はnativeの環境から得るか自分で調べる。 getpgrp, setpgrpはvoidかどうかとbig endianかどうか。 このくらいなら移植する人には自明なはずだ。

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