gem のバージョン指定(Gem::Requirement)で "~>" という指定ができるけど、RPM ではできない(ですよね?)件。
RubyForge: Gem to rpm converter: Project Info
gem2rpm の中(gem2rpm.rb)で、Gem::Requirement を拡張していて、Gem::Requirement#to_rpm というメソッドを追加しています。このメソッドは、gem の spec に記載(?)されている依存ライブラリのバージョン番号を、RPM にふさわしいバージョン番号に変換する役割を担います。
この to_rpm メソッドは、gem2rpm のバージョン 0.6.0 現在、ほぼ素通りとなっています。やっていることは、"> 0.0.0" だった場合に "" に置換するのみです。"~>" が使われていても、素通りしてしまうため、RPM に蹴られてしまいます。
gem2rpm は、2008/10/06 のリリースで止まっているので、"~>" に対応しないまま今日に至る、ということでしょう("~>" の追加がいつ行われたのかは把握していません)。
なんでこんな話をしているかというと、actionpack-2.3.5 の RPM を作成する必要があり、その中で rack のバージョン指定 "~> 1.0.1" に遭遇したわけです。なので、どうにかして gem2rpm を "~>" に対応させる必要があるわけなのです(gem2rpm を使わない、というのもありですが...)。
そんな訳で、RPM 作成どころか SRPM を作成するところまでは試していませんが、以下のような修正でごまかしてみようかと思っています。手元では RPM をビルドする環境が整っていないので、検証は後ほど。
--- gem2rpm.rb.orig 2010-01-29 00:19:42.000000000 +0900 +++ gem2rpm.rb 2010-01-29 00:28:15.000000000 +0900 @@ -24,15 +24,20 @@ module Gem class Requirement def rpm_version_transform(version) - if version == "> 0.0.0" - version = "" + case version + when "> 0.0.0" + [""] + when /^~> (.+)$/ + v = Gem::Version.new($1) + [">= #{v.version}", "< #{v.bump}"] + else + [version] end - version end def to_rpm result = as_list - return result.map { |version| rpm_version_transform(version) } + return result.inject([]) {|res, version| res += rpm_version_transform(version) } end end


コメントする