KyotoCabinet binding for Ruby にハマる
なんと長年使っているKyotoをFreeBSDにインストールしようとして,ハマった出来事.
エラーはこんな感じ.
compiling kyotocabinet.cc kyotocabinet.cc: In member function 'virtual void db_close(VALUE)::FuncImpl::operate()': kyotocabinet.cc:2184: error: 'class kyotocabinet::PolyDB' has no member named 'ruby_close' kyotocabinet.cc: In function 'VALUE db_close(VALUE)': kyotocabinet.cc:2194: error: 'class kyotocabinet::PolyDB' has no member named 'ruby_close' *** [kyotocabinet.o] Error code 1
???
Linuxやと,yumだろうがソースだろうが何の問題も無く30秒くらいでインストールできたものを...
サボってportsで自動インストールすると,下記のエラーが.
root:/usr/ports/databases/ruby-kyotocabinet # make ===> ruby19-kyotocabinet-1.24_1 is marked as broken: does not compile. *** [all] Error code 1 Stop in /usr/ports/databases/ruby-kyotocabinet.
これはFreeBSDも認識しているらしい.
FreshPorts -- databases/ruby-kyotocabinet
/usr/portsでmakeしても同じようなエラーが出ます.
===> Building for ruby19-kyotocabinet-1.24_1 compiling kyotocabinet.cc kyotocabinet.cc: In member function 'virtual void db_close(VALUE)::FuncImpl::operate()': kyotocabinet.cc:2020: error: 'class kyotocabinet::PolyDB' has no member named 'ruby_close' kyotocabinet.cc: In function 'VALUE db_close(VALUE)': kyotocabinet.cc:2030: error: 'class kyotocabinet::PolyDB' has no member named 'ruby_close' *** [kyotocabinet.o] Error code 1 1 error ===> Compilation failed unexpectedly.
ちょっと追ってみれば分かることで,
emacs extconf.rb
$CFLAGS = "-I. #{kccflags} -Wall #{$CFLAGS} -O2"
↓
$CFLAGS = "-I. #{kccflags} -Wall #{$CFLAGS} -O2 -DRUBY_DONT_SUBST"
余計なことをしないようにすればよろしい.
$ ruby extconf.rb extconf.rb:18: Use RbConfig instead of obsolete and deprecated Config. setting variables ... $CFLAGS = -I. -I/usr/local/include -Wall -I/usr/local/include -O2 -pipe -fno-strict-aliasing -fPIC -O2 -DRUBY_DONT_SUBST $LDFLAGS = -L. -Wl,-rpath=/usr/lib:/usr/local/lib -pthread -L/usr/local/lib -rdynamic -L. -L/usr/local/lib $libs = -lkyotocabinet -llzma -llzo2 -lz -lstdc++ -lrt -lpthread -lm -lc checking for kccommon.h... yes creating Makefile $ make compiling kyotocabinet.cc linking shared-object kyotocabinet.so