最新のものが最初になるように、順序を改めました (2005-08-24)。
"./configure --disable-threads" でコンパイルできます。 スレッドはまだ動きません(github #276)。
この差分でコンパイルできると思います。 kawさんのものより差分がすごく少なくなったのは、2011/07頃にBoehmGCがOpenBSDでコンパイルできるようになった(らしい)為です。 ところが、OpenBSD5.1->5.2の変更で、pthreadsが入ったりスレッド周りの関数がなくなったりしたので、gcのconfigureで--enable-threads=pthradsを指定すると逆にコンパイルできなくなっています。 なので、GaucheがOpenBSDを正式にサポートするのはまだ先かなと思います。
いつも通りの対応でビルドできました。ご報告まで。
パッチを当てて --enable-threads=pthreads でコンパイルすると signal handling のテストで失敗する件について調べてみました。その結果、いまの OpenBSD における libpthread 実装は、SIGCHLD 用ハンドラーが設定されていない(SIG_DFL)状態で SIGCHLD を受信した場合、その後で SIGCHLD 用ハンドラーを設定するとハンドラーが呼び出されてしまうという挙動を確認しました。misc@ で問い合わせて下記のコメントを貰ったので、PR 6273 を登録してあります。
It's a bug, due to how libpthread uses SIGCHLD to detect when a thread blocked in wait*() should be unblocked. The fix isn't entirely trivial and I'm not going to have a chance to look at it closely for quite a while, so please file a bug with "sendbug" so we don't lose track of this if I forget about it.
thread 有効時にテストが失敗する件については、上記 PR が修正されたら幾らかは改善すると思います。もっとも、次の罠を踏むような気もしますが・・・。
kwj (Dec 11, 2009)
上記の環境でビルドが成功するようにパッチを作成しました。置き場所はこちら。
上記の環境でセルフビルド+テストに成功しました。
arm-openbsdではi386-openbsdと違ってbssセクションとdataセクションの間でセグメンテーションフォルトが起こるので
Boehm-GCに__data_startからアドレス高位方向への走査を追加しました。
このままではrodataセクションがスキャンの対象になりませんが
C言語のプログラムなら問題ないと思います。
それとarm-openbsdではdoubleは32bit単位のリトルエンディアンなのでDOUBLE_ARMENDIANを有効にしないようにしました。
ザウルスにはそもそも浮動小数点演算ユニットは搭載されておらず
カーネルが演算してますのでエンディアンネスはソフト側の問題のようです。
あとpthreadを無効にしている都合上sigwaitが利用できないので
test/system.scmのgauche.sys.sigwaitのcond-expandにelse節を追加しました。
これらとその他諸々を加えたパッチと、ビルドしたOpenBSDパッケージがあるので
どこかいい所があればアップロードしたいと思います。
ツワロイ 2008/01/31 05:53:24 PST
上記の環境で使用できました。
Boehm-GCは、Gaucheに同梱のものを使い、/usr/ports/devel/boehm-gc/patches以下の パッチを適用します。 パッチ適用後、*.rejが幾つか出たので、手修正を行いました。
その後は、通常の手順
./configure --enable-multibyte=euc-jp --with-local=/usr/local && make && make test && make install
にてOKでした。
オリジナルのソースとコンパイルが通るように修正したソースの差分をこちらに置いておきます。
補足: OpenBSDのLiveCDを作成し、公開しています。 Gaucheも上記の方法でインストール・収録されています。
以降は、古い記述;
以下のような感じ。関連 ports のインストールは、お好みで。
cd /usr/ports/devel/gmake && sudo make && sudo make install cd /usr/ports/converters/libiconv && sudo make && sudo make install cd /usr/ports/devel/slib && sudo make && sudo make install cd /usr/ports/devel/boehm-gc && sudo make patch cd /tmp && wget http://keihanna.dl.sourceforge.net/sourceforge/gauche/Gauche-0.8.5.tgz tar xvzf Gauche-0.8.5.tgz && cd Gauche-0.8.5 mv gc gc.gauche.orig cp -pR /usr/ports/devel/boehm-gc/w-boehm-gc-6.2/gc6.2 gc # gc/Makefile の "DEFS = " から始める行の最後に -DDONT_ADD_BYTE_AT_END=1 を追加。 # src/genconfig の 119行目あたりの \"o\" を 'o' に、2行下の \".exe\" を '.exe' に。 ./configure --with-iconv=/usr/local --with-slib=/usr/local/share/slib gmake && gmake test && sudo gmake install
修正点 2点のうち、最初のものは Gauche:FAQ にある GC関係の記述への対応。 あとのものは gmake で
/bin/sh ./genconfig gcc -DHAVE_CONFIG_H -I. -I./../gc/include -g -O2 -fPIC -DPIC -fomit-frame-pointer -c gauche-config.c gauche-config.c: In function `usage': gauche-config.c:51: error: syntax error before "o" gmake[1]: *** [gauche-config.o] Error 1
となるのを防ぐため。
gmake でなくても、make でも良いかもしれない(試してない)。 gmake test は、時間関係以外は全て通る(時間関係は、うるう秒の判定で狂うが、アーキテクチャの問題かローカルでの設定の問題だと思う)。 --enable-threads=pthreads は、
checking build system type... i386-unknown-openbsd3.7 checking host system type... i386-unknown-openbsd3.7 checking target system type... i386-unknown-openbsd3.7 configure: error: pthread is not supported on i386-unknown-openbsd3.7
となってしまい、通らない。
Gauche-0.8.5 は、boehm-gc の 6.4 を使っているが、上記では 6.2 を使っているので、何か不具合があるかもしれない。なお、現在(2005-08-24) での Gauche CVS HEAD(boehm-gc-6.5) でも 同様にインストールできます。
いくつかパッチが必要ですが、 バージョン 0.7.4.2 が i386 上の OpenBSD-current (2004/03/07 頃) で動きました。 リリース版で確認された方がいらっしゃいましたら更新お願いします。
ports の devel/boehm-gc のパッチをそのまま gc 以下にあてます。
以下の修正が必要です。
getservbyname_r() をむりやり no にしている理由は忘れてしまいましたが、 no にしないと make test に失敗します。
--- configure.orig 2004-02-27 13:52:19.000000000 +0900 +++ configure 2004-04-03 11:08:41.000000000 +0900 @@ -7845,6 +7845,13 @@ case $target in SHLIB_MAIN_LDFLAGS="-rdynamic" SHLIB_OK=ok ;; + *openbsd*) + SHLIB_SO_CFLAGS="-fPIC -DPIC" + SHLIB_SO_LDFLAGS="$rpath -shared -o" + SHLIB_SO_SUFFIX="so" + SHLIB_MAIN_LDFLAGS="-rdynamic" + SHLIB_OK=ok + ;; *darwin*) # -no-cpp-precomp is not related to shared library, but needed to # get src/{vm.c,char.c} compiled -skimu @@ -10386,6 +10393,10 @@ ac_cv_func_getservbyname_r=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi + +# XXX: getservbyname_r does not have prototype in <netdb.h>, ignore it... +ac_cv_func_getservbyname_r=no + echo "$as_me:$LINENO: result: $ac_cv_func_getservbyname_r" >&5 echo "${ECHO_T}$ac_cv_func_getservbyname_r" >&6
適宜 \ (バックスラッシュ) を二重にしないと、 正しい uvlib.c が生成されません。
$OpenBSD$ --- ext/uvector/uvlib.stub.sh.orig 2004-01-27 23:25:33.000000000 +0900 +++ ext/uvector/uvlib.stub.sh 2004-04-03 10:55:17.000000000 +0900 @@ -49,7 +49,7 @@ cat << EOF else if (SCM_EQ(clamp, sym_low)) return SCM_UVECTOR_CLAMP_LO; else if (SCM_EQ(clamp, sym_high)) return SCM_UVECTOR_CLAMP_HI; if (!SCM_FALSEP(clamp) && !SCM_UNBOUNDP(clamp)) - Scm_Error(\"clamp argument must be either 'both, 'high, 'low or #f, but got %S\", clamp); + Scm_Error(\\"clamp argument must be either 'both, 'high, 'low or #f, but got %S\\", clamp); return SCM_UVECTOR_CLAMP_NONE; } " @@ -311,16 +311,16 @@ cat <<EOF (end::<fixnum> -1)) "int len = SCM_UVECTOR_SIZE(v), reqalign, srcalign, dstsize; if (!Scm_TypeP(klass, SCM_CLASS_CLASS)) { - Scm_Error(\"class required, but got %S\", klass); + Scm_Error(\\"class required, but got %S\\", klass); } reqalign = Scm_UVectorElementSize(SCM_CLASS(klass)); srcalign = Scm_UVectorElementSize(Scm_ClassOf(SCM_OBJ(v))); SCM_CHECK_START_END(start, end, len); if (reqalign < 0) { - Scm_Error(\"uvector-alias requires uniform vector class, but got %S\", klass); + Scm_Error(\\"uvector-alias requires uniform vector class, but got %S\\", klass); } if ((start*srcalign)%reqalign != 0 || (end*srcalign)%reqalign != 0) { - Scm_Error(\"aliasing %S of range (%d, %d) to %S doesn't satisfy alignemnt requirement.\", Scm_ClassOf(SCM_OBJ(v)), start, end, klass); + Scm_Error(\\"aliasing %S of range (%d, %d) to %S doesn't satisfy alignemnt requirement.\\", Scm_ClassOf(SCM_OBJ(v)), start, end, klass); } if (reqalign >= srcalign) dstsize = (end-start) / (reqalign/srcalign); else dstsize = (end-start) * (srcalign/reqalign);
cc -DHAVE_CONFIG_H -I. -I../../src -I../../gc/include -I/usr/local/include -I/usr/local/include -O2 -pipe -fPIC -DPIC -c uvector.c uvector.c: In function `s32vector_mul': uvector.c:357: Invalid `asm' statement: uvector.c:357: fixed or forbidden register 0 (ax) was spilled for class GENERAL_REGS. uvector.c: In function `u32vector_mul': uvector.c:398: Invalid `asm' statement: uvector.c:398: fixed or forbidden register 0 (ax) was spilled for class GENERAL_REGS. *** Error code 1
Gauche-0.8.3がOpenBSD-current (2005 1/4頃のもの, i386, gcc 3.3.5)で動きました。
そのままではmake中にMemory faultが発生してしまうので、Boehm-GCのソースツリーを portsのパッチ適用後のもので差し替えます。
$ su Password: # cd /usr/ports/devel/boehm-gc # make patch ===> boehm-gc-6.2 depends on: metaauto-0.2 - found ===> boehm-gc-6.2 depends on: autoconf-2.54 - found ===> Checking files for boehm-gc-6.2 `/usr/ports/distfiles/gc6.2.tar.gz' is up to date. >> Checksum OK for gc6.2.tar.gz. (sha1) ===> Extracting for boehm-gc-6.2 ===> Patching for boehm-gc-6.2 Running autoconf-2.54 in /usr/ports/devel/boehm-gc/w-boehm-gc-6.2/gc6.2 Touching ./include/Makefile.am Touching ./doc/Makefile.am Touching ./Makefile.am Touching configure.in Touching acinclude.m4 Touching aclocal.m4 Touching ./include/Makefile.in Touching ./doc/Makefile.in Touching ./Makefile.in Touching configure # exit $ tar xvf Gauche-0.8.3.tgz $ cd Gauche-0.8.3 $ mv gc gc.gauche.orig $ cp -pR /usr/ports/devel/boehm-gc/w-boehm-gc-6.2/gc6.2 gc $ ./configure && make && make test && make install