]> git.pld-linux.org Git - packages/rpm.git/blob - gem_helper.rb
- add -Werror=trampoline to prevent GCC from generating code that require executable...
[packages/rpm.git] / gem_helper.rb
1 #!/usr/bin/env ruby
2 #--
3 # Copyright 2010 Per Ã˜yvind Karlsen <peroyvind@mandriva.org>
4 # This program is free software. It may be redistributed and/or modified under
5 # the terms of the LGPL version 2.1 (or later).
6 #++
7
8 require 'optparse'
9 require 'rubygems'
10
11 # Write the .gemspec specification (in Ruby)
12 def writespec(spec)
13         file_name = spec.full_name.untaint + '.gemspec'
14         File.open(file_name, "w") do |file|
15                 file.puts spec.to_ruby_for_cache
16         end
17         print "Wrote: %s\n" % file_name
18 end
19
20 # make gemspec self-contained
21 if ARGV[0] == "spec-dump"
22         spec = eval(File.read(ARGV[1]))
23         writespec(spec)
24         exit(0)
25 end
26
27 if ARGV[0] == "build" or ARGV[0] == "install" or ARGV[0] == "spec"
28   require 'yaml'
29   require 'zlib'
30
31   filter = nil
32   opts = nil
33   keepcache = false
34   fixperms = false
35   gemdir = nil
36   dry_run = false
37   files = []
38   argv = ARGV[1..-1]
39   # Push this into some environment variables as the modified classes doesn't
40   # seem to be able to access our global variables.. </lameworkaround>
41   ENV['GEM_MODE'] = ARGV[0]
42   if ARGV[0] == "build"
43     opts = OptionParser.new("#{$0} <--filter PATTERN>")
44     opts.on("-f", "--filter PATTERN", "Filter pattern to use for gem files") do |val|
45       filter = val
46     end
47     opts.on("-j", "--jobs JOBS", "Number  of  jobs to run simultaneously.") do |val|
48       ENV['jobs'] = "-j"+val
49     end
50     opts.on("--dry-run", "Only show the files the gem will include") do
51       ARGV.delete("--dry-run")
52       dry_run = true
53     end
54   elsif ARGV[0] == "install"
55     opts = OptionParser.new("#{$0} <--keep-cache>")
56     opts.on("--keep-cache", "Don't delete gem copy from cache") do
57       ARGV.delete("--keep-cache")
58       keepcache = true
59     end
60     opts.on("--fix-permissions", "Force standard permissions for files installed") do
61       ARGV.delete("--fix-permissions")
62       fixperms = true
63     end    
64     opts.on("-i", "--install-dir GEMDIR", "Gem repository directory") do |val|
65       gemdir = val
66     end
67   end
68   while argv.length > 0
69     begin
70       opts.parse!(argv)
71     rescue OptionParser::InvalidOption => e
72       e.recover(argv)
73     end
74     argv.delete_at(0)
75   end
76
77   file_data = Zlib::GzipReader.open("metadata.gz") {|io| io.read}
78   header = YAML::load(file_data)
79   body = {}
80   # I don't know any better.. :/
81   header.instance_variables.each do |iv|
82           body[iv.to_s.sub(/^@/,'')] = header.instance_variable_get(iv)
83   end
84
85   spec = Gem::Specification.from_yaml(YAML.dump(header))
86
87   if ARGV[0] == "spec"
88     writespec(spec)
89     exit(0)
90   end
91
92   if ARGV[0] == "install"
93     system("gem %s %s.gem" % [ARGV.join(' '), spec.full_name])
94     if !keepcache
95       require 'fileutils'
96       FileUtils.rm_rf("%s/cache" % gemdir)
97     end
98     if fixperms
99       chmod = "chmod u+r,u+w,g-w,g+r,o+r -R %s" % gemdir
100       print "\nFixing permissions:\n\n%s\n" % chmod
101       system("%s" % chmod)
102       print "\n"
103     end
104   end
105
106   if body['extensions'].size > 0
107     require 'rubygems/ext'
108     module Gem::Ext
109       class Builder
110         def self.make(dest_path, results)
111           make_program = ENV['make']
112           unless make_program then
113             make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
114           end
115           cmd = make_program
116           if ENV['GEM_MODE'] == "build"
117             cmd += " %s" % ENV['jobs']
118           elsif ENV['GEM_MODE'] == "install"
119             cmd += " DESTDIR='%s' install" % ENV['DESTDIR']
120           end
121           results << cmd
122           results << `#{cmd} #{redirector}`
123
124           raise Gem::ExtensionBuildError, "make failed:\n\n#{results}" unless
125           $?.success?
126         end
127       end
128     end
129
130     require 'rubygems/installer'
131     module Gem
132       class Installer
133         def initialize(spec, options={})
134           @gem_dir = Dir.pwd
135           @spec = spec
136         end
137       end
138       class ConfigFile
139         def really_verbose
140           true
141         end
142       end
143     end
144
145     unless dry_run
146       Gem::Installer.new(spec).build_extensions
147     else
148       for ext in body['extensions']
149         files.push(ext[0..ext.rindex("/")-1]+".so")
150       end
151     end
152
153     body['extensions'].clear()
154   end
155   if ARGV[0] == "build"
156     body['test_files'].clear()
157
158     # We don't want ext/ in require_paths, it will only contain content for
159     # building extensions which needs to be installed in sitearchdir anyways..
160     idx = 0
161     for i in 0..body['require_paths'].size()-1
162       if body['require_paths'][idx].match("^ext(/|$)")
163         body['require_paths'].delete_at(idx)
164       else
165         idx += 1
166       end
167     end
168
169     # We'll get rid of all the files we don't really need to install
170     idx = 0
171     for i in 0..body['files'].size()-1
172       if filter and body['files'][idx].match(filter)
173         match = true
174       else
175         match = false
176         for path in body['require_paths']
177           if body['files'][idx].match("^%s/" % path)
178             match = true
179           end
180         end
181       end
182       if !match
183         body['files'].delete_at(idx)
184       else
185         idx += 1
186       end
187     end
188
189     spec = Gem::Specification.from_yaml(YAML.dump(header))
190     unless dry_run
191       Gem::Builder.new(spec).build
192     else
193       files.concat(spec.files)
194       print "%s\n" % files.join("\n")
195     end
196   end
197 end
This page took 0.034523 seconds and 3 git commands to generate.