Solaris10でvarnishをmake
Solaris10でvarnishをmakeすると、こんなエラー。varnish-2.1.3,gcc3.4.3という環境。
$ ./configure $ /usr/local/bin/make (中略) /bin/bash ../../libtool --tag=CC --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I../.. -I../../include -g -O2 -MT vcc_parse.lo -MD -MP -MF .deps/vcc_parse.Tpo -c -o vcc_parse.lo vcc_parse.c libtool: compile: gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I../.. -I../../include -g -O2 -MT vcc_parse.lo -MD -MP -MF .deps/vcc_parse.Tpo -c vcc_parse.c -fPIC -DPIC -o .libs/vcc_parse.o vcc_parse.c: In function `vcc_DoubleVal': vcc_parse.c:158: error: incompatible types in return make: *** [vcc_parse.lo] Error 1 $
エラー該当部分のソースはこんな感じ。
double vcc_DoubleVal(struct tokenlist *tl) { double d = 0.0, e = 0.1; const char *p; Expect(tl, CNUM); if (tl->err) return (NAN); for (p = tl->t->b; p < tl->t->e; p++) { d *= 10; d += *p - '0'; } (後略)
return(NAN)のところでエラーがでています。このNAN、コンパイラをプリプロセッサモードで展開したところ、
"__builtin_nan"となっていました。NANというマクロは /usr/include/iso/math_c99.hで定義されています。
#define NAN __builtin_nan
__builtin_nanはgccの組み込み関数なので、上記のreturn(NAN)だと関数へのポインタを返すという意味になってしまいます。それでコンパイルエラーがでていたんでしょう。
ではLinux機でNANというマクロはどう展開されるかを調査。こんなソースを書いて、プリプロセッサで展開。
$ cat c.c #include<stdio.h> #include<math.h> NAN; $ gcc -E c.c (中略) (__builtin_nanf (""));
ということで、ちゃんと関数を読んだ結果ってマクロになっています。
故に、vcc_parse.cの158行目は以下のように改修。
return (__builtin_nanf(""));
っと、リンクで__builtin_nanfがないよっていわれました。。うーん。
もうちょっと調べます。