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 だから,かなり古い感じ.このあたり,必ずしも新しいものがいい わけではないことはバザールモデルの世界で要注意なところだろうな .



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:41