コンパイルができなくて以前挫折した SQLite。今回も sqlite3-rubyの DBD(database driver)のコンパイルはできなかった。でも sqlite3-rubyには DL(dynamic link?)を使った DBDも用意されてて、これを使うのにコンパイルは必要ない。依然として SQLite自体のコンパイルは必要だが。
以下、メモ。
http://www.sqlite.org/ の downloadから
sqlite-3.2.2.tar.gz (1385618 bytes) A tarball of the complete source tree for SQLite version 3.2.2 including all of the documentation.
と書かれてるものを。どうせなら新しいものをってことでバージョンナンバーが 3で始まる SQLite3をダウンロードする。
予め Linux用にコンパイルされた soファイルもダウンロードできるけど、これを使おうとすると 'libc.so.6' が見つからないとか言われるので横着せずにソースコードをもらってくる。(/usr/lib に libc.so.4はあるんだけど……)
ソースをディレクトリごとサーバーにアップする。READMEに、別にディレクトリを掘ってそこで作業するといいって書いてあるので buildというディレクトリを READMEのあるフォルダに作る。
ライトプランではシェルログインができないので telnetや SSHで
cd build ../configure
というわけにはいかない。困ったので buildフォルダに index.rbを置いて、実行可能にして、中身を下のようにして CGIの要領で実行した。
#!/usr/local/bin/ruby begin cmd = [ 'sh ../configure --enable-utf8', 'make' ]; print "Content-Type: text/plain\n\n"; cmd.each{|c| puts "% #{c}", `#{c}`, $?.inspect, ''; } rescue Exception => e puts e.message; puts e.backtrace.join("\n"); end
何も問題なく大量の *.oファイルと *.loファイルの他に sqlite3(コマンドラインツール)ファイルや .libs/sqlite.so.8などが作られた。.libs/libsqlite3.soという、FFFTPからは矢印付きのフォルダとして表示されるファイルもできてる。シンボリックリンクとかいうものか?
するとインストールが完了するわけだけど、どこにインストールするのかを多分 configureの時に指定しないといけなくて、それをしてないので成功しないかもしれない。そもそもインストールとかしてもいいの?レンタルサーバーに。
必要なファイルは既にできあがってるので結局、make install はせずに、libsqlite.so.8を libsqlite.soに改名して、SQLiteを使う Rubyスクリプトと同じフォルダにコピーして使ってる。
rubyforgeから sqlite3-rubyをダウンロードして展開する。SQLiteと似た感じで
ruby setup.rb config ruby setup.rb setup ruby setup.rb install
とするとコンパイルからインストールまで完了するのだけど、SQLite関連のファイルがインストールされてないので sqlite3.hが存在しないと言われてしまう。それに ruby.hだとか Ruby関連のファイルも必要そうだし、そんなの(/usr/includeとかに)見当たらないし、全部ローカルに用意するのも なんだかなぁ だから諦めた。
lib/ の中の sqlite3.rbと sqlite/* と sqlite/driver/dl/* を、libsqlite3.soと同じように(SQLiteを使うRubyスクリプトから)見えるところに置いておけばなんとかなる。
いや、なんとかならない。
require 'sqlite3' db = SQLite3::Database.new('hoge.db')
とすると libsqlite.soが見つからないといわれる。インストールしてないからだ。だもんで
require 'sqlite3' module ::SQLite3 SQLITE3_LIB_PATH = File::dirname( __FILE__ ) end db = SQLite3::Database.new('hoge.db')
として、カレントディレクトリにある libsqlite3.soを読み込ませてる。