[[diary/Kojima]]
・bison and flex
Plamo-4.5 な環境の bison は 2.3a,flex は 2.5.34 というバージョンになっ
ているのだけど,このバージョンだと libIDL-0.8.9(10) が正しくコンパイル
できない模様.
kojima@athlon64[~/libIDL-0.8.9]% make
bison -y -d -v 2>/dev/null ./parser.y
make: *** [stamp-parser] エラー 1
これだけではよく分からないので,/dev/null へのエラーリダイレクトを
やめると,こんな感じのエラーになっている.
kojima@athlon64[~/libIDL-0.8.9]% bison -y -d -v ./parser.y
./parser.y:610.9-10: $$ for the midrule at $6 of `struct_type' has no declared type
./parser.y:606.25-618.1: warning: unused value: $3
./parser.y:627.9-10: $$ for the midrule at $10 of `union_type' has no declared type
./parser.y:621.25-635.1: warning: unused value: $3
./parser.y:716.25-732.1: warning: unused value: $4
./parser.y:780.25-781.68: warning: unused value: $1
./parser.y:811.25-818.1: warning: unused value: $3
./parser.y:926.25-933.1: warning: unused value: $3
bison の文法なんて知らないぞ,,としばらく悩んだのだけど,Plamo-4.22 の
環境なら問題なくビルドできるので,bison を古い 2.0 にしてやると問題なく
通った.
kojima@athlon64[~/libIDL-0.8.9]% bison -y -d -v ./parser.y
conflicts: 23 shift/reduce, 3 reduce/reduce
それで最後まで行けるのかな,と思ったら,今度はリンクの段階で
/bin/sh ./libtool --mode=link gcc -g -O2 -o tstidl tstidl.o libIDL-2.la -lglib-2.0
gcc -g -O2 -o .libs/tstidl tstidl.o ./.libs/libIDL-2.so /usr/lib/libglib-2.0.so
./.libs/libIDL-2.so: undefined reference to `__IDL_cur_token_line'
./.libs/libIDL-2.so: undefined reference to `__IDL_lex_cleanup'
./.libs/libIDL-2.so: undefined reference to `__IDL_prev_token_line'
./.libs/libIDL-2.so: undefined reference to `__IDL_lex'
./.libs/libIDL-2.so: undefined reference to `__IDL_in'
./.libs/libIDL-2.so: undefined reference to `__IDL_lex_init'
collect2: ld returned 1 exit status
make[2]: *** [tstidl] エラー 1
make[2]: ディレクトリ `/home/kojima/libIDL-0.8.9' から出ます
などと言うエラーが発生.これもちゃんと動いている Plamo-4.22 環境と比較
したところ,lexer.c が正しく生成されていないことに気づき,Makefile を調
べたら,lexer.c は flex で lexer.l から生成されているので,どうやら
flex が怪しいことに.
kojima@athlon64[~/libIDL-0.8.9]% make lexer.c
flex -8 -t ./lexer.l | sed -e 's/yy/__IDL_/g' >lexer.c
./lexer.l:116: bad character: %
./lexer.l:116: unknown error processing section 1
./lexer.l:116: unknown error processing section 1
./lexer.l:116: bad character: 5
./lexer.l:116: bad character: 0
./lexer.l:116: bad character: 0
./lexer.l:116: bad character: 0
こちらも Plamo-4.22 の flex-2.5.4 に下げると,正しい lexer.c が生成でき,
リンクの参照も正しく行なわれるようになった.
kojima@athlon64[~/libIDL-0.8.9]% rm lexer.c
kojima@athlon64[~/libIDL-0.8.9]% make lexer.c
flex -8 -t ./lexer.l | sed -e 's/yy/__IDL_/g' >lexer.c
kojima@athlon64[~/libIDL-0.8.9]% make
make all-recursive
make[1]: ディレクトリ `/home/kojima/libIDL-0.8.9' に入ります
...
/bin/sh ./libtool --mode=link gcc -g -O2 -o libIDL-2.la -rpath /usr/local/lib -version-info 0:0:0 -lglib-2.0 -no-undefined parser.lo lexer.lo ns.lo util.lo
rm -fr .libs/libIDL-2.a .libs/libIDL-2.la .libs/libIDL-2.lai .libs/libIDL-2.so .libs/libIDL-2.so.0 .libs/libIDL-2.so.0.0.0
gcc -shared .libs/parser.o .libs/lexer.o .libs/ns.o .libs/util.o /usr/lib/libglib-2.0.so -Wl,-soname -Wl,libIDL-2.so.0 -o .libs/libIDL-2.so.0.0.0
(cd .libs && rm -f libIDL-2.so.0 && ln -s libIDL-2.so.0.0.0 libIDL-2.so.0)
(cd .libs && rm -f libIDL-2.so && ln -s libIDL-2.so.0.0.0 libIDL-2.so)
ar cru .libs/libIDL-2.a parser.o lexer.o ns.o util.o
ranlib .libs/libIDL-2.a
creating libIDL-2.la
(cd .libs && rm -f libIDL-2.la && ln -s ../libIDL-2.la libIDL-2.la)
/bin/sh ./libtool --mode=link gcc -g -O2 -o tstidl tstidl.o libIDL-2.la -lglib-2.0
gcc -g -O2 -o .libs/tstidl tstidl.o ./.libs/libIDL-2.so /usr/lib/libglib-2.0.so
creating tstidl
make[2]: ディレクトリ `/home/kojima/libIDL-0.8.9' から出ます
結論としては,bison,flex の新しいのに libIDL の文法記述が対応していな
い,ということになるのだろうけど,確かに lexer.l とかを見ると最終更新が
2003/05/09 だから,かなり古い感じ.このあたり,必ずしも新しいものがいい
わけではないことはバザールモデルの世界で要注意なところだろうな .
-脊髄反射的にFedoraを見に行ってしまう。現在qvbannerの暴走をなんとかセグメンテーション違反にまでもちこんだところ。 -- [[名倉]] &new{2008-02-18 (月) 14:54:28};
-たしかにlibIDL-0.8.10も同様でしたがなんとなく動きがおかしい感じだったのでちょうど有ったlibIDL-0.6.8をコンパイルしてみたらあっさり通りました。新しいflex,bisonのせいかな? -- [[名倉]] &new{2008-02-18 (月) 13:56:10};
-lfs構築中に同じエラーでハマりましたが、flex 2.5.35にupdateしたらすんなり通りました。 -- &new{2008-04-10 (木) 21:01:08};
#comment