The emancipation of MSpec.
[rbx.git] / Rakefile
blob3599ce7aea2156ccdf3ef701355141bca9537cc8
1 # NOTE! When updating this file, also update INSTALL, if necessary.
2 # NOTE! Please keep your tasks grouped together.
4 $VERBOSE = true
5 $verbose = Rake.application.options.trace
6 $dlext = Config::CONFIG["DLEXT"]
7 $compiler = nil
9 RUBINIUS_BASE = File.dirname(__FILE__)
11 require 'tsort'
12 require 'rakelib/rubinius'
13 require 'rakelib/struct_generator'
14 require 'rakelib/const_generator'
15 require 'rakelib/types_generator'
17 task :default => :build
19 # BUILD TASKS
21 desc "Build everything that needs to be built"
22 task :build => 'build:all'
24 task :stable_compiler do
25   if ENV['USE_CURRENT']
26     puts "Use current versions, not stable."
27   else
28     ENV['RBX_BOOTSTRAP'] = "runtime/stable/bootstrap.rba"
29     ENV['RBX_CORE'] = "runtime/stable/core.rba"
30     ENV['RBX_LOADER'] = "runtime/stable/loader.rbc"
31     ENV['RBX_PLATFORM'] = "runtime/stable/platform.rba"
32   end
33 end
35 rule ".rbc" => %w[.rb] do |t|
36   compile t.source, t.name
37 end
39 files = FileList['kernel/core/*.rb']
41 unless files.include?("kernel/core/dir.rb")
42   files.add("kernel/core/dir.rb")
43 end
45 Core      = CodeGroup.new(files, 'runtime/core', 'core')
47 Bootstrap = CodeGroup.new 'kernel/bootstrap/*.rb', 'runtime/bootstrap',
48                           'bootstrap'
49 PlatformFiles  = CodeGroup.new 'kernel/platform/*.rb', 'runtime/platform', 'platform'
51 file 'runtime/loader.rbc' => 'kernel/loader.rb' do
52   compile 'kernel/loader.rb', 'runtime/loader.rbc'
53 end
55 file 'runtime/stable/loader.rbc' => 'runtime/loader.rbc' do
56   cp 'runtime/loader.rbc', 'runtime/stable', :verbose => $verbose
57 end
59 file 'runtime/stable/compiler.rba' => 'build:compiler' do |t|
60   #sh "cd lib; zip -r ../runtime/stable/compiler.rba compiler -x \\*.rb"
61   rm_f t.name
62   rbc_files = Rake::FileList['compiler/**/*.rbc']
64   Dir.chdir 'lib' do
65     rbc_files.each do |rbc_file|
66       ar_add "../#{t.name}", rbc_file
67     end
68   end
69 end
71 Rake::StructGeneratorTask.new do |t|
72   t.dest = "lib/etc.rb"
73 end
75 Rake::StructGeneratorTask.new do |t|
76   t.dest = 'lib/zlib.rb'
77 end
79 AllPreCompiled = Core.output + Bootstrap.output + PlatformFiles.output
80 AllPreCompiled << "runtime/loader.rbc"
82 namespace :build do
84   task :all => %w[
85     build:shotgun
86     build:platform
87     build:rbc
88     compiler
89     lib/etc.rb
90     lib/rbconfig.rb
91     extensions
92   ]
94   # This nobody rule lets use use all the shotgun files as
95   # prereqs. This rule is run for all those prereqs and just
96   # (obviously) does nothing, but it makes rake happy.
97   rule '^shotgun/.+'
99   # These files must be excluded from the c_source FileList
100   # because they are build products (i.e. there is no rule
101   # to build them, they will be built) and the c_source list
102   # list gets created before they are deleted by the clean task.
103   exclude_source = [
104     /auto/,
105     /instruction_names/,
106     /node_types/,
107     /grammar.c/,
108     'primitive_indexes.h',
109     'primitive_util.h'
110   ]
112   c_source = FileList[
113     "shotgun/config.h",
114     "shotgun/lib/*.[chy]",
115     "shotgun/lib/*.rb",
116     "shotgun/lib/subtend/*.[chS]",
117     "shotgun/main.c",
118   ].exclude(*exclude_source)
120   file "shotgun/rubinius.bin" => c_source do
121     sh make('vm')
122   end
123   
124   file "shotgun/rubinius.local.bin" => c_source do
125     sh make('vm')
126   end
128   desc "Compiles shotgun (the C-code VM)"
129   task :shotgun => %w[configure shotgun/rubinius.bin shotgun/rubinius.local.bin]
131   task :setup_rbc => :stable_compiler
133   task :rbc => ([:setup_rbc] + AllPreCompiled)
135   task :compiler => :stable_compiler do
136     compile_dir "lib/compiler"
137   end
139   desc "Rebuild runtime/stable/*.  If you don't know why you're running this, don't."
140   task :stable => %w[
141     build:all
142     runtime/stable/bootstrap.rba
143     runtime/stable/core.rba
144     runtime/stable/compiler.rba
145     runtime/stable/loader.rbc
146     runtime/stable/platform.rba
147   ]
149   desc "Rebuild the .load_order.txt files"
150   task "load_order" do
151     # Note: Steps to rebuild load_order were defined above
152   end
154   namespace :vm do
155     task "clean" do
156       sh "cd shotgun/lib; #{make "clean"}"
157     end
159     task "dev" do
160       sh "cd shotgun/lib; #{make "DEV=1"}"
161     end
162   end
164   task :platform => 'runtime/platform.conf'
167 # INSTALL TASKS
169 desc "Install rubinius as rbx"
170 task :install => :config_env do
171   sh "cd shotgun; #{make "install"}"
173   mkdir_p RBAPATH, :verbose => true
174   mkdir_p CODEPATH, :verbose => true
176   rba_files = Rake::FileList.new('runtime/platform.conf',
177                                  'runtime/**/*.rb{a,c}',
178                                  'runtime/**/.load_order.txt')
180   install_files rba_files, RBAPATH
182   lib_files = Rake::FileList.new 'lib/**/*'
184   install_files lib_files, CODEPATH
186   mkdir_p File.join(CODEPATH, 'bin'), :verbose => true
188   Rake::FileList.new("#{CODEPATH}/**/*.rb").sort.each do |rb_file|
189     if File.exists? "#{rb_file}c"
190       next if File.mtime("#{rb_file}c") > File.mtime(rb_file)
191     end
192     sh File.join(BINPATH, 'rbx'), 'compile', rb_file, :verbose => true
193   end
196 desc "Uninstall rubinius and libraries. Helps with build problems."
197 task :uninstall => :config_env do
198   rm Dir[File.join(BINPATH, 'rbx*')]
199   rm_r Dir[File.join(LIBPATH, '*rubinius*')]
202 task :compiledir => :stable_compiler do
203   dir = ENV['DIR']
204   raise "Use DIR= to set which directory" if !dir or dir.empty?
205   compile_dir(dir)
208 # CLEAN TASKS
210 desc "Recompile all ruby system files"
211 task :rebuild => %w[clean build:all]
213 desc "Alias for clean:all"
214 task :clean => "clean:all"
216 desc "Alias for clean:distclean"
217 task :distclean => "clean:distclean"
219 namespace :clean do
220   desc "Clean everything but third-party libs"
221   task :all => %w[clean:rbc clean:extensions clean:shotgun clean:generated clean:crap clean:config]
223   desc "Clean everything including third-party libs"
224   task :distclean => %w[clean:all clean:external]
226   desc "Remove all compile system ruby files"
227   task :rbc do
228     files_to_delete = []
229     files_to_delete += Dir["*.rbc"] + Dir["**/*.rbc"] + Dir["**/.*.rbc"]
230     files_to_delete += Dir["**/.load_order.txt"]
231     files_to_delete += ["runtime/platform.conf"]
232     files_to_delete -= ["runtime/stable/loader.rbc"] # never ever delete this
234     files_to_delete.each do |f|
235       rm_f f, :verbose => $verbose
236     end
237   end
239   desc "Cleans all compiled extension files (lib/ext)"
240   task :extensions do
241     Dir["lib/ext/**/*#{$dlext}"].each do |f|
242       rm_f f, :verbose => $verbose
243     end
244   end
246   desc "Cleans up VM building site"
247   task :shotgun do
248     sh make('clean')
249   end
251   desc "Cleans up generated files"
252   task :generated do
253     rm_f Dir["shotgun/lib/grammar.c"], :verbose => $verbose
254   end
256   desc "Cleans up VM and external libs"
257   task :external do
258     sh "cd shotgun; #{make('distclean')}"
259   end
261   desc "Cleans up editor files and other misc crap"
262   task :crap do
263     rm_f Dir["*~"] + Dir["**/*~"], :verbose => $verbose
264   end
265   
266   desc "Cleans up config files (so they can be regenerated when you change PREFIX)"
267   task :config do
268     rm "shotgun/config.h", :verbose => $verbose
269     rm "shotgun/config.mk", :verbose => $verbose
270   end
273 # SPEC TASKS
274 desc "Run all 'known good' specs (task alias for spec:ci)"
275 task :spec => 'spec:ci'
277 namespace :spec do
278   namespace :setup do
279     # Setup for 'Subtend' specs. No need to call this yourself.
280     task :subtend do
281       Dir["spec/subtend/**/Rakefile"].each do |rakefile|
282         sh "rake -f #{rakefile}"
283       end
284     end
285   end
287   desc "Initialize git submodules for mspec and rubyspec"
288   task :init => 'mspec:init'
290   desc "Run continuous integration examples"
291   task :ci => :build do
292     clear_compiler
294     target = ENV['SPEC_TARGET'] || 'rubinius'
295     system %(shotgun/rubinius -e 'puts "rubinius build: \#{Rubinius::BUILDREV}"') if target == 'rubinius'
296     sh "bin/mspec ci -t #{target}"
297   end
299   spec_targets = %w(compiler core language library parser rubinius)
300   # Build a spec:<task_name> for each group of Rubinius specs
301   spec_targets.each do |group|
302     desc "Run #{group} examples"
303     task group do
304       sh "bin/mspec spec/#{group}"
305     end
306   end
308   desc "Run subtend (Rubinius C API) examples"
309   task :subtend => "spec:setup:subtend" do
310     sh "bin/mspec spec/rubinius/subtend"
311   end
313   # Specdiffs to make it easier to see what your changes have affected :)
314   desc 'Run specs and produce a diff against current base'
315   task :diff => 'diff:run'
317   namespace :diff do
318     desc 'Run specs and produce a diff against current base'
319     task :run do
320       system 'bin/mspec -f ci -o spec/reports/specdiff.txt spec'
321       system 'diff -u spec/reports/base.txt spec/reports/specdiff.txt'
322       system 'rm spec/reports/specdiff.txt'
323     end
325     desc 'Replace the base spec file with a new one'
326     task :replace do
327       system 'bin/mspec -f ci -o spec/reports/base.txt spec'
328     end
329   end
331   desc "Run the rspec specs for mspec"
332   task :mspec do
333     # Use the rspec spec runner (see mspec/README; gem install rspec)
334     sh 'spec ./mspec/spec'
335   end
337   task :r2r do
338     puts ARGV.inspect
339   end
342 namespace :mspec do
343   desc "Initialize git submodule for mspec"
344   task :init do
345     sh "git submodule init mspec"
346     sh "git submodule update mspec"
347   end
349   desc "Synchronize mspec submodule to current remote version"
350   task :sync do
351     Dir.chdir "mspec" do
352       sh "git fetch"
353       sh "git rebase origin"
354     end
355     version = `git log --pretty=oneline -1 mspec`[0..7]
356     sh "git add mspec"
357     sh "git commit -m 'Updated MSpec submodule to #{version}'"
358   end
360   desc "Update mspec sources to current submodule version"
361   task :update do
362     sh "git submodule update mspec"
363   end
365   task :pull => :update
368 # MISC TASKS
370 desc "Build task for CruiseControl"
371 task :ccrb => [:build, 'spec:ci']
373 namespace :test do
374   desc "Run CI client daemon in incremental mode."
375   task :daemon do
376     sh "tools/cluster_test/ci.rb -i"
377   end
379   desc "Run CI client daemon in full build mode."
380   task :daemon_full do
381     sh "tools/cluster_test/ci.rb"
382   end