[Anthy-dev 2608] uim-trunkのnoinline

Back to archive index

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*****>



Anthy-dev メーリングリストの案内
Back to archive index