/Rakefile

http://github.com/MagLev/maglev · Rakefile · 234 lines · 196 code · 26 blank · 12 comment · 16 complexity · caa8250d02204ed50d58d6ee8263c4a0 MD5 · raw file

  1. # MagLev Rakefile
  2. require 'rake/clean'
  3. begin
  4. # Try to support Rake 0.8.7 and 0.9.x (at least for a while)
  5. if defined? Rake::VERSION
  6. # Rake 0.9.x
  7. require 'rubygems'
  8. gem 'rdoc'
  9. require 'rdoc/task'
  10. else
  11. # Rake 0.8.x
  12. require 'rake/rdoctask'
  13. end
  14. Rake::RDocTask.new do |rd|
  15. rd.main = "README.rdoc"
  16. rd.rdoc_files.include 'docs/*', 'LICENSES.txt'
  17. rd.rdoc_files.include 'src/kernel/bootstrap/Maglev.rb'
  18. rd.rdoc_files.include 'examples/**/*README.rdoc', 'examples/**/readme.txt'
  19. end
  20. rescue LoadError => e
  21. puts e
  22. puts "Generating RDoc will not work without the rdoc gem"
  23. task :rdoc do
  24. puts "Install the rdoc gem and re-run this"
  25. end
  26. task :rerdoc do
  27. puts "Install the rdoc gem and re-run this"
  28. end
  29. end
  30. $LOAD_PATH << File.dirname(__FILE__) # For 1.9, '.' is no longer in the load path
  31. require 'rakelib/gemstone_env.rb'
  32. require 'rakelib/maglev_stone.rb'
  33. verbose false # turn off rake's chatter about all the sh commands
  34. CLEAN.include('*.out', 'log/vmunit*.out', 'log/all*.out', 'html',
  35. 'vmunit.log', 'topazerrors.log', 'gem_*_code.log')
  36. CLOBBER.include('lib/ruby/site_ruby/1.8/smalltalk', 'version.txt')
  37. task :default => :status
  38. desc "Show status of all stones"
  39. task :status do
  40. sh "$GEMSTONE/bin/gslist -clv" do |ok, status|
  41. case status.exitstatus
  42. when 0, 1
  43. # Ok, or no servers running: do nothing
  44. else
  45. raise "gslist failed: #{status.exitstatus}"
  46. end
  47. end
  48. end
  49. if ENV["TRAVIS"]
  50. tests = {"rubyspec" => "spec:ci",
  51. "vmunit" => "travis:vmunit",
  52. "vmunit2" => "tests:vmunit2",
  53. "p_tests" => "dev:p-tests",
  54. "fav_gems" => "tests:fav_gems_install",
  55. "sinatra" => "tests:sinatra",
  56. "examples" => "tests:examples"}
  57. task :travis do
  58. Rake::Task["stwrappers"].invoke
  59. ENV["PATH"] = "#{ENV['PATH']}:#{File.dirname(__FILE__)}/bin"
  60. Rake::Task[tests[ENV["CI_TESTS"]]].invoke
  61. end
  62. desc "Run vmunit tests on clean stone and again after update.sh ran"
  63. task :"travis:vmunit" do
  64. unless system("rake tests:vmunit") &&
  65. system("./update.sh") &&
  66. system("rake tests:vmunit")
  67. exit 1
  68. end
  69. end
  70. end
  71. # This initializes the environment, and then ensures that there is a
  72. # gemstone diretory there. Needed to pull this out, since some of the
  73. # initialization tasks need to be performed before there is a gemstone dir
  74. # there, but need the ENV var (i.e., need to know where gemstone should
  75. # be).
  76. task :gemstone do
  77. raise "\nBad GEMSTONE dir: '#{GEMSTONE}'" unless File.directory?(GEMSTONE)
  78. raise "\nNo etc/maglev.demo.key" unless File.exists?("etc/maglev.demo.key")
  79. end
  80. desc "Run a squeak image"
  81. task :squeak => 'netldi:start' do
  82. os = `uname`.chomp
  83. if os == "Darwin"
  84. gem_tools = '/Applications/GemTools-MagLev.app'
  85. if File.exists?(gem_tools)
  86. sh %{ open #{gem_tools} }
  87. else
  88. puts "Cannot open #{gem_tools}"
  89. puts "as that file does not exist. To fix this, download and unzip"
  90. puts "http://seaside.gemstone.com/squeak/GemTools-MagLev.zip"
  91. puts "then move GemTools-MagLev.app to /Applications"
  92. end
  93. else
  94. gem_tools = "#{MAGLEV_HOME}/../GemTools-MagLev.app/GemTools.sh"
  95. if File.exists?(gem_tools)
  96. sh "#{gem_tools}"
  97. else
  98. puts "Cannot open #{gem_tools}"
  99. puts "as that file does not exist. To fix this, download and unzip"
  100. puts "http://seaside.gemstone.com/squeak/GemTools-MagLev.zip"
  101. puts "then move GemTools-MagLev.app to \$MAGLEV_HOME/../"
  102. end
  103. end
  104. end
  105. desc "Create .rb files for each smalltalk class (lib/ruby/site_ruby/1.8/smalltalk/*)"
  106. task :stwrappers, :force do |t, args|
  107. wrapper_dir = MAGLEV_HOME + '/lib/ruby/site_ruby/1.8/smalltalk'
  108. if ! File.exist?(wrapper_dir) || args.force
  109. puts "Creating .rb files for smalltalk classes in lib/ruby/site_ruby/1.8/smalltalk/"
  110. run_on_stone(["omit resultcheck",
  111. "run",
  112. "RubyContext createSmalltalkFFIWrappers",
  113. "%"])
  114. else
  115. puts "#{wrapper_dir} already exists"
  116. end
  117. end
  118. namespace :stone do
  119. desc "List MagLev servers managed by this Rakefile"
  120. task :list do
  121. puts GemStoneInstallation.current.stones.join("\n")
  122. end
  123. desc "Create a new MagLev server and repository"
  124. task :create, :server_name do |t, args|
  125. raise ArgumentError, "Task #{t.name} requires a new server name" unless args.server_name
  126. puts "Creating server \"#{args.server_name}\""
  127. MagLevStone.create(args.server_name)
  128. end
  129. desc "Destroy an existing MagLev server and repository"
  130. task :destroy, :server_name do |t, args|
  131. raise ArgumentError, "Task #{t.name} requires an existing server name" unless args.server_name
  132. s = MagLevStone.existing(args.server_name)
  133. s.stop
  134. puts "Destroying server \"#{args.server_name}\""
  135. s.destroy!
  136. end
  137. desc "Invoke a task on all MagLev servers"
  138. task :all, :task_name do |t,args|
  139. GemStoneInstallation.current.stones.each do |server_name|
  140. Rake::Task["#{server_name}:#{args.task_name}"].invoke
  141. end
  142. end
  143. end
  144. # Run topaz commands on a particular stone
  145. def run_on_stone(commands_array, stone=(ENV['STONENAME'] || 'maglev'))
  146. Stone.new(stone).topaz_commands(commands_array)
  147. end
  148. namespace :netldi do
  149. desc "Stop NetLDI process"
  150. task :stop do
  151. GemStoneInstallation.current.stopnetldi
  152. end
  153. desc "Start NetLDI process"
  154. task :start do
  155. GemStoneInstallation.current.startnetldi
  156. end
  157. end
  158. # Helper function used to define tasks for each named stone
  159. def task_gemstone(stone, action, desc=nil)
  160. desc "#{desc.nil? ? action.to_s : desc}"
  161. task action do
  162. stone.send(action)
  163. end
  164. end
  165. GemStoneInstallation.current.stones.each do |server_name|
  166. next if defined?(Maglev) and Maglev::System.stone_name == server_name
  167. namespace server_name do
  168. [[:stop, "Stop the \"#{server_name}\" server"],
  169. [:restart, "Stop then start the \"#{server_name}\" server"],
  170. [:status, "Report status of the \"#{server_name}\" server"],
  171. [:reload, "Destroy the \"#{server_name}\" repository then load a fresh one"],
  172. [:take_snapshot, "Stop the \"#{server_name}\" server then make a backup copy of its repository"],
  173. [:restore_snapshot, "Restore the \"#{server_name}\" repository from its previous snapshot"],
  174. [:webtools, "Run the GemStone/S Webtools"],
  175. ].each do |action,desc|
  176. stone = MagLevStone.new(server_name, GemStoneInstallation.current)
  177. task_gemstone(stone, action, desc)
  178. end
  179. desc "Start the \"#{server_name}\" server.
  180. The netldiname parameter determines which netldi to use (default: ENV['gs64ldi'] || 'gs64ldi')."
  181. task :start, :netldiname do |t, args|
  182. stone = MagLevStone.new(server_name, GemStoneInstallation.current)
  183. netldi = args[:netldiname] || ENV['gs64ldi'] || 'gs64ldi'
  184. puts "Starting stone with netldi #{netldi}"
  185. ['GEMSTONE', 'GEMSTONE_GLOBAL_DIR'].each { |n| puts "#{n} => #{ENV[n]}" }
  186. stone.start netldi
  187. end
  188. desc "Read a GemStone Topaz .gs file or .rb file into server. Does a commit."
  189. task :input_file, :file do |t, args|
  190. stone = MagLevStone.new(server_name, GemStoneInstallation.current)
  191. file = File.expand_path args[:file]
  192. raise "Need a file to read." unless file
  193. raise "Can't open input file: #{file.inspect}" unless File.exists?(file)
  194. if file.end_with? ".rb"
  195. system "maglev-ruby -Mcommit --stone #{server_name} #{file}"
  196. else
  197. stone.input_file file, true
  198. end
  199. end
  200. end
  201. end
  202. if defined? Maglev
  203. at_exit do
  204. puts "[INFO] Some stone maintenance tasks have been omitted, because they cannot be run through MagLev rake. Use another Ruby for stone maintenance."
  205. end
  206. end