トップ «前の日記(2011-11-30) 最新 次の日記(2011-12-10)» 編集

2011-12-09 [長年日記]

_ RubyEnterpriseをsrpmからrebuildしようとしたらspec間違ってるじゃん

※ _prefix 付けるの前提みたい!

Xen + REE の問題を解消するために自前 build

Ruby Enterprise を rebuild しようとしています。以下にあるような Xen + REE の問題を解消するためです。

方法はいくつかあるのですが、全部入りで準備が楽だろうということで

ruby enterprise の srpm を取ってきて rebuild する

ことにしました。で、できあがった rpm を install し直すことにすれば作業的にも楽じゃないかなと予想。

基本手順

で、手順は基本的に以下のようになります。*1

  1. https://packages.endpoint.com/rhel/5/ruby-enterprise-opt/SRPMS/ から srpm を取得
  2. ~/rpmbuild/{BUILD, RPMS/i386, SOURCES, SPEC} を作る
  3. rpmbuildree ユーザーを作る
  4. メッセージを抑止する環境変数をセットします
  5. 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月なんだよね…。すぐに取りかかりにくい状況が本当にダメだ。

Tags: Ruby Linux Xen

*1 こういうところに手作業がいっぱいあるのが RHEL 系というか rpm 周りのきらいなところ。