# Rakefile for rake -*- ruby -*- # Copyright 2003, 2004 by Jim Weirich (jim@weirichhouse.org) # All rights reserved. # This file is may be distributed under an MIT style license. See # MIT-LICENSE for details. begin require 'rubygems' require 'rake/gempackagetask' rescue Exception nil end require 'rake/clean' require 'rake/testtask' require 'rake/rdoctask' CLEAN.include('**/*.o') CLOBBER.include('doc/example/main', 'testdata') CLOBBER.include('test/data/**/temp_*') CLOBBER.include('test/data/chains/play.*') CLOBBER.include('test/data/file_creation_task/build') CLOBBER.include('test/data/file_creation_task/src') CLOBBER.include('TAGS') def announce(msg='') STDERR.puts msg end # Determine the current version of the software if `ruby -Ilib ./bin/rake --version` =~ /\S+$/ CURRENT_VERSION = $& else CURRENT_VERSION = "0.0.0" end if ENV['REL'] PKG_VERSION = ENV['REL'] else PKG_VERSION = CURRENT_VERSION end SRC_RB = FileList['lib/**/*.rb'] # The default task is run if rake is given no explicit arguments. desc "Default Task" task :default => :alltests # Test Tasks --------------------------------------------------------- task :ta => :alltests task :tf => :funtests task :tu => :unittests task :tc => :contribtests task :test => :unittests Rake::TestTask.new(:alltests) do |t| t.test_files = FileList[ 'test/test*.rb', 'test/contrib/test*.rb', 'test/fun*.rb' ] t.warning = true t.verbose = true end Rake::TestTask.new(:unittests) do |t| t.test_files = FileList['test/test*.rb'] t.warning = true t.verbose = false end Rake::TestTask.new(:funtests) do |t| t.test_files = FileList['test/fun*.rb'] t.warning = true t.warning = true end Rake::TestTask.new(:contribtests) do |t| t.test_files = FileList['test/contrib/test*.rb'] t.verbose = false t.warning = true end directory 'testdata' [:alltests, :unittests, :contribtests, :funtests].each do |t| task t => ['testdata'] end # CVS Tasks ---------------------------------------------------------- # Install rake using the standard install.rb script. desc "Install the application" task :install do ruby "install.rb" end # Create a task to build the RDOC documentation tree. rd = Rake::RDocTask.new("rdoc") { |rdoc| rdoc.rdoc_dir = 'html' # rdoc.template = 'kilmer' # rdoc.template = 'css2' rdoc.template = 'doc/jamis.rb' rdoc.title = "Rake -- Ruby Make" rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README' rdoc.rdoc_files.include('README', 'MIT-LICENSE', 'TODO', 'CHANGES') rdoc.rdoc_files.include('lib/**/*.rb', 'doc/**/*.rdoc') rdoc.rdoc_files.exclude(/\bcontrib\b/) } # ==================================================================== # Create a task that will package the Rake software into distributable # tar, zip and gem files. PKG_FILES = FileList[ 'install.rb', '[A-Z]*', 'bin/**/*', 'lib/**/*.rb', 'test/**/*.rb', 'test/**/*.rf', 'test/**/*.mf', 'test/**/Rakefile', 'doc/**/*' ] PKG_FILES.exclude('doc/example/*.o') PKG_FILES.exclude(%r{doc/example/main$}) if ! defined?(Gem) puts "Package Target requires RubyGEMs" else spec = Gem::Specification.new do |s| #### Basic information. s.name = 'rake' s.version = PKG_VERSION s.summary = "Ruby based make-like utility." s.description = <<-EOF Rake is a Make-like program implemented in Ruby. Tasks and dependencies are specified in standard Ruby syntax. EOF #### Dependencies and requirements. #s.add_dependency('log4r', '> 1.0.4') #s.requirements << "" #### Which files are to be included in this gem? Everything! (Except CVS directories.) s.files = PKG_FILES.to_a #### C code extensions. #s.extensions << "ext/rmagic/extconf.rb" #### Load-time details: library and application (you will need one or both). s.require_path = 'lib' # Use these for libraries. s.bindir = "bin" # Use these for applications. s.executables = ["rake"] s.default_executable = "rake" #### Documentation and testing. s.has_rdoc = true s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a s.rdoc_options << '--title' << 'Rake -- Ruby Make' << '--main' << 'README' << '--line-numbers' #### Author and project details. s.author = "Jim Weirich" s.email = "jim@weirichhouse.org" s.homepage = "http://rake.rubyforge.org" s.rubyforge_project = "rake" if ENV['CERT_DIR'] s.signing_key = File.join(ENV['CERT_DIR'], 'gem-private_key.pem') s.cert_chain = [File.join(ENV['CERT_DIR'], 'gem-public_cert.pem')] end end package_task = Rake::GemPackageTask.new(spec) do |pkg| pkg.need_zip = true pkg.need_tar = true end end # Misc tasks ========================================================= def count_lines(filename) lines = 0 codelines = 0 open(filename) { |f| f.each do |line| lines += 1 next if line =~ /^\s*$/ next if line =~ /^\s*#/ codelines += 1 end } [lines, codelines] end def show_line(msg, lines, loc) printf "%6s %6s %s\n", lines.to_s, loc.to_s, msg end desc "Count lines in the main rake file" task :lines do total_lines = 0 total_code = 0 show_line("File Name", "LINES", "LOC") SRC_RB.each do |fn| lines, codelines = count_lines(fn) show_line(fn, lines, codelines) total_lines += lines total_code += codelines end show_line("TOTAL", total_lines, total_code) end ARCHIVEDIR = '/mnt/usb' task :archive => [:package] do cp FileList["pkg/*.tgz", "pkg/*.zip", "pkg/*.gem"], ARCHIVEDIR end # Define an optional publish target in an external file. If the # publish.rf file is not found, the publish targets won't be defined. load "publish.rf" if File.exist? "publish.rf" # Support Tasks ------------------------------------------------------ desc "Look for TODO and FIXME tags in the code" task :todo do FileList['**/*.rb'].egrep /#.*(FIXME|TODO|TBD)/ end desc "Look for Debugging print lines" task :dbg do FileList['**/*.rb'].egrep /\bDBG|\bbreakpoint\b/ end desc "List all ruby files" task :rubyfiles do puts Dir['**/*.rb'].reject { |fn| fn =~ /^pkg/ } puts Dir['bin/*'].reject { |fn| fn =~ /CVS|(~$)|(\.rb$)/ } end # -------------------------------------------------------------------- # Creating a release desc "Make a new release" task :release => [ :prerelease, :clobber, :alltests, :update_version, :package, :tag] do announce announce "**************************************************************" announce "* Release #{PKG_VERSION} Complete." announce "* Packages ready to upload." announce "**************************************************************" announce end # Validate that everything is ready to go for a release. task :prerelease do announce announce "**************************************************************" announce "* Making RubyGem Release #{PKG_VERSION}" announce "* (current version #{CURRENT_VERSION})" announce "**************************************************************" announce # Is a release number supplied? unless ENV['REL'] fail "Usage: rake release REL=x.y.z [REUSE=tag_suffix]" end # Is the release different than the current release. # (or is REUSE set?) if PKG_VERSION == CURRENT_VERSION && ! ENV['REUSE'] fail "Current version is #{PKG_VERSION}, must specify REUSE=tag_suffix to reuse version" end # Are all source files checked in? if ENV['RELTEST'] announce "Release Task Testing, skipping checked-in file test" else announce "Checking for unchecked-in files..." data = `cvs -q update` unless data =~ /^$/ fail "CVS update is not clean ... do you have unchecked-in files?" end announce "No outstanding checkins found ... OK" end end task :update_version => [:prerelease] do if PKG_VERSION == CURRENT_VERSION announce "No version change ... skipping version update" else announce "Updating Rake version to #{PKG_VERSION}" open("lib/rake.rb") do |rakein| open("lib/rake.rb.new", "w") do |rakeout| rakein.each do |line| if line =~ /^RAKEVERSION\s*=\s*/ rakeout.puts "RAKEVERSION = '#{PKG_VERSION}'" else rakeout.puts line end end end end mv "lib/rake.rb.new", "lib/rake.rb" if ENV['RELTEST'] announce "Release Task Testing, skipping commiting of new version" else sh %{cvs commit -m "Updated to version #{PKG_VERSION}" lib/rake.rb} end end end desc "Tag all the CVS files with the latest release number (REL=x.y.z)" task :tag => [:prerelease] do reltag = "REL_#{PKG_VERSION.gsub(/\./, '_')}" reltag << ENV['REUSE'].gsub(/\./, '_') if ENV['REUSE'] announce "Tagging CVS with [#{reltag}]" if ENV['RELTEST'] announce "Release Task Testing, skipping CVS tagging" else sh %{cvs tag #{reltag}} end end # Require experimental XForge/Metaproject support. load 'xforge.rf' if File.exist?('xforge.rf')