2009-03-19

Cygwin 1.7.0でGCC 4.3.3をビルドするときの注意点

Cygwin 1.7.0-43上でGCC 4.3.3をビルドしたところ、libibertyのコンパイル中にエラーが発生。

../../../gcc-4.3.3/libiberty/strsignal.c:408: error: conflicting types for 'strsignal'
/usr/include/string.h:79: error: previous declaration of 'strsignal' was here

とのこと。どうやら、Cygwinのstring.hと、GCCのlibiberty/strsignal.cとで、strsignalの型に食い違いがあるらしい。

それぞれを比べてみると、

/* string.h */
char  *_EXFUN(strsignal, (int __signo));
...

/* libiberty/strsignal.c */
const char *
strsignal (int signo)
{
  ...

確かに違う。でも、libiberty/strsignal.cのstrsignalの定義は、#ifndef HAVE_STRSIGNALで囲まれている。Cygwinのlibcにstrsignalがあるなら、定義部分はコンパイルされないので、こんなエラーは出ないはず。何故だ。というわけで、色々調べた。

とりあえず宣言と定義の食い違いについて。POSIXに準拠するために、strsignalの戻り値の型をconst char*からchar*に修正する動きがあって、Cygwinのstring.hはリビジョン1.22、GCCのlibiberty/strsignal.cはtrunkのリビジョン136949で修正された。なんだけど、Cygwin 1.7.0-43のstring.hではこの修正がされているのに対して、既に別のブランチになっていたGCC 4.3.3のlibiberty/strsignal.cでは、戻り値の型がconst char*のままなので、食い違いが起きた。

次に本題、HAVE_STRSIGNALマクロについて。結論から。以前はCygwinのライブラリをビルドするのに、libibertyの関数を使っていたので、強制的にconfigureのチェックを外していたらしい。ちくしょー、妙なkluge仕掛けてんじゃねー、とか思わないでもないけど、必要だった時期があったんだろうから仕方がないか。疲れた。

0 件のコメント: