Gauche:NetBSD

Gauche:NetBSD

特定条件下でmake checkでthreadのテストに失敗する(0.8.9_pre1)

(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ともに問題ない。なんでやねん。

(2006/03/03 18:37:26 PST) NetBSD pthread対応(gc6.7版)

3/3付けでリリースされたBoehm-gcの6.7で、拙作のNetBSD pthread対応パッチがマージされました。他にも、Intel版Mac OS X用のパッチなどもマージされていて、けっこう嬉しいリリースになっています。

Gauche CVS HEADに含まれるgcを6.7に上げつつgc以外の部分をNetBSD pthreadに対応させるパッチを作りました。問題がないようなら、gc6.7に上げるタイミングでマージしていただけると嬉しいです。

(2005/09/05 21:22:23 PDT) NetBSD pthread対応

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()されてしまうからです。


skimu のお勧めインストール手順 

 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 に いる機械では必要ありません。

NetBSD について

  1. LD_LIBRARY_PATH と /etc/ld.so.conf
  2. リンク時に-rpathで埋め込まれたパス
  3. /usr/lib
    この順序で参照される。 このため、-rpath で指定されたものと別のライブラリを参照してしまう場合がありうる。 ちなみにFreeBSD や Solaris でも同じように動作するらしいです。

NetBSD 各プラットフォームでの動作確認

主に i386 以外の NetBSD での動作報告です. このような書き方で良いのかはわからないのですが(^^;), 問題があれば適宜修正等していきたいと思います.ytaki


NetBSD2.0以降でGauche-0.8.5をpthread対応でコンパイルする方法

この情報は近い将来不要になるはずです。

背景

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 のインストール

gauche-gl のインストールには LD_LIBRARY_PATH の設定と若干の Makefile の変更が必要になる。あくまで pkgsrc から GL/GLUT なんかがインストール されていればだけど。(Gauche-gl-0.3.1 時点)

  1. setenv LD_LIBRARY_PATH /usr/local/lib:/usr/pkg/lib:/usr/X11R6/lib:/usr/lib
  2. ./configure
  3. cd src
  4. vi Makefile
  5. cd ..
  6. make
  7. make check
  8. make install

なお、2005/08時点NetBSDはpthread対応Gaucheに含まれるBoehm-GCのNetBSD対応部分の pthread非対応への対応は、上にある、 NetBSD2.0以降でgaucheをpthread対応でコンパイルする方法 によりGaucheにmake時にpthreadをリンクすることで回避できます。


NetBSDにおけるGauche-0.8.5でのpthread問題に関する記録


Gauche-gtk のインストール

gauche-gtk のインストールも gauche-gl と同じでいける。(Gauche-gtk-0.4.1時点)

  1. setenv LD_LIBRARY_PATH /usr/local/lib:/usr/pkg/lib:/usr/X11R6/lib:/usr/lib
  2. ./configure
  3. make
  4. make check
  5. make install

make できないのよ事例

こちらでも 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


Last modified : 2012/02/23 03:15:08 UTC