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 を定義しないようにしてみた。 とりあえずうまくいってる。

SEE ALSO

http://www.freelists.org/post/haiku/Perl-XS-problems,2