perl with gcc2.95
FreeBSD 4.11, gcc2.95 というレガシーなマシンで perl5.18 を使ってる。
特に問題なく動いていたけれど、C++なXSモジュールをビルドしようとしたところ、
...i386-freebsd/CORE/perl.h:1703: badly punctuated parameter line in `#define' ...i386-freebsd/CORE/perl.h:1715: badly punctuated parameter line in `#define'
のようなエラーが出た。
1703行目はだいたい以下のようになっている。
#if (略)... defined(HAS_C99_VARIADIC_MACROS) ...(略) # (略) # define my_snprintf(buffer, len, ...) snprintf(buffer, len, __VA_ARGS__) # (略) #endif
調べてみると、gcc2.95 は C のコンパイラとして使ったときは可変個数引数マクロ (variadic macro) をサポートするが、C++コンパイラとして使うと可変個数引数マクロをサポートしないらしい。
よって、
- perl をビルドするとき、gcc は Cコンパイラとして使われ可変長個数引数マクロが使えるため、 HAS_C99_VARIADIC_MACROS が定義される。
- しかし、C++な XSモジュールのビルドのため C++コンパイラとして使おうとすると可変個数引数マクロ が使えないのにもかかわらず HAS_C99_VARIADIC_MACROS が定義されていておかしなことになる。
workarond として config.h を
#ifndef __cplusplus # define HAS_C99_VARIADIC_MACROS #endif
のように書き換え、 __cplusplus が定義されてたら HAS_C99_VARIADIC_MACROS を定義しないようにしてみた。 とりあえずうまくいってる。