※ _prefix 付けるの前提みたい!
Xen + REE の問題を解消するために自前 build
Ruby Enterprise を rebuild しようとしています。以下にあるような Xen + REE の問題を解消するためです。
- 検閲Tech: Xen DomUでRedmine + Phusion Passenger + Ruby Enterprise Edition
- 4gb seg fixup REE XEN - Ruby Enterprise Edition | Google グループ
方法はいくつかあるのですが、全部入りで準備が楽だろうということで
ruby enterprise の srpm を取ってきて rebuild する
ことにしました。で、できあがった rpm を install し直すことにすれば作業的にも楽じゃないかなと予想。
基本手順
で、手順は基本的に以下のようになります。1
- https://packages.endpoint.com/rhel/5/ruby-enterprise-opt/SRPMS/ から srpm を取得
- ~/rpmbuild/{BUILD, RPMS/i386, SOURCES, SPEC} を作る
- rpmbuildree ユーザーを作る
- メッセージを抑止する環境変数をセットします
- rpmbuild -bb –rebuild –define 'dist #{SUFFIX}' 'srpm file'
rpmbuild は特定のディレクトリ構造を要求します。こんなの rpmbuild init みたいなコマンドで自動で作ってほしいです。rpmbuild は root 権限を使わずに済むように特定のユーザーの作成を推奨します。本気で推奨するなら root になって build を継続しないで STOP してほしいです。とにかく手作業はきらいです。
話が逸れました。
環境変数は以下のようにセットします。
export CFLAGS="-mno-tls-direct-seg-refs"
export CXXFLAGS="-mno-tls-direct-seg-refs"
で、rpmbuild の –define で自分で用意したよーと目印を付けておきます。最終的にパッケージ名に反映されるので、公式に配布されているものと自分で build したものの区別を付けられます。会社名の略称とか付ければいいんじゃないですかね。
cf.
ところが spec が間違っている
上の手順でディレクトリやユーザー名の問題がなくてもやはりうまくいきません。答えは以下にあって、要するに spec ファイルが間違っています。
I need an rpm that includes libruby.so - Ruby Enterprise Edition | Google グループ
こんな感じで直せということですね。
これで今度は spec ファイルを指定して rpmbuild してやると ~/rpmbuild/RPMS 以下に指定のプラットフォームの rpm が生成されます。
もし次回以降がありそうならこの段階で
- ~/rpmbuild/SRPMS も用意
- rpmbuild を -ba に変更
してやればいいと思います。spec ファイルに直接環境変数を書くことはできないのかな? できるのならそういう spec を用意しておけばいいと思います!
[2012-01-06 追記] 実は _prefix がないだけ
あとで分かったけど上のやりかたで作った rpm は endpoint の rpm とは異なります。
rpmbuild -bb --rebuild --define 'dist XXX' --define '_prefix /usr/local' \
ruby-enterprise-xxx.srpm
ってやるのが正解みたい。
この _prefix /usr/local がないと rpmbuild 標準の /usr 以下にインストールされて、インストール済みの gem とかとイロイロ合わないのでまともに動きません。
実は入れ直さなきゃねと気づいたのは7月なんだよね…。すぐに取りかかりにくい状況が本当にダメだ。
こういうところに手作業がいっぱいあるのが RHEL 系というか rpm 周りのきらいなところ。 ↩