Mac OS X に MySQL/Ruby をインストール + 高速化パッチ
長かった Ruby on Rails 環境構築シリーズもやっと終盤です。
Ruby から MySQL につなぐためのバインディングである MySQL/Ruby をインストールすれば、Ruby on Rails の開発環境構築は一段落。
なお、同様のバインディングである Ruby/MySQL もあり、こちらは Ruby で書かれているためコンパイルが不要。MySQL/Ruby とも、ほぼ互換性がある。ただ、今回はパフォーマンス優先でいきたいと思う。
さて、ダウンロードページから最新版をダウンロード。現時点では mysql-ruby-2.7.3.tar.gz
が最新版のようだ。
% curl --location -O http://tmtm.org/downloads/mysql/ruby/mysql-ruby-2.7.3.tar.gz
% tar xvzf mysql-ruby-2.7.3.tar.gz
% cd mysql-ruby-2.7.3
さきほど「パフォーマンス優先」と書いたけど、RailsExpress.blog の人が MySQL/Ruby を 30% 高速にするパッチを公開している。記事を読んだときから試してみたかったので、これを機会に使ってみよう。
パッチをダウンロードして、MySQL/Ruby の展開先に置いたら、patch
コマンドでパッチを適用する。
% curl -O http://railsexpress.de/downloads/mysql-ruby-2.7-less-string-copies-in-each-hash.diff
% patch < mysql-ruby-2.7-less-string-copies-in-each-hash.diff
patching file mysql.c.in
Hunk #1 succeeded at 1009 (offset -1 lines).
Hunk #2 succeeded at 1027 (offset -1 lines).
Hunk #3 succeeded at 1059 (offset -1 lines).
Hunk #4 succeeded at 1136 (offset -1 lines).
Hunk #5 succeeded at 2079 (offset 3 lines).
無事、パッチを適用できたようなので、そのままインストールに進む。extconf.rb
を実行するときに、--with-mysql-dir
オプションで MySQL のインストール先ディレクトリを指定する必要があった。
% ruby extconf.rb --with-mysql-dir=/usr/local/mysql
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... yes
checking for mysql_ssl_set()... yes
checking for mysql.h... no
checking for mysql/mysql.h... yes
creating Makefile
さて、コンパイル …
% make
...
mysql.c: In function 'Init_mysql':
mysql.c:2018: error: 'ulong' undeclared (first use in this function)
怒られてしまった。ulong
型が定義されていないようだ。
検索してみて、ここに書かれている解決策を採用。ただし unsigned long
ではなく u_long
にしておく。
mysql.c
の最初(16 行目くらい)に
#define ulong u_long
を追加してリトライ。
% make
gcc -I. -I. -I/usr/local/lib/ruby/1.8/i686-darwin8.8.3 -I. -DHAVE_MYSQL_SSL_SET -DHAVE_MYSQL_MYSQL_H -I/usr/local/mysql/include -fno-common -g -O2 -pipe -fno-common -c mysql.c
cc -dynamic -bundle -undefined suppress -flat_namespace -L"/usr/local/mysql/lib" -L"/usr/local/lib" -L"/usr/local/mysql/lib/mysql" -o mysql.bundle mysql.o -lmysqlclient -lz -lm -ldl -lobjc
無事コンパイルできた。 しかし、テストが通らない …
% ruby ./test.rb localhost ishikawa password
...
113 tests, 44 assertions, 3 failures, 177 errors
うーむ。つづきは今度。