1 # NOTE! When updating this file, also update INSTALL, if necessary.
2 # NOTE! Please keep your tasks grouped together.
5 $verbose = Rake.application.options.trace
6 $dlext = Config::CONFIG["DLEXT"]
9 RUBINIUS_BASE = File.dirname(__FILE__)
12 require 'rakelib/rubinius'
13 require 'rakelib/struct_generator'
14 require 'rakelib/const_generator'
15 require 'rakelib/types_generator'
17 task :default => :build
21 desc "Build everything that needs to be built"
22 task :build => 'build:all'
24 task :stable_compiler do
26 puts "Use current versions, not stable."
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"
35 rule ".rbc" => %w[.rb] do |t|
36 compile t.source, t.name
39 files = FileList['kernel/core/*.rb']
41 unless files.include?("kernel/core/dir.rb")
42 files.add("kernel/core/dir.rb")
45 Core = CodeGroup.new(files, 'runtime/core', 'core')
47 Bootstrap = CodeGroup.new 'kernel/bootstrap/*.rb', 'runtime/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'
55 file 'runtime/stable/loader.rbc' => 'runtime/loader.rbc' do
56 cp 'runtime/loader.rbc', 'runtime/stable', :verbose => $verbose
59 file 'runtime/stable/compiler.rba' => 'build:compiler' do |t|
60 #sh "cd lib; zip -r ../runtime/stable/compiler.rba compiler -x \\*.rb"
62 rbc_files = Rake::FileList['compiler/**/*.rbc']
65 rbc_files.each do |rbc_file|
66 ar_add "../#{t.name}", rbc_file
71 Rake::StructGeneratorTask.new do |t|
75 Rake::StructGeneratorTask.new do |t|
76 t.dest = 'lib/zlib.rb'
79 AllPreCompiled = Core.output + Bootstrap.output + PlatformFiles.output
80 AllPreCompiled << "runtime/loader.rbc"
95 # This nobody rule lets use use all the shotgun files as
96 # prereqs. This rule is run for all those prereqs and just
97 # (obviously) does nothing, but it makes rake happy.
100 # These files must be excluded from the c_source FileList
101 # because they are build products (i.e. there is no rule
102 # to build them, they will be built) and the c_source list
103 # list gets created before they are deleted by the clean task.
109 'primitive_indexes.h',
115 "shotgun/lib/*.[chy]",
117 "shotgun/lib/subtend/*.[chS]",
119 ].exclude(*exclude_source)
121 file "shotgun/rubinius.bin" => c_source do
125 file "shotgun/rubinius.local.bin" => c_source do
129 desc "Compiles shotgun (the C-code VM)"
130 task :shotgun => %w[configure shotgun/rubinius.bin shotgun/rubinius.local.bin]
132 task :setup_rbc => :stable_compiler
134 task :rbc => ([:setup_rbc] + AllPreCompiled)
136 task :compiler => :stable_compiler do
137 compile_dir "lib/compiler"
140 desc "Rebuild runtime/stable/*. If you don't know why you're running this, don't."
143 runtime/stable/bootstrap.rba
144 runtime/stable/core.rba
145 runtime/stable/compiler.rba
146 runtime/stable/loader.rbc
147 runtime/stable/platform.rba
150 desc "Rebuild the .load_order.txt files"
152 # Note: Steps to rebuild load_order were defined above
157 sh "cd shotgun/lib; #{make "clean"}"
161 sh "cd shotgun/lib; #{make "DEV=1"}"
165 task :platform => 'runtime/platform.conf'
170 desc "Install rubinius as rbx"
171 task :install => :config_env do
172 sh "cd shotgun; #{make "install"}"
174 mkdir_p RBAPATH, :verbose => true
175 mkdir_p CODEPATH, :verbose => true
177 rba_files = Rake::FileList.new('runtime/platform.conf',
178 'runtime/**/*.rb{a,c}',
179 'runtime/**/.load_order.txt')
181 install_files rba_files, RBAPATH
183 lib_files = Rake::FileList.new 'lib/**/*'
185 install_files lib_files, CODEPATH
187 mkdir_p File.join(CODEPATH, 'bin'), :verbose => true
189 Rake::FileList.new("#{CODEPATH}/**/*.rb").sort.each do |rb_file|
190 if File.exists? "#{rb_file}c"
191 next if File.mtime("#{rb_file}c") > File.mtime(rb_file)
193 sh File.join(BINPATH, 'rbx'), 'compile', rb_file, :verbose => true
197 desc "Uninstall rubinius and libraries. Helps with build problems."
198 task :uninstall => :config_env do
199 rm Dir[File.join(BINPATH, 'rbx*')]
200 rm_r Dir[File.join(LIBPATH, '*rubinius*')]
203 task :compiledir => :stable_compiler do
205 raise "Use DIR= to set which directory" if !dir or dir.empty?
211 desc "Recompile all ruby system files"
212 task :rebuild => %w[clean build:all]
214 desc "Alias for clean:all"
215 task :clean => "clean:all"
217 desc "Alias for clean:distclean"
218 task :distclean => "clean:distclean"
221 desc "Clean everything but third-party libs"
222 task :all => %w[clean:rbc clean:extensions clean:shotgun clean:generated clean:crap clean:config]
224 desc "Clean everything including third-party libs"
225 task :distclean => %w[clean:all clean:external]
227 desc "Remove all compile system ruby files"
230 files_to_delete += Dir["*.rbc"] + Dir["**/*.rbc"] + Dir["**/.*.rbc"]
231 files_to_delete += Dir["**/.load_order.txt"]
232 files_to_delete += ["runtime/platform.conf"]
233 files_to_delete -= ["runtime/stable/loader.rbc"] # never ever delete this
235 files_to_delete.each do |f|
236 rm_f f, :verbose => $verbose
240 desc "Cleans all compiled extension files (lib/ext)"
242 Dir["lib/ext/**/*#{$dlext}"].each do |f|
243 rm_f f, :verbose => $verbose
247 desc "Cleans up VM building site"
252 desc "Cleans up generated files"
254 rm_f Dir["shotgun/lib/grammar.c"], :verbose => $verbose
257 desc "Cleans up VM and external libs"
259 sh "cd shotgun; #{make('distclean')}"
262 desc "Cleans up editor files and other misc crap"
264 rm_f Dir["*~"] + Dir["**/*~"], :verbose => $verbose
267 desc "Cleans up config files (so they can be regenerated when you change PREFIX)"
269 rm "shotgun/config.h", :verbose => $verbose
270 rm "shotgun/config.mk", :verbose => $verbose
275 desc "Run all 'known good' specs (task alias for spec:ci)"
276 task :spec => 'spec:ci'
280 # Setup for 'Subtend' specs. No need to call this yourself.
282 Dir["spec/subtend/**/Rakefile"].each do |rakefile|
283 sh "rake -f #{rakefile}"
288 desc "Initialize git submodules for mspec and rubyspec"
289 task :init => 'mspec:init'
291 desc "Run continuous integration examples"
292 task :ci => :build do
294 sh "bin/mspec ci -t #{spec_target}"
297 desc "Run continuous integration examples including stdlib"
298 task :full => :build do
300 sh "bin/mspec ci -t #{spec_target} -B full.mspec"
303 spec_targets = %w(compiler core language library parser rubinius)
304 # Build a spec:<task_name> for each group of Rubinius specs
305 spec_targets.each do |group|
306 desc "Run #{group} examples"
308 sh "bin/mspec spec/#{group}"
312 desc "Run subtend (Rubinius C API) examples"
313 task :subtend => "spec:setup:subtend" do
314 sh "bin/mspec spec/rubinius/subtend"
317 # Specdiffs to make it easier to see what your changes have affected :)
318 desc 'Run specs and produce a diff against current base'
319 task :diff => 'diff:run'
322 desc 'Run specs and produce a diff against current base'
324 system 'bin/mspec -f ci -o spec/reports/specdiff.txt spec'
325 system 'diff -u spec/reports/base.txt spec/reports/specdiff.txt'
326 system 'rm spec/reports/specdiff.txt'
329 desc 'Replace the base spec file with a new one'
331 system 'bin/mspec -f ci -o spec/reports/base.txt spec'
335 desc "Run the rspec specs for mspec"
337 # Use the rspec spec runner (see mspec/README; gem install rspec)
338 sh 'spec ./mspec/spec'
347 desc "Initialize git submodule for mspec"
349 unless File.exist? "mspec/bin/mspec"
350 puts "Initializing mspec submodule..."
352 sh "git submodule init mspec"
353 sh "git submodule update mspec"
357 desc "Synchronize mspec submodule to current remote version"
361 sh "git rebase origin"
363 version = `git log --pretty=oneline -1 mspec`[0..7]
365 sh "git commit -m 'Updated MSpec submodule to #{version}'"
368 desc "Update mspec sources to current submodule version"
370 sh "git submodule update mspec"
373 task :pull => :update
378 desc "Build task for CruiseControl"
379 task :ccrb => [:build, 'spec:ci']
382 desc "Run CI client daemon in incremental mode."
384 sh "tools/cluster_test/ci.rb -i"
387 desc "Run CI client daemon in full build mode."
389 sh "tools/cluster_test/ci.rb"