【Ruby/SQLite3】Windows64bit環境にSQLite3を使えるようにする

2016年2月25日Ruby

こんにちは、しきゆらです

今回は、Windows64bit環境でSQLite3を使えるように設定していきます

 


 

 

私の環境では、普通にgemをインストールするとこうなりました

gem.cmd install sqlite3
ERROR:  Error installing sqlite3:
        ERROR: Failed to build gem native extension.

mingw64上で行ってもこうなります

 

調べてみると、Devkitをインストールすれば使えるようになる

とのことでしたが、gccがmingw64で使えるのにさらに追加で入れるのは気持ち悪かったので見送りました

 

試しに、gemファイルをローカルに落として展開してみました

wget https://rubygems.org/downloads/sqlite3-1.3.10.gem
# ダウンロード状況などは略

gem.cmd unpack sqlite3-1.3.10.gem

mingw64のTerminalではgemやirbは「.cmd」を付けないと動いてくれません

昔はbatファイルを作ってくれたと思うんですが・・・?

 

これで、gemファイルが展開されました

中に入ってみます

cd sqlite3-1.3.11/ext/sqlite3
ruby extconf.rb
# エラー文
checking for sqlite3.h... no
sqlite3.h is missing. Install SQLite3 from http://www.sqlite.org/ first.
*** extconf.rb failed ***

sqlite3をインストールしなさいと怒られます

 

インストールしたパスを指定してもきちんと読んでくれないので、sqlite3-1.3.11/ext/sqlite3の中にsqlite3のソースをぶち込んでみます

# ここからダウンロード => https://www.sqlite.org/download.html
wget https://www.sqlite.org/2016/sqlite-autoconf-3110000.tar.gz
# ダウンロード状況は略

# ファイルを展開
tar zxvf sqlite-autoconf-3110000.tar.gz

cd sqlite-autoconf-3110000
# 一旦コンパイルする
gcc -shared sqlite3.c -o sqlite3.dll
# 中身を一つ上の階層へ移動させる
mv -i * ../
ls
aclocal.m4    configure.ac  INSTALL       README.txt     sqlite3.rc
backup.c      database.c    install-sh    shell.c        sqlite3_ruby.h
backup.h      database.h    ltmain.sh     sqlite3.1      sqlite3ext.h
compile       depcomp       Makefile.am   sqlite3.c      statement.c
config.guess  exception.c   Makefile.in   sqlite3.dll    statement.h
config.sub    exception.h   Makefile.msc  sqlite3.h      tea
configure     extconf.rb    missing       sqlite3.pc.in

移動させた結果、こんな感じ

(とても・・・汚いです)

ここで注意!

sqlite3.cを上書きしないようにしてください

上書きした場合は、コンパイル時にエラーが出ます

mvコマンドで「-i」を付けると、上書きするかどうか聞かれます、その時にnoとしてください

 

追加で以下のようにすると、makefileが作られます

ruby extconf.rb
checking for sqlite3.h... yes
checking for sqlite3_libversion_number() in -lsqlite3... yes
checking for rb_proc_arity()... yes
checking for rb_integer_pack()... yes
checking for sqlite3_initialize()... yes
checking for sqlite3_backup_init()... yes
checking for sqlite3_column_database_name()... no
checking for sqlite3_enable_load_extension()... yes
checking for sqlite3_load_extension()... yes
checking for sqlite3_open_v2()... yes
checking for sqlite3_prepare_v2()... yes
checking for sqlite3_int64 in sqlite3.h... yes
checking for sqlite3_uint64 in sqlite3.h... yes
creating Makefile

make
# 略
compiling sqlite3.c
compiling statement.c
linking shared-object sqlite3/sqlite3_native.so

 

 

ここまできちんと動いてくれれば、あとは2つ上の階層にある「setup.rb」を使えばおしまいです

ruby setup.rb
# 警告がかなり出るけど無視
mkdir -p C:/Ruby230/lib/ruby/site_ruby/2.3.0/x64-msvcrt/sqlite3
install sqlite3_native.so C:/Ruby230/lib/ruby/site_ruby/2.3.0/x64-msvcrt/sqlite3
---> ext/sqlite3/tea
---> ext/sqlite3/tea/doc
<--- ext/sqlite3/tea/doc
---> ext/sqlite3/tea/generic
<--- ext/sqlite3/tea/generic
---> ext/sqlite3/tea/tclconfig
<--- ext/sqlite3/tea/tclconfig
---> ext/sqlite3/tea/win
<--- ext/sqlite3/tea/win
<--- ext/sqlite3/tea
<--- ext/sqlite3
<--- ext

こんな感じのが出てきたら完了です

irbで確認してみましょう

irb(main):001:0> require 'sqlite3'
=> true
irb(main):002:0>

 

これにて、Windows64bit環境でSQLite3を使えるようになりました

恐らくもっとスマートな方法があると思いますが、現状はこれで動いているので良しとします

 

おわり

Posted by しきゆら