CentOS 6での Ruby 1.9.3 rpm 作成方法 (追記あり)

CentOS 6.5(x86_64)で、fedora プロジェクトの srpm から ruby 1.9.3 rpm を作成したので、そのメモ。

個人的に rpm で管理することが多いので、そのメモになります。

fedora プロジェクトの 1.9.3 srpm を入手

fedora 17, 18 で ruby 1.9.3 が採用されているのでその srpm を使用します。(※ fedora 19, 20 では ruby 2.0.0が採用されていますが、こっちではビルドに失敗。)
最新のパッチが適用された rpm は、 updates 配下から入手します。

$ wget http://ftp.iij.ad.jp/pub/linux/fedora/updates/18/SRPMS/ruby-1.9.3.484-32.fc18.src.rpm

なお、fedora 18は、2014年1月14日にサポート期限が切れているので、そのうち mirror ftp サイトから updates ディレクトリが消えます。その場合は、残ってる mirror ftp サイトから入手すればOK。

RPMビルド環境準備

なお、 CentOS6 に Ruby1.9.3 をインストールする手順 - present を参考にRPMビルド環境を整えました。

なお、srpm からのリビルドなので checkinstall は不要。

$ su
# yum -y install gcc
# yum -y install rpm-build
# yum -y install gdbm-devel
# yum -y install libffi-devel
# yum -y install tk-devel

Ruby1.9.3 をインストールする下準備

ruby のビルドは、ビルド環境にある範囲でライブラリなどをビルドするので
パッケージが不足していると、ライブラリが欠けた ruby rpm パッケージが出来てしまうので
あらかじめ以下を全部インストールしておく。

# yum -y install gcc-c++
# yum -y install zlib-devel
# yum -y install httpd-devel
# yum -y install openssl-devel
# yum -y install curl-devel
# yum -y install ncurses-devel
# yum -y install gdbm-devel
# yum -y install readline-devel
# yum -y install sqlite-devel
# yum -y install ImageMagick ImageMagick-devel

libyaml-devel もインストールしないといけないけど、リポジトリにパッケージが無い。
EPEL には存在するので、Yum リポジトリに EPEL を追加する。

# wget http://ftp.iij.ad.jp/pub/linux/fedora/epel/RPM-GPG-KEY-EPEL-6
# rpm --import RPM-GPG-KEY-EPEL-6
# rm -f RPM-GPG-KEY-EPEL-6
# vi /etc/yum.repos.d/epel.repo

epel.repo には次の内容を記述する。

[epel]
name=EPEL RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/$basearch/
gpgcheck=1
enabled=0

あとは libyaml-devel をインストール

# yum --enablerepo=epel install libyaml-devel

なお、ruby-1.9.3.484-32.fc18.src.rpm を使用してビルドすると、下記バグで、2014/1/1 以降、IMAPTest がエラーするので、それ以前の日付に変更にしておく必要があります。

# date -s "Sat Dec 21 00:00:00 JST 2013"

Bug #9341: IMAPTest#test_imaps_with_ca_file test failed after 2014-01-01. - ruby-trunk - Ruby Issue Tracking System

一般ユーザーで rpm をビルド開始

root でビルドするとシステム側をいろいろいじる可能性があるので、一般ユーザー権限に戻って rpm をビルドします。

ここでそのままビルドしようとすると、「インストール済み(ただし未伸張)ファイルが見つかりました」となりビルドに失敗します。

「インストール済み(ただし未伸張)ファイルが見つかりました」の対処 - bokuju とか tabe1hands の日記

事前にチェックファイルの定義を確認します。

$ rpmbuild --showrc | grep __check
-14: __check_files %{_rpmconfigdir}/check-files %{buildroot}

チェックファイルが定義されていたので、マクロを消してビルド実行。
※ ビルドは、 ~rpmbuild 配下で実行されます。

$ rpmbuild --rebuild fedora18/ruby-1.9.3.484-32.fc18.src.rpm --define="__check_files %{nil}"

ビルドが走って最後に下記ファイルが作成されれば成功。

書き込み完了: /home/naitoh/rpmbuild/RPMS/x86_64/ruby-1.9.3.484-32.el6.x86_64.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/x86_64/ruby-devel-1.9.3.484-32.el6.x86_64.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/x86_64/ruby-libs-1.9.3.484-32.el6.x86_64.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/noarch/rubygems-1.8.23-32.el6.noarch.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/noarch/rubygems-devel-1.8.23-32.el6.noarch.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/noarch/rubygem-rake-0.9.2.2-32.el6.noarch.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/noarch/ruby-irb-1.9.3.484-32.el6.noarch.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/noarch/rubygem-rdoc-3.9.5-32.el6.noarch.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/x86_64/ruby-doc-1.9.3.484-32.el6.x86_64.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/x86_64/rubygem-bigdecimal-1.1.0-32.el6.x86_64.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/x86_64/rubygem-io-console-0.3-32.el6.x86_64.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/x86_64/rubygem-json-1.5.5-32.el6.x86_64.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/noarch/rubygem-minitest-2.5.1-32.el6.noarch.rpm
書き込み完了: /home/naitoh/rpmbuild/RPMS/x86_64/ruby-tcltk-1.9.3.484-32.el6.x86_64.rpm

$ cd rpmbuild/RPMS/
$ su

# rpm -ivh x86_64/ruby* noarch/ruby*

準備中... ########################################### [100%]
1:ruby-libs ########################################### [ 14%]
2:rubygem-bigdecimal ########################################### [ 29%]
3:rubygem-io-console ########################################### [ 43%]
4:rubygems ########################################### [ 57%]
5:ruby ########################################### [ 71%]
6:ruby-irb ########################################### [ 86%]
7:rubygem-rdoc ########################################### [100%]

# ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]

無事、 rubyrpm でインストールできました。

※ ビルドが終了したので日付を戻しておいてください。

2014.02.09 追記

この後、Redmine をインストールしようとすると

# rake generate_secret_token
rake aborted!
cannot load such file -- sqlite3/sqlite3_native

と出て動作しない。

# gem env
RubyGems Environment:
- RUBYGEMS VERSION: 1.8.23
- RUBY VERSION: 1.9.3 (2013-11-22 patchlevel 484) [x86_64-linux]
- INSTALLATION DIRECTORY: /usr/local/share/gems
- RUBY EXECUTABLE: /usr/bin/ruby
- EXECUTABLE DIRECTORY: /usr/local/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-linux
- GEM PATHS:
- /usr/local/share/gems
- /root/.gem/ruby/1.9.1
- /usr/share/gems

なので、他の環境の gem のインストールディレクトリ配下を見比べてみて

# cp /usr/local/share/gems/gems/sqlite3-1.3.8/ext/sqlite3/sqlite3_native.so /usr/local/share/gems/gems/sqlite3-1.3.8/lib/sqlite3/

と所定の位置にsqlite3_native.soをコピーすると動作した。

# gem install sqlite3 -V

で調べてみると、下記に作成されていた。

/usr/local/lib64/gems/exts/sqlite3-1.3.8/lib/sqlite3/sqlite3_native.so

どうやら、fedora18ベースでrpmビルドしたのはこんな感じになってた模様。

パス 用途 備考
1 /usr/share/gems/ RPM で入れたgem用
2 /usr/local/share/gems/ gem install(Bundler) で入れたgem用
3 /usr/local/lib64/gems/ext/ native extension でビルドされた *.so ライブラリ ここの位置がダメ

rmagick をインストールすると同様に 3 に RMagick2.so が作成されて同じ現象に。毎回手動コピーはやってられないから、ダメですね。

正直 1 もいらないんだけど、OSパッケージ(RPM)管理のgemとBundler管理の gemとで分ける必要はあるんですよね。
2を3と同じパスにできればいいんだけど、やり方がよくわからないので、fedora18ベースの作成方法は断念。 fedora20ベースになると思われる RHEL7/CentOS7 では問題が起きない事を期待。