CentOS 5系用にRuby1.8.7のRPMを作ってインストールしたい場合

CentOS 5系(RedHat Enterprise Linux 5系)でサポートされているRubyのバージョンは1.8.5系。

前エントリ「CentOS 5系でPHP5.3系やMySQL5.1系を使いたい場合」の流れで、Rubyもバージョン1.8系の最新版である1.8.7に、RPM(yum)を利用してバージョンアップすることにしました。(1.8.5は枯れていて、サポートしていないアプリもあったり、なので。)

とは言っても、やっぱり前エントリ同様、ソースからコンパイルして・・・よりは、rpm(yum)でのパッケージ管理をしておきたいところ。が、Ruby1.8.7系のメンテナンスをしているRPM(yum)リポジトリが見つからなかったので、自前でrpmを作ることに。以下手順を残しておきます。

前提

今回、私が作った環境は以下。でも、CentOSやRedHatであれば、特にバージョンを問わず以降のやり方で動くと思います。

# cat /etc/redhat-release
CentOS release 5.5 (Final)
# ruby -v
ruby 1.8.5 (2006-08-25) [i386-linux]

specファイルを作る

まず、RPMを作るためには、ソースコードと関連パッケージとの依存関係を記したspecファイルが必要です。
ということで、その雛形となるべくFedoraのrpmリポジトリから、src.rpmファイルを取得します。

# wget http://download.fedora.redhat.com/pub/fedora/linux/development/13/source/SRPMS/ruby-1.8.6.399-1.fc13.src.rpm


次にダウンロードしたファイルを以下の感じで展開します。
尚、展開後は、"/usr/src/redhat/"以下に配置されます。

# rpm -i --nomd5 ruby-1.8.6.399-1.fc13.src.rpm

次に、お目当てのspecファイル(/usr/src/redhat/SPECS/ruby.spec)を以下のように編集します。
diff(差分)を貼り付けておきますが、簡単に説明すると以下のような感じです。
(※ 2010/06/11時点でのRuby1.8系の最新版は、1.8.7-p249です。)

  • 「%define rubyver」を1.8.7に変更
  • 「%define _patchlevel」を249に変更
  • 「Patch(数字):」の行を全て削除
  • 「%patch(数字) -p1」の行を全て削除


diff(差分)は以下。

# diff -u /usr/src/redhat/SPECS/ruby.spec.orig /usr/src/redhat/SPECS/ruby.spec
--- /usr/src/redhat/SPECS/ruby.spec.orig        2010-06-08 01:22:47.000000000 -0400
+++ /usr/src/redhat/SPECS/ruby.spec     2010-06-08 01:33:53.000000000 -0400
@@ -1,6 +1,6 @@
 %define        rubyxver        1.8
-%define        rubyver         1.8.6
-%define _patchlevel    399
+%define        rubyver         1.8.7
+%define _patchlevel    249
 %define dotpatchlevel  %{?_patchlevel:.%{_patchlevel}}
 %define patchlevel     %{?_patchlevel:-p%{_patchlevel}}
 %define        arcver          %{rubyver}%{?patchlevel}
@@ -40,27 +40,7 @@
 Source4:       irb.1
 Source10:      ruby-mode-init.el

-Patch1:                ruby-deadcode.patch
-Patch20:       ruby-1.8.6-p383-rubyprefix.patch
-Patch21:       ruby-deprecated-sitelib-search-path.patch
-Patch22:       ruby-deprecated-search-path.patch
-Patch23:       ruby-multilib.patch
 # Needed in 1.8.6-p287, no longer needed in 1.8.6-p368?
-#Patch25:      ruby-1.8.6.111-gcc43.patch
-Patch26:        ruby-1.8.6-rexml-CVE-2008-3790.patch
-Patch27:        ruby-1.8.6-p287-CVE-2008-5189.patch
-Patch28:        ruby-1.8.6-p287-remove-ssl-rand-range.patch
-Patch29:       ruby-always-use-i386.patch
-Patch30:       ruby-openssl-1.0.patch
-Patch31:       ruby-1.8.6-p369-ri-gem_multipath.patch
-# Patch32 from ruby_1_8 branch
-Patch32:       ruby-1.8head-irb-save-history.patch
-Patch33:       ruby-1.8.6-p383-mkmf-use-shared.patch
-# Testing
-# Patch34 disabled for now
-Patch34:       ruby-1.8.6-simplify-openssl-digest.patch
-# bz 580993
-Patch35:       ruby_1_8_7-gc-open4_096segv.patch

 Summary:       An interpreter of object-oriented scripting language
 Group:         Development/Languages
@@ -186,25 +166,8 @@
 tar fxz %{SOURCE1}
 popd
 pushd %{name}-%{arcver}
-%patch1 -p1
-%patch20 -p1
-%patch21 -p1
 %ifarch ppc64 s390x sparc64 x86_64
-%patch22 -p1
-%patch23 -p1
 %endif
-#%patch25 -p1
-#%patch26 -p1
-%patch27 -p0
-%patch28 -p1
-%patch29 -p1
-%patch30 -p2
-%patch31 -p1
-%patch32 -p0
-%patch33 -p1
-# Once kill patch34 due to build failure on actionpack
-#%%patch34 -p1
-%patch35 -p1
 popd

 %build

Rubyのソースコードをゲットする

次に、"/usr/src/redhat/SOURCES"以下に、Rubyの最新版をダウンロードして配置します。

# cd /usr/src/redhat/SOURCES
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p249.tar.bz2

RubyのRPMを作る(ビルドする)

RPMを作成するべく、rpmbuildを実行します。
が、以下のようにエラーが発生した場合は、パッケージが足りていないため、片っ端からyumでインストールしましょう。

# rpmbuild -bb /usr/src/redhat/SPECS/ruby.spec
error: Failed build dependencies:
        readline-devel is needed by ruby-1.8.7.249-1.i386
        ncurses-devel is needed by ruby-1.8.7.249-1.i386
        gdbm-devel is needed by ruby-1.8.7.249-1.i386
        tcl-devel is needed by ruby-1.8.7.249-1.i386
        tk-devel is needed by ruby-1.8.7.249-1.i386
        libX11-devel is needed by ruby-1.8.7.249-1.i386
        openssl-devel is needed by ruby-1.8.7.249-1.i386
        db4-devel is needed by ruby-1.8.7.249-1.i386
        byacc is needed by ruby-1.8.7.249-1.i386
        emacs is needed by ruby-1.8.7.249-1.i386


(上記のようなエラーが出た場合)足りないパッケージをyumで全部インストール。

# yum install readline-devel ncurses-devel gdbm-devel tcl-devel tk-devel libX11-devel openssl-devel db4-devel byacc emacs


で、rpmbuildを再実行。

# rpmbuild -bb /usr/src/redhat/SPECS/ruby.spec


無事、成功すると、以下のような感じで、"/usr/src/redhat/RPMS/i386"以下にRPMファイルが生成されているはず。
(i386の部分は、アーキテクチャに依存します。他にはx86_64とか。)

# ll /usr/src/redhat/RPMS/i386/
total 12172
-rw-r--r-- 1 root root  581822 Jun  8 01:54 ruby-1.8.7.249-1.i386.rpm
-rw-r--r-- 1 root root 2311392 Jun  8 01:55 ruby-debuginfo-1.8.7.249-1.i386.rpm
-rw-r--r-- 1 root root  335640 Jun  8 01:54 ruby-devel-1.8.7.249-1.i386.rpm
-rw-r--r-- 1 root root 1501295 Jun  8 01:55 ruby-docs-1.8.7.249-1.i386.rpm
-rw-r--r-- 1 root root  332740 Jun  8 01:55 ruby-irb-1.8.7.249-1.i386.rpm
-rw-r--r-- 1 root root 1873325 Jun  8 01:54 ruby-libs-1.8.7.249-1.i386.rpm
-rw-r--r-- 1 root root  318544 Jun  8 01:55 ruby-mode-1.8.7.249-1.i386.rpm
-rw-r--r-- 1 root root  401830 Jun  8 01:55 ruby-rdoc-1.8.7.249-1.i386.rpm
-rw-r--r-- 1 root root 2308416 Jun  8 01:55 ruby-ri-1.8.7.249-1.i386.rpm
-rw-r--r-- 1 root root  558459 Jun  8 01:55 ruby-static-1.8.7.249-1.i386.rpm
-rw-r--r-- 1 root root 1871060 Jun  8 01:55 ruby-tcltk-1.8.7.249-1.i386.rpm

作成したRPMパッケージをインストール

以下の感じで実行します。この辺は、お馴染みのやり方ですよね。

# rpm -Uvh /usr/src/redhat/RPMS/i386/ruby-*.rpm


という感じで、無事にRuby1.8.7をパッケージインストールすることができました!

# ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-linux]

関連リンク


Linuxサーバ Hacks 2 ―コネクティング、モニタリング、トラブルシューティング

Linuxサーバ Hacks 2 ―コネクティング、モニタリング、トラブルシューティング

  • 作者: Bill von Hagen,Brian K. Jones,菅野良二
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2006/10/24
  • メディア: 単行本(ソフトカバー)
  • 購入: 3人 クリック: 26回
  • この商品を含むブログ (31件) を見る