Konosuke Watanabe
sasug****@gmail*****
2005年 11月 6日 (日) 05:51:44 JST
こんにちは,渡辺です. 最近のuim-trunk(r1983,r2010)を自分の環境 (Linux/kernel-2.6.12.3/gcc-3.3.6)でビルドしてみたところ, xim/main.cpp をコンパイルする所で以下のエラーが出て失敗して しまいました. In file included from ../uim/uim-compat-scm.h:57, from main.cpp:59: ../uim/uim-scm.h:152: error: 文法エラー before `)' token どうも,UIM_SCM_NOINLINE が書かれてる部分で,プリプロセッサ を通した段階で本来この部分が __attribute__((noinline)) に置き換わって欲しいところが __attribute__(()) に置き換わってしまい,これがg++で文法エラーを起こしているよ うです. 何でnoinlineが消えちゃうのかを見てみたところ,xim/main.cppで, uim/uim-scm.hより前にincludeされている /usr/include/signal.h の先で取り込まれる /usr/include/linux/compiler.h の内部で, #ifndef noinline #define noinline #endif と定義されているのが直接的な原因みたいです. 調べてみたら,GNU Emacsでも同じような問題があったようで, #define NO_INLINE __attribute__((noinline)) の後に #ifdef noinline #undef noinline #endif とやることで問題を回避してました. http://lists.gnu.org/archive/html/emacs-pretest-bug/2005-05/msg00097.html 上記をuim/uim-scm.hに書き足したらビルドが通るようになりました. なお,SuSE 9.3等のディストリビューションでは,cmpiler.h内部 のnoinlineのdefine部分が __KERNEL__ がdefineされている場合に のみ有効になるようになっているため,この問題が出ないっぽいで す. 既知の問題でしたらすいません. --- Konosuke WATANABE <sasug****@gmail*****>