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