Lion の GCC ではまった

OS XSnow Leopard から Lion に移行したところ、WCSLIB の build でこけました。

$ cd wcslib-4.9/
$ ./configure --prefix=/usr/local
$ make -j 4
(略)
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -g -O2 -c wcserr.c
wcserr.c:160: internal compiler error: Segmentation fault: 11
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://developer.apple.com/bugreporter> for instructions.
make[2]: *** [libwcs-4.9.a(wcserr.o)] Error 1
(略)

普通に configure/make の流れで build しようとすると、GCC が segmentation fault を起こして make できません。

Lion + Xcode 4 になってから GCCLLVM のもの (/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2 が実体) になったため、GCC と異なる挙動をする、もしくはまだ bug が潜んでいるということのようです。LLVMGCC については、「Xcode 4 でデフォルトになった LLVM って何?」が簡潔で分かりやすいです。

$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

さて、LLVM ではない「普通の」GCCXcode 3 を入れると /usr/bin/gcc-4.2 として入るようです。こいつを使えば先の WCSLIB の問題は解決するようですが、自分の環境では Xcode 3 を入れていないので、代わりに clang を使います。

$ cd wcslib-4.9/
$ CC=clang ./configure --prefix=/usr/local
$ make -j 4

これで通ります。もちろん、clang も GCC とは異なるので、今回 WCSLIB ではたまたま上手く通っただけかもしれません。

ちなみに、llvm-gcc が seg fault を起こす、WCSLIB の wcserr.c の該当箇所は以下の通りです。これだけ見ただけでは正常な C の code なので、何が原因かはよく分かりません。

static int wcserr_enabled = 0;

int wcserr_enable(int enable)
{
  return wcserr_enabled = (enable ? 1 : 0);
}