ウォンツテック

そでやまのーと

Ruby開発者の松本さんが作ったメーラーmorqをインストールしようとしてたら全然関係の無いところではまった。。
morqはapacheプロジェクトが開発したAPRを使ってるんだけど、Rast(morqを含んでいる全文検索アプリ)のmake中に以下のようなAPRがらみのエラーが出力された。

/usr/local/apr/include/apr-1/apr.h:270: error: expected ‘=’, ‘,’, ‘;’, ‘asm’
 or ‘__attribute__’ before ‘apr_off_t’
...

初めはよくあるライブラリパスの通し忘れかと思ったけどapr.h自体は上記のように見に行ってるし問題無さそう。そこでapr.hを実際見に行くと以下のように定義されている

typedef  off64_t           apr_off_t;

どうやらこの行が怪しそうなのでgoogleで調べてみると、やはり同じような所で悩んでる人がたくさんいた。APRのバグかな?とも思ったけど2004年あたりのログも存在したのでそんな古いバグを修正していないはずが無いって事でバグの線は無さそう。そこでoff64_tをさらに追っていくとに定義されていた。

#ifndef __off_t_defined
# ifndef __USE_FILE_OFFSET64
typedef __off_t off_t;
# else
typedef __off64_t off_t;
# endif
# define __off_t_defined
#endif
#if defined __USE_LARGEFILE64 && !defined __off64_t_defined
typedef __off64_t off64_t;
# define __off64_t_defined
#endif

これを見るとoff64_tは最終的にoff_tとなっている。でもそのoff_tの定義箇所が見付からない。たぶんこれは別の箇所で定義されている。
ここで試しにoff64_t、__off64_t、off_tをそれぞれ使った(sys/types.hをincludeして)コードを書いてみるとoff64_tの場合だけエラーになる。おそらく「#if defined __USE_LARGEFILE64 && !defined __off64_t_defined」の条件に一致していないからだと思われる。
この結果から先ほどのapr.hを以下のように編集した所コンパイルが通った

typedef  __off64_t           apr_off_t;

ライブラリを書き換えるのはどう考えても禁じ手のような気がするのですっきりしない。。
APRの開発環境ではoff64_t(64bit環境)の定義はどこかのheaderファイルで定義されていることが前提なのだろうか?。。