Fix up Rubinius specific library specs.
[rbx.git] / lib / rubygems / platform.rb
blob5e932cd592d332dd9e294661d5691079f571d22b
1 require 'rubygems'
3 ##
4 # Available list of platforms for targeting Gem installations.
6 class Gem::Platform
8   @local = nil
10   attr_accessor :cpu
12   attr_accessor :os
14   attr_accessor :version
16   DEPRECATED_CONSTS = [
17     :DARWIN,
18     :LINUX_586,
19     :MSWIN32,
20     :PPC_DARWIN,
21     :WIN32,
22     :X86_LINUX
23   ]
25   def self.const_missing(name) # TODO remove six months from 2007/12
26     if DEPRECATED_CONSTS.include? name then
27       raise NameError, "#{name} has been removed, use CURRENT instead"
28     else
29       super
30     end
31   end
33   def self.local
34     arch = Gem::ConfigMap[:arch]
35     arch = "#{arch}_60" if arch =~ /mswin32$/
36     @local ||= new(arch)
37   end
39   def self.match(platform)
40     Gem.platforms.any? do |local_platform|
41       platform.nil? or local_platform == platform or
42         (local_platform != Gem::Platform::RUBY and local_platform =~ platform)
43     end
44   end
46   def self.new(arch) # :nodoc:
47     case arch
48     when Gem::Platform::CURRENT then
49       Gem::Platform.local
50     when Gem::Platform::RUBY, nil, '' then
51       Gem::Platform::RUBY
52     else
53       super
54     end
55   end
57   def initialize(arch)
58     case arch
59     when Array then
60       @cpu, @os, @version = arch
61     when String then
62       arch = arch.split '-'
64       if arch.length > 2 and arch.last !~ /\d/ then # reassemble x86-linux-gnu
65         extra = arch.pop
66         arch.last << "-#{extra}"
67       end
69       cpu = arch.shift
71       @cpu = case cpu
72              when /i\d86/ then 'x86'
73              else cpu
74              end
76       if arch.length == 2 and arch.last =~ /^\d+$/ then # for command-line
77         @os, @version = arch
78         return
79       end
81       os, = arch
82       @cpu, os = nil, cpu if os.nil? # legacy jruby
84       @os, @version = case os
85                       when /aix(\d+)/ then             [ 'aix',       $1  ]
86                       when /cygwin/ then               [ 'cygwin',    nil ]
87                       when /darwin(\d+)?/ then         [ 'darwin',    $1  ]
88                       when /freebsd(\d+)/ then         [ 'freebsd',   $1  ]
89                       when /hpux(\d+)/ then            [ 'hpux',      $1  ]
90                       when /^java$/, /^jruby$/ then    [ 'java',      nil ]
91                       when /^java([\d.]*)/ then        [ 'java',      $1  ]
92                       when /linux/ then                [ 'linux',     $1  ]
93                       when /mingw32/ then              [ 'mingw32',   nil ]
94                       when /(mswin\d+)(\_(\d+))?/ then
95                         os, version = $1, $3
96                         @cpu = 'x86' if @cpu.nil? and os =~ /32$/
97                         [os, version]
98                       when /netbsdelf/ then            [ 'netbsdelf', nil ]
99                       when /openbsd(\d+\.\d+)/ then    [ 'openbsd',   $1  ]
100                       when /solaris(\d+\.\d+)/ then    [ 'solaris',   $1  ]
101                       # test
102                       when /^(\w+_platform)(\d+)/ then [ $1,          $2  ]
103                       else                             [ 'unknown',   nil ]
104                       end
105     when Gem::Platform then
106       @cpu = arch.cpu
107       @os = arch.os
108       @version = arch.version
109     else
110       raise ArgumentError, "invalid argument #{arch.inspect}"
111     end
112   end
114   def inspect
115     "#<%s:0x%x @cpu=%p, @os=%p, @version=%p>" % [self.class, object_id, *to_a]
116   end
118   def to_a
119     [@cpu, @os, @version]
120   end
122   def to_s
123     to_a.compact.join '-'
124   end
126   ##
127   # Is +other+ equal to this platform?  Two platforms are equal if they have
128   # the same CPU, OS and version.
130   def ==(other)
131     self.class === other and
132       @cpu == other.cpu and @os == other.os and @version == other.version
133   end
135   ##
136   # Does +other+ match this platform?  Two platforms match if they have the
137   # same CPU, or either has a CPU of 'universal', they have the same OS, and
138   # they have the same version, or either has no version.
140   def ===(other)
141     return nil unless Gem::Platform === other
143     # cpu
144     (@cpu == 'universal' or other.cpu == 'universal' or @cpu == other.cpu) and
146     # os
147     @os == other.os and
149     # version
150     (@version.nil? or other.version.nil? or @version == other.version)
151   end
153   ##
154   # Does +other+ match this platform?  If +other+ is a String it will be
155   # converted to a Gem::Platform first.  See #=== for matching rules.
157   def =~(other)
158     case other
159     when Gem::Platform then # nop
160     when String then
161       # This data is from http://gems.rubyforge.org/gems/yaml on 19 Aug 2007
162       other = case other
163               when /^i686-darwin(\d)/ then     ['x86',       'darwin',  $1]
164               when /^i\d86-linux/ then         ['x86',       'linux',   nil]
165               when 'java', 'jruby' then        [nil,         'java',    nil]
166               when /mswin32(\_(\d+))?/ then    ['x86',       'mswin32', $2]
167               when 'powerpc-darwin' then       ['powerpc',   'darwin',  nil]
168               when /powerpc-darwin(\d)/ then   ['powerpc',   'darwin',  $1]
169               when /sparc-solaris2.8/ then     ['sparc',     'solaris', '2.8']
170               when /universal-darwin(\d)/ then ['universal', 'darwin',  $1]
171               else                             other
172               end
174       other = Gem::Platform.new other
175     else
176       return nil
177     end
179     self === other
180   end
182   ##
183   # A pure-ruby gem that may use Gem::Specification#extensions to build
184   # binary files.
186   RUBY = 'ruby'
188   ##
189   # A platform-specific gem that is built for the packaging ruby's platform.
190   # This will be replaced with Gem::Platform::local.
192   CURRENT = 'current'