び(2007/01/13 15:30:00 PST): Parallels Desktop 上でnetbsd-4枝先端(NetBSD-4.0_BETA2/i386)という環境下、ext/threadsでgmake(GNU make)を使ってgmake checkすると
% gmake -s check Testing threads ... failed. discrepancies found. Errors are: test thread-join!: expects 1346269 => got #<error "couldn't start a new thread: #<thread 7 new 0x8264a80>"> test uncaught-exception: expects #t => got #<error "couldn't start a new thread: #<thread #f new 0x818b540>"> test uncaught-exception: expects #t => got #<error "couldn't start a new thread: #<thread #f new 0x818b380>"> test uncaught-exception: expects #t => got #<error "couldn't start a new thread: #<thread #f new 0x818b1c0>"> test lock and unlock - blocking (simple spin-lock): expects ((put a) (get a) (put b) (get b) (put c) (get c)) => got #<error "couldn't start a new thread: #<thread producer new 0x818b000>"> test condition-variable-signal!: expects ((put a) (get a) (put b) (get b) (put c) (get c)) => got #<error "couldn't start a new thread: #<thread producer new 0x820be00>"> test write to file, buffered: expects #t => got #<error "couldn't start a new thread: #<thread #f new 0x820bc40>"> test write to file, line-buffered: expects #t => got #<error "couldn't start a new thread: #<thread #f new 0x82ece00>"> test write to string: expects #t => got #<error "couldn't start a new thread: #<thread #f new 0x82ec000>"> test check if port is unlocked on error: expects "aaaaaAAAAAAbbbbbbbb" => got #<error "couldn't start a new thread: #<thread th1 new 0x84301c0>"> test check if port is unlocked on error: expects "aaaaaAAAAAAbbbbbbbb" => got #<error "couldn't start a new thread: #<thread th1 new 0x818b540>"> test check if port is unlocked on error (use file): expects "aaaaaAAAAAAbbbbbbbb" => got #<error "couldn't start a new thread: #<thread th1 new 0x818b1c0>"> test check if port is unlocked on error (use file): expects "aaaaaAAAAAAbbbbbbbb" => got #<error "couldn't start a new thread: #<thread th1 new 0x82ece00>"> test check locality of parameters: expects (3 4 5) => got #<error "couldn't start a new thread: #<thread #f new 0x82eca80>">
ところが、BSD標準のmake(BSD make)だと問題は起きない。
% make -s check Testing threads ... passed.
なお、netbsd-3枝先端(NetBSD-3.1_STABLE/i386)では、gmake、makeともに問題ない。なんでやねん。
3/3付けでリリースされたBoehm-gcの6.7で、拙作のNetBSD pthread対応パッチがマージされました。他にも、Intel版Mac OS X用のパッチなどもマージされていて、けっこう嬉しいリリースになっています。
Gauche CVS HEADに含まれるgcを6.7に上げつつgc以外の部分をNetBSD pthreadに対応させるパッチを作りました。問題がないようなら、gc6.7に上げるタイミングでマージしていただけると嬉しいです。
NetBSD-2.0以降サポートされたpthreadに、GaucheのCVS HEADを対応させてみました(パッチ)。 試したのはNetBSD-3.0BETA/2.0.2のみですし、make checkが通ったというだけなので、ご注意ください。
Boehm-gcをNetBSDのpthread対応するに当たっては、とりあえずpthreadの枠組みの中で行いました。たぶん、Scheduler Activationやその上に実装されたLWPを活用した方が効率的かつ安全だとは思うのですが、それは追って挑戦してみます。
genstubに手を加えた理由は、現状だとext/net/netlib.stubから生成されるnetlib.cのScm_Init_netlib()において、Scm_InitBuiltinGeneric()より先にScm_InitBuiltinMethod()が呼ばれてしまい、その結果ScmGenericのlockをSCM_INTERNAL_MUTEX_INIT()する前にSCM_INTERNAL_MUTEX_LOCK()/SCM_INTERNAL_MUTEX_UNLOCK()されてしまうからです。
LD_LIBRARY_PATH=/usr/lib:/usr/pkg/lib:/usr/local/lib export LD_LIBRARY_PATH ./configure --with-local=/usr/pkg --with-rpath=/usr/lib:/usr/pkg/lib:/usr/local/lib --with-iconv=/usr/pkg unset LD_LIBRARY_PATH make make test make install
LD_LIBRARY_PATH を設定しているのは ext/charconv でのコンパイラコマンドライン のチェック時にgccのつくるプログラムが libiconv を見つけられずに失敗してしまうのを 一時的に LD_LIBRARY_PATH を設定することにより回避するためです。本来は configure が 適切な -rpath を指定するべき。 --with-local を指定しているのは私の NetBSD box では gdbm が /usr/pkg にいるためです。 gdbm が /usr/local に いる機械では必要ありません。
主に i386 以外の NetBSD での動作報告です. このような書き方で良いのかはわからないのですが(^^;), 問題があれば適宜修正等していきたいと思います.ytaki
この情報は近い将来不要になるはずです。
2005/08現在、Gauche-0.8.5についているBoehm-GCのバージョンはNetBSDに対しては pthreads対応していません。 一方NetBSD自体にはpthreadsが対応しており、pkgsrc以下のさまざまなプログラムや ライブラリも可能なものはpthreads対応でコンパイルされています。 (もちろんGauche自身はpthread対応しておりLinuxなどでは動作している) この状況でGauche-glなどを使いたい場合にはGaucheでpthreadライブラリをリンクする 必要があります。
--- Makefile.org 2005-08-05 16:44:23.000000000 +0900 +++ Makefile 2005-08-09 14:08:39.000000000 +0900 @@ -40,7 +40,7 @@ DESTDIR = CC = gcc AR = ar -LIBS = -lcrypt -lutil -lm +LIBS = -lcrypt -lutil -lm -pthread -lpthread CFLAGS = -g -O2 -fPIC -DPIC CPPFLAGS = -I/usr/pkg/include LDFLAGS = -L/usr/pkg/lib
./configure後のmake前にsrc/MakefileのLIBSに上記の変更を追加してください。 あとはそのままmake; make check; make installへ。
gauche-gl のインストールには LD_LIBRARY_PATH の設定と若干の Makefile の変更が必要になる。あくまで pkgsrc から GL/GLUT なんかがインストール されていればだけど。(Gauche-gl-0.3.1 時点)
CFLAGSに -I/usr/pkg/include を追加 LIBS の -lGLU等の前に -L/usr/pkg/lib を追加
なお、2005/08時点NetBSDはpthread対応Gaucheに含まれるBoehm-GCのNetBSD対応部分の pthread非対応への対応は、上にある、 NetBSD2.0以降でgaucheをpthread対応でコンパイルする方法 によりGaucheにmake時にpthreadをリンクすることで回避できます。
configure: error: pthread is not supported on i386-unknown-netbsdelf2.0.2ってなりますねぇ。cut-sea:2005/08/07 22:23:11 PDT
gauche-gtk のインストールも gauche-gl と同じでいける。(Gauche-gtk-0.4.1時点)
こちらでも gdbm は /usr/pkg 以下にあるようなのですが、なぜか捜し出せない?
cut-sea@jini> uname -a NetBSD jini 1.6 NetBSD 1.6 (JINI) #0: Fri Nov 8 20:44:24 JST 2002 root@jini:/usr/src/sys/arch/i386/compile/JINI i386 cut-sea@jini> locate gdbm |grep -v pkgsrc : : /usr/pkg/include/gdbm.h /usr/pkg/info/gdbm.info /usr/pkg/lib/elk/runtime/scm/gdbmtest.scm /usr/pkg/lib/libgdbm.a /usr/pkg/lib/libgdbm.la /usr/pkg/lib/libgdbm.so /usr/pkg/lib/libgdbm.so.2 /usr/pkg/lib/libgdbm.so.2.0 : :
ところが今のところ
cut-sea@jini> gauche-config --reconfigure ./configure '--with-slib=/usr/local/lib' '--with-local=/usr/local' '--enable-ipv6'
でしかコンパイル確認できておらず、これまではこれで遊んでいて特に困らなかった。
apache を pkgsrc からインストールして、 簡単な gauche の cgi スクリプトが動作するのを確認できたので、 最近 WiLiKi を使いたいなと思ってインストールしてみた。 ところが web ブラウザからアクセスしてみるとエラーがでるではないか。 httpd/error_log を確認すると
*** ERROR: cannot find file "dbm/gdbm.scm" in *load-path* ("/usr/local/share/gauche/site/lib" "/usr/local/share/gauche/0.7.1/lib") Stack Trace: _______________________________________ 0 (initialize obj initargs) At line 59 of "/usr/local/share/gauche/0.7.1/lib/gauche/object.scm" 1 (make <wiliki> :db-path "/home/cut-sea/data/wikidata.dbm" :top-pag ... At line 50 of "/usr/pkg/libexec/cgi-bin/wiliki.cgi" [Sat Sep 13 21:38:43 2003] [error] [client 127.0.0.1] Premature end of script headers: /usr/pkg/libexec/cgi-bin/wiliki.cgi
となっていて、はじめて gdbm が使えないことに気付いた。 gdbm.scm が lib にインストールされてないんだけど、 要は make する際に見つけられてない。(のか?) とくに --with-local=/usr/local としてたところを --with-local=/usr/pkg としただけでも configure にて下のようなエラーが出る。 そもそも私のマシンでは基本的にソフトのインストールは pkgsrc を使用していて、 自力でインストールしているソフトなんか皆無なのだ。 (scm と slib だけ最新のが欲しかったのでインストールした) なぜライブラリなどが豊富なはずの /usr/pkg を指定して失敗するのか(とほほ)。
./configure 時にかなり多くの
config.status: creating doc/Makefile sed: sed: 46: ./confstat08263a/subs-1.sed: 3: ./confstat08263a/subs-2.sed: unescaped newline inside substitute patterninvalid command code - config.status: creating ext/Makefile sed: 46: ./confstat08263a/subs-1.sed: sed: unescaped newline inside substitute pattern3: ./confstat08263a/subs-2.sed: invalid command code - config.status: creating ext/Makefile.ext sed: sed: 46: ./confstat08263a/subs-1.sed: 3: ./confstat08263a/subs-2.sed: unescaped newline inside substitute patterninvalid command code - : : :
なんてエラーっぽいのがでるのも顕著。 そうなると make しても
cut-sea@jini> make make: no target to make. make: stopped in /home/cut-sea/devel/Gauche-0.7.1
って感じで make できない。 今のところ --with-local=/usr/local 以外を指定すると状況は同じだ。。。cut-sea:2003/09/13 07:31:40 PDT
私の 1.6.1 では問題なくコンパイルとおります。 一度 config.cache などを消して, やり直してみてはいかがでしょう。だだし、今日(9/13/03)の CVS 版 Gauche では dbm.scm が 無いと言って make test が通りません。skimu