Gauche 0.9.2をコンパイルエラーの解決方法

ふとGaucheのサイトに行ったら数日前に新バージョンが出ていたのに気づいたので早速コンパイルしたらエラー。
解決したのでメモ。

$ ./configure --prefix=$HOME/opt/gauche0.9.2
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking slib... not found, using fallback /usr/local/slib
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for gcc option to accept ISO C99... -std=gnu99
checking for gcc -std=gnu99 option to accept ISO Standard C... (cached) -std=gnu99
checking for an ANSI C-conforming const... yes
checking whether make sets $(MAKE)... yes
checking for a BSD-compatible install... /usr/bin/install -c
checking for ar... ar
〜省略〜
checking for unistd.h... yes
checking for stdlib.h... (cached) yes
checking for unistd.h... (cached) yes
checking for sys/param.h... yes
checking for getpagesize... yes
checking for working mmap... yes
checking for ANSI C header files... (cached) yes
checking Determining PIC compiler flag... -fPIC
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating src/atomic_ops/Makefile
config.status: creating src/atomic_ops/sysdeps/Makefile
config.status: creating doc/Makefile
config.status: creating tests/Makefile
config.status: creating src/config.h
config.status: src/config.h is unchanged
config.status: executing depfiles commands
config.status: executing default commands

This Gauche has been configured with the following parameters:
           version: 0.9.2
         multibyte: utf8
              slib: /usr/local/slib
            thread: pthreads
  optional modules:  zlib
$ echo $?
0
$ make
for d in gc src lib ext doc; do (cd $d; make all); done
make[1]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/gc' に入ります
make[2]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/gc' に入ります
make[2]: `all-am' に対して行うべき事はありません.
make[2]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/gc' から出ます
make[1]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/gc' から出ます
make[1]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/src' に入ります
/bin/bash ./genconfig
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c box.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c core.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c vm.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c compaux.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c macro.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c code.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c error.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c class.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c prof.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c collection.c
〜省略〜
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c keyword.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c gloc.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c compare.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c regexp.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c signal.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c parameter.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c module.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c proc.c
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I./../gc/include   -g -O2 -fPIC -fomit-frame-pointer  -c number.c
number.c: Assembler messages:
number.c:1817: Error: bad register name `%rax'
number.c:1817: Error: suffix or operands invalid for `imul'
number.c:1817: Error: bad register name `%rax'
number.c:1817: Error: bad register name `%rdx'
make[1]: *** [number.o] エラー 1
make[1]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/src' から出ます
make[1]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/lib' に入ります
make[1]: `all' に対して行うべき事はありません.
make[1]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/lib' から出ます
make[1]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/ext' に入ります
〜省略〜
/bin/bash: ../../src/gosh: そのようなファイルやディレクトリはありません
make[2]: *** [parser--peg.c] エラー 127
make[2]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/ext/peg' から出ます
make[2]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/ext/windows' に入ります
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I../../src -I../../gc/include    -g -O2 -fPIC  -fomit-frame-pointer  -c init.c
../../src/gosh -ftest genstub windows.stub
/bin/bash: ../../src/gosh: そのようなファイルやディレクトリはありません
make[2]: *** [windows.c] エラー 127
make[2]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/ext/windows' から出ます
make[1]: *** [all] エラー 2
make[1]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/ext' から出ます
make[1]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/doc' に入ります
../src/gosh -q -I../src -I../lib -lgauche-init ./extract -en -o gauche-refe.texi gauche-ref.texi
make[1]: ../src/gosh: コマンドが見つかりませんでした
make[1]: *** [gauche-refe.texi] エラー 127
make[1]: ディレクトリ `/home/longicorn/install/Gauche-0.9.2/doc' から出ます
make: *** [all] エラー 2
$ echo $?
2


さて、実際のエラーはここです。

number.c: Assembler messages:
number.c:1817: Error: bad register name `%rax'
number.c:1817: Error: suffix or operands invalid for `imul'
number.c:1817: Error: bad register name `%rax'
number.c:1817: Error: bad register name `%rdx'


アセンブラ??? インラインアセンブラでエラーだと。しかもレジスタが無いとの事。
いくら何でもそんなバカな。


ということでgrepすると

$ grep -lr rax .
./config.sub
./gc/configure
./gc/configure.ac
./gc/darwin_stop_world.c
./gc/doc/README.changes
./gc/include/private/gcconfig.h
./gc/libatomic_ops/config.sub
./gc/libatomic_ops/src/atomic_ops/sysdeps/gcc/cris.h
./gc/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86_64.h
./gc/libatomic_ops-1.2/config.sub
./gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc/cris.h
./gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/msftc/x86_64.h
./src/gauche/arith_x86_64.h

./src/gauche/arith_x86_64.hが怪しい。


大体自分の環境はCPUこそ64bitだけどOSはまだ32bit。32bitでも困らないしね。
gcc -vを見れば分かる。

$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.4.5 (Debian 4.4.5-8)


ということは、configureが怪しい。出力を見てみると、x86_64!!!

$ ./configure --prefix=$HOME/opt/gauche0.9.2
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
〜省略〜


ならば話は簡単。

$ make clean
$ ./configure --prefix=$HOME/opt/gauche0.9.2 --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu


としてから、普通にmakeすれば終了っと。

$ make && make check && make install