logo
code:Haemophilus influenzae

ここに書かれていることは無保証です。同じことを行って問題が発生しても、 龍義は責任をとりません。

2003年11月19日

戻る

OpenBSD(386) で w3m のコンパイル

w3m-0.4.2 のコンパイル。

# ./configure
〜snip〜
checking gc.h usability... no
checking gc.h presence... no
checking for gc.h... no
checking GC header location... /usr /usr/local /home/toyota
checking /usr/include... checking gc.h usability... no
checking gc.h presence... no
checking for gc.h... no
checking /usr/include/gc... checking gc.h usability... no
checking gc.h presence... no
checking for gc.h... no
checking /usr/local/include... checking gc.h usability... no
checking gc.h presence... no
checking for gc.h... no
checking /usr/local/include/gc... checking gc.h usability... no
checking gc.h presence... no
checking for gc.h... no
checking /home/toyota/include... checking gc.h usability... no
checking gc.h presence... no
checking for gc.h... no
checking /home/toyota/include/gc... checking gc.h usability... no
checking gc.h presence... no
checking for gc.h... no
configure: error: gc.h not found

ですと。で、 0.4.1 で configure すると、問題ないようなので、
探ってみる。 0.4.1 の中には gc というディレクトリがあって、
この中に gc.h が含まれている。この w3m に含まれている gc とやらの version は

# cat version.h
#define GC_VERSION_MAJOR 6
#define GC_VERSION_MINOR 1
#define GC_ALPHA_VERSION 5
〜snip〜

なので、 6.1.5 のようである。で、 0.4.2 の ChangeLog を見ると

2003-04-08  Fumitoshi UKAI  <ukai@debian.or.jp>

    * [w3m-dev 03856] <gc.h>
    * backend.c entity.c fm.h hash.c indep.c indep.h matrix.c
      textlist.c: s/"gc.h"/<gc.h>/

と、ある。見てみた。
gc いらないだろ、って話のようである。なので、 gc とやらをとってきて、
入れてあげなければならないようである。ちょっと調べてみて、
http://www.hpl.hp.com/personal/Hans_Boehm/gc/
に行く。「A garbage collector for C and C++」らしい。使ったことがないが、
とりあえず、ダウンロードすることにする。ちょと悩んだが、バージョンは 6.2 にした。
http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gc6.2.tar.gz
から。

# tar xvfz gc6.2.tar.gz
# cd gc6.2
# ./configure --help
# ./configure
# make
# su
# make install

とした。
/usr/bin/install -c -m 644 include/gc.h /usr/local/include/gc.h
と、無事にインストールされたようである。これで、 w3m-0.4.2 の configure が
無事に終了。 make すると、

# make
〜snip〜
./mktable 100 functable.tab > functable.c
Memory fault (core dumped)
*** Error code 139

どこまで行っても、終わらないかな。こいつの原因は Str.c の中の
Strnew_charp(char *p) 関数内の

    x = GC_MALLOC(sizeof(struct _Str));

にあるようなのだが、sizeof(struct _Str) については問題ないようなので、
やはり gc が悪いようである。さて、どうしたものか。

試しに GC6.2 で、 make check をしてみる。同じエラーが返る。しょうがないので、
README.QUICK を読む。別なコンパイル方法があるらしい。

Alternative 1 (the old way): type "make test" in this directory.
        Link against gc.a.

とある。やってみる。

# make distclean
# make test
〜snip〜
./setjmp_test
This appears to be a I386 running OPENBSD
Stack appears to grow down, which is the default.
A good guess for STACKBOTTOM on this machine is 0xcfbf4000.
Note that this may vary between machines of ostensibly
the same architecture (e.g. Sun 3/50s and 3/80s).
On many machines the value is not fixed.
A good guess for ALIGNMENT on this machine is 4.
Generic mark_regs code may work
./gctest
*** Signal 11

Stop in /home/toyota/src/gc/gc6.2 (line 588 of Makefile).

ここまで書いて、別ページにすれば良かったと後悔(結局別ページに)。

# vi include/private/gcconfig.h

言われた通りに、 

#define define STACKBOTTOM ((ptr_t)0xcfbf4000)

と追加してみた。もう一度。

# make clean
# make test
〜snip〜
A good guess for STACKBOTTOM on this machine is 0xcfbfb000.
〜snip〜

どないやっちゅ〜ねん。もう一度、実行。

# make clean
# make test
〜snip〜
A good guess for STACKBOTTOM on this machine is 0xcfbf1000.
〜snip〜

しょうがないので、コマンドそのものを実行してみる。

# ./setjmp_test

何度か、やったが、毎回違う。この先はちょっと面倒そうである。
それに、私の知らない世界。見なかったことにして、忘れてしまおう。
いや、いつか思い出すけど。

しかし、 RedHat9 でもインストールしてれば、今頃は寝ていたかも、と
少し思ってしまう、夜中の3時。


by Tatsuyoshi
since 2003