| 1 | #!rake |
|---|
| 2 | # |
|---|
| 3 | # Darkfish-Rdoc rakefile |
|---|
| 4 | # |
|---|
| 5 | # Based on various other Rakefiles, especially one by Ben Bleything |
|---|
| 6 | # |
|---|
| 7 | # Copyright (c) 2008 The FaerieMUD Consortium |
|---|
| 8 | # |
|---|
| 9 | # Authors: |
|---|
| 10 | # * Michael Granger <ged@FaerieMUD.org> |
|---|
| 11 | # |
|---|
| 12 | |
|---|
| 13 | BEGIN { |
|---|
| 14 | require 'pathname' |
|---|
| 15 | basedir = Pathname.new( __FILE__ ).dirname |
|---|
| 16 | |
|---|
| 17 | libdir = basedir + "lib" |
|---|
| 18 | extdir = basedir + "ext" |
|---|
| 19 | |
|---|
| 20 | $LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s ) |
|---|
| 21 | $LOAD_PATH.unshift( extdir.to_s ) unless $LOAD_PATH.include?( extdir.to_s ) |
|---|
| 22 | } |
|---|
| 23 | |
|---|
| 24 | require 'rubygems' |
|---|
| 25 | gem 'rake', '>= 0.8.3' |
|---|
| 26 | |
|---|
| 27 | require 'rbconfig' |
|---|
| 28 | require 'rake' |
|---|
| 29 | require 'rake/rdoctask' |
|---|
| 30 | require 'rake/testtask' |
|---|
| 31 | require 'rake/packagetask' |
|---|
| 32 | require 'rake/clean' |
|---|
| 33 | |
|---|
| 34 | $dryrun = false |
|---|
| 35 | |
|---|
| 36 | ### Config constants |
|---|
| 37 | BASEDIR = Pathname.new( __FILE__ ).dirname.relative_path_from( Pathname.getwd ) |
|---|
| 38 | BINDIR = BASEDIR + 'bin' |
|---|
| 39 | LIBDIR = BASEDIR + 'lib' |
|---|
| 40 | EXTDIR = BASEDIR + 'ext' |
|---|
| 41 | DOCSDIR = BASEDIR + 'docs' |
|---|
| 42 | PKGDIR = BASEDIR + 'pkg' |
|---|
| 43 | DATADIR = BASEDIR + 'data' |
|---|
| 44 | |
|---|
| 45 | PROJECT_NAME = 'Darkfish-Rdoc' |
|---|
| 46 | PKG_NAME = PROJECT_NAME.downcase |
|---|
| 47 | PKG_SUMMARY = 'A pretty (different) Rdoc HTML generator' |
|---|
| 48 | |
|---|
| 49 | VERSION_FILE = LIBDIR + 'rdoc/generator/darkfish.rb' |
|---|
| 50 | if VERSION_FILE.exist? && buildrev = ENV['CC_BUILD_LABEL'] |
|---|
| 51 | PKG_VERSION = VERSION_FILE.read[ /VERSION\s*=\s*['"](\d+\.\d+\.\d+)['"]/, 1 ] + '.' + buildrev |
|---|
| 52 | elsif VERSION_FILE.exist? |
|---|
| 53 | PKG_VERSION = VERSION_FILE.read[ /VERSION\s*=\s*['"](\d+\.\d+\.\d+)['"]/, 1 ] |
|---|
| 54 | else |
|---|
| 55 | PKG_VERSION = '0.0.0' |
|---|
| 56 | end |
|---|
| 57 | |
|---|
| 58 | PKG_FILE_NAME = "#{PKG_NAME.downcase}-#{PKG_VERSION}" |
|---|
| 59 | GEM_FILE_NAME = "#{PKG_FILE_NAME}.gem" |
|---|
| 60 | |
|---|
| 61 | EXTCONF = EXTDIR + 'extconf.rb' |
|---|
| 62 | |
|---|
| 63 | ARTIFACTS_DIR = Pathname.new( ENV['CC_BUILD_ARTIFACTS'] || 'artifacts' ) |
|---|
| 64 | |
|---|
| 65 | TEXT_FILES = %w( Rakefile ChangeLog README LICENSE ).collect {|filename| BASEDIR + filename } |
|---|
| 66 | BIN_FILES = Pathname.glob( BINDIR + '*' ).delete_if {|item| item =~ /\.svn/ } |
|---|
| 67 | LIB_FILES = Pathname.glob( LIBDIR + '**/*.rb' ).delete_if {|item| item =~ /\.svn/ } |
|---|
| 68 | EXT_FILES = Pathname.glob( EXTDIR + '**/*.{c,h,rb}' ).delete_if {|item| item =~ /\.svn/ } |
|---|
| 69 | DATA_FILES = Pathname.glob( DATADIR + '**/*' ).delete_if {|item| item =~ /\.svn/ } |
|---|
| 70 | |
|---|
| 71 | SPECDIR = BASEDIR + 'spec' |
|---|
| 72 | SPECLIBDIR = SPECDIR + 'lib' |
|---|
| 73 | SPEC_FILES = Pathname.glob( SPECDIR + '**/*_spec.rb' ).delete_if {|item| item =~ /\.svn/ } + |
|---|
| 74 | Pathname.glob( SPECLIBDIR + '**/*.rb' ).delete_if {|item| item =~ /\.svn/ } |
|---|
| 75 | |
|---|
| 76 | TESTDIR = BASEDIR + 'tests' |
|---|
| 77 | TEST_FILES = Pathname.glob( TESTDIR + '**/*.tests.rb' ).delete_if {|item| item =~ /\.svn/ } |
|---|
| 78 | |
|---|
| 79 | RAKE_TASKDIR = BASEDIR + 'rake' |
|---|
| 80 | RAKE_TASKLIBS = Pathname.glob( RAKE_TASKDIR + '*.rb' ) |
|---|
| 81 | |
|---|
| 82 | LOCAL_RAKEFILE = BASEDIR + 'Rakefile.local' |
|---|
| 83 | |
|---|
| 84 | EXTRA_PKGFILES = [] |
|---|
| 85 | EXTRA_PKGFILES.concat Pathname.glob( BASEDIR + 'lib/rdoc/generator/**/*.{css,rhtml,png,js}' ).delete_if {|item| item =~ /\.svn/ } |
|---|
| 86 | |
|---|
| 87 | RELEASE_FILES = TEXT_FILES + |
|---|
| 88 | SPEC_FILES + |
|---|
| 89 | TEST_FILES + |
|---|
| 90 | BIN_FILES + |
|---|
| 91 | LIB_FILES + |
|---|
| 92 | EXT_FILES + |
|---|
| 93 | DATA_FILES + |
|---|
| 94 | RAKE_TASKLIBS + |
|---|
| 95 | EXTRA_PKGFILES |
|---|
| 96 | |
|---|
| 97 | RELEASE_FILES << LOCAL_RAKEFILE if LOCAL_RAKEFILE.exist? |
|---|
| 98 | |
|---|
| 99 | COVERAGE_MINIMUM = ENV['COVERAGE_MINIMUM'] ? Float( ENV['COVERAGE_MINIMUM'] ) : 85.0 |
|---|
| 100 | RCOV_EXCLUDES = 'spec,tests,/Library/Ruby,/var/lib,/usr/local/lib' |
|---|
| 101 | RCOV_OPTS = [ |
|---|
| 102 | '--exclude', RCOV_EXCLUDES, |
|---|
| 103 | '--xrefs', |
|---|
| 104 | '--save', |
|---|
| 105 | '--callsites', |
|---|
| 106 | #'--aggregate', 'coverage.data' # <- doesn't work as of 0.8.1.2.0 |
|---|
| 107 | ] |
|---|
| 108 | |
|---|
| 109 | |
|---|
| 110 | # Subversion constants -- directory names for releases and tags |
|---|
| 111 | SVN_TRUNK_DIR = 'trunk' |
|---|
| 112 | SVN_RELEASES_DIR = 'releases' |
|---|
| 113 | SVN_BRANCHES_DIR = 'branches' |
|---|
| 114 | SVN_TAGS_DIR = 'tags' |
|---|
| 115 | |
|---|
| 116 | SVN_DOTDIR = BASEDIR + '.svn' |
|---|
| 117 | SVN_ENTRIES = SVN_DOTDIR + 'entries' |
|---|
| 118 | |
|---|
| 119 | |
|---|
| 120 | ### Load some task libraries that need to be loaded early |
|---|
| 121 | require RAKE_TASKDIR + 'helpers.rb' |
|---|
| 122 | require RAKE_TASKDIR + 'svn.rb' |
|---|
| 123 | require RAKE_TASKDIR + 'verifytask.rb' |
|---|
| 124 | |
|---|
| 125 | # Define some constants that depend on the 'svn' tasklib |
|---|
| 126 | PKG_BUILD = get_svn_rev( BASEDIR ) || 0 |
|---|
| 127 | SNAPSHOT_PKG_NAME = "#{PKG_FILE_NAME}.#{PKG_BUILD}" |
|---|
| 128 | SNAPSHOT_GEM_NAME = "#{SNAPSHOT_PKG_NAME}.gem" |
|---|
| 129 | |
|---|
| 130 | # Documentation constants |
|---|
| 131 | RDOCDIR = DOCSDIR + 'api' |
|---|
| 132 | RDOC_OPTIONS = [ |
|---|
| 133 | '-w', '4', |
|---|
| 134 | '-SHN', |
|---|
| 135 | '-i', '.', |
|---|
| 136 | '-m', 'README', |
|---|
| 137 | '-W', 'http://deveiate.org/projects/Darkfish-Rdoc//browser/trunk/' |
|---|
| 138 | ] |
|---|
| 139 | |
|---|
| 140 | # Release constants |
|---|
| 141 | SMTP_HOST = 'mail.faeriemud.org' |
|---|
| 142 | SMTP_PORT = 465 # SMTP + SSL |
|---|
| 143 | |
|---|
| 144 | # Project constants |
|---|
| 145 | PROJECT_HOST = 'deveiate' |
|---|
| 146 | PROJECT_PUBDIR = '/usr/local/www/public/code' |
|---|
| 147 | PROJECT_DOCDIR = "#{PROJECT_PUBDIR}/#{PKG_NAME}" |
|---|
| 148 | PROJECT_SCPPUBURL = "#{PROJECT_HOST}:#{PROJECT_PUBDIR}" |
|---|
| 149 | PROJECT_SCPDOCURL = "#{PROJECT_HOST}:#{PROJECT_DOCDIR}" |
|---|
| 150 | |
|---|
| 151 | # Rubyforge stuff |
|---|
| 152 | RUBYFORGE_GROUP = 'deveiate' |
|---|
| 153 | RUBYFORGE_PROJECT = 'darkfish-rdoc' |
|---|
| 154 | |
|---|
| 155 | # Gem dependencies: gemname => version |
|---|
| 156 | DEPENDENCIES = { |
|---|
| 157 | 'rdoc' => '>= 2.2.2', |
|---|
| 158 | } |
|---|
| 159 | |
|---|
| 160 | # Developer Gem dependencies: gemname => version |
|---|
| 161 | DEVELOPMENT_DEPENDENCIES = { |
|---|
| 162 | 'amatch' => '>= 0.2.3', |
|---|
| 163 | 'rake' => '>= 0.8.1', |
|---|
| 164 | 'rcodetools' => '>= 0.7.0.0', |
|---|
| 165 | 'rcov' => '>= 0', |
|---|
| 166 | 'RedCloth' => '>= 4.0.3', |
|---|
| 167 | 'rspec' => '>= 0', |
|---|
| 168 | 'rubyforge' => '>= 0', |
|---|
| 169 | 'termios' => '>= 0', |
|---|
| 170 | 'text-format' => '>= 1.0.0', |
|---|
| 171 | 'tmail' => '>= 1.2.3.1', |
|---|
| 172 | 'ultraviolet' => '>= 0.10.2', |
|---|
| 173 | 'libxml-ruby' => '>= 0.8.3', |
|---|
| 174 | } |
|---|
| 175 | |
|---|
| 176 | # Non-gem requirements: packagename => version |
|---|
| 177 | REQUIREMENTS = { |
|---|
| 178 | } |
|---|
| 179 | |
|---|
| 180 | # RubyGem specification |
|---|
| 181 | GEMSPEC = Gem::Specification.new do |gem| |
|---|
| 182 | gem.name = PKG_NAME.downcase |
|---|
| 183 | gem.version = PKG_VERSION |
|---|
| 184 | |
|---|
| 185 | gem.summary = PKG_SUMMARY |
|---|
| 186 | gem.description = <<-EOD |
|---|
| 187 | A complete replacement for the default HTML generator for Rdoc, the |
|---|
| 188 | API documentation-extraction system for Ruby. |
|---|
| 189 | EOD |
|---|
| 190 | gem.post_install_message = <<-EOD |
|---|
| 191 | To use the Darkfish formatter, just add '-f darkfish' to your rdoc command of choice. |
|---|
| 192 | EOD |
|---|
| 193 | |
|---|
| 194 | gem.authors = 'Michael Granger' |
|---|
| 195 | gem.email = 'ged@FaerieMUD.org' |
|---|
| 196 | gem.homepage = 'http://deveiate.org/projects/Darkfish-Rdoc/' |
|---|
| 197 | gem.rubyforge_project = RUBYFORGE_PROJECT |
|---|
| 198 | |
|---|
| 199 | gem.has_rdoc = true |
|---|
| 200 | gem.rdoc_options = RDOC_OPTIONS |
|---|
| 201 | gem.extra_rdoc_files = %w[ChangeLog README LICENSE] |
|---|
| 202 | |
|---|
| 203 | gem.bindir = BINDIR.relative_path_from(BASEDIR).to_s |
|---|
| 204 | gem.executables = BIN_FILES.select {|pn| pn.executable? }. |
|---|
| 205 | collect {|pn| pn.relative_path_from(BINDIR).to_s } |
|---|
| 206 | |
|---|
| 207 | if EXTCONF.exist? |
|---|
| 208 | gem.extensions << EXTCONF.relative_path_from( BASEDIR ).to_s |
|---|
| 209 | end |
|---|
| 210 | |
|---|
| 211 | gem.files = RELEASE_FILES. |
|---|
| 212 | collect {|f| f.relative_path_from(BASEDIR).to_s } |
|---|
| 213 | gem.test_files = SPEC_FILES. |
|---|
| 214 | collect {|f| f.relative_path_from(BASEDIR).to_s } |
|---|
| 215 | |
|---|
| 216 | DEPENDENCIES.each do |name, version| |
|---|
| 217 | version = '>= 0' if version.length.zero? |
|---|
| 218 | gem.add_runtime_dependency( name, version ) |
|---|
| 219 | end |
|---|
| 220 | |
|---|
| 221 | # Developmental dependencies don't work as of RubyGems 1.2.0 |
|---|
| 222 | unless Gem::Version.new( Gem::RubyGemsVersion ) <= Gem::Version.new( "1.2.0" ) |
|---|
| 223 | DEVELOPMENT_DEPENDENCIES.each do |name, version| |
|---|
| 224 | version = '>= 0' if version.length.zero? |
|---|
| 225 | gem.add_development_dependency( name, version ) |
|---|
| 226 | end |
|---|
| 227 | end |
|---|
| 228 | |
|---|
| 229 | REQUIREMENTS.each do |name, version| |
|---|
| 230 | gem.requirements << [ name, version ].compact.join(' ') |
|---|
| 231 | end |
|---|
| 232 | end |
|---|
| 233 | |
|---|
| 234 | # Manual-generation config |
|---|
| 235 | MANUALDIR = DOCSDIR + 'manual' |
|---|
| 236 | |
|---|
| 237 | $trace = Rake.application.options.trace ? true : false |
|---|
| 238 | $dryrun = Rake.application.options.dryrun ? true : false |
|---|
| 239 | |
|---|
| 240 | |
|---|
| 241 | # Load any remaining task libraries |
|---|
| 242 | RAKE_TASKLIBS.each do |tasklib| |
|---|
| 243 | next if tasklib =~ %r{/(helpers|svn|verifytask)\.rb$} |
|---|
| 244 | begin |
|---|
| 245 | require tasklib |
|---|
| 246 | rescue ScriptError => err |
|---|
| 247 | fail "Task library '%s' failed to load: %s: %s" % |
|---|
| 248 | [ tasklib, err.class.name, err.message ] |
|---|
| 249 | trace "Backtrace: \n " + err.backtrace.join( "\n " ) |
|---|
| 250 | rescue => err |
|---|
| 251 | log "Task library '%s' failed to load: %s: %s. Some tasks may not be available." % |
|---|
| 252 | [ tasklib, err.class.name, err.message ] |
|---|
| 253 | trace "Backtrace: \n " + err.backtrace.join( "\n " ) |
|---|
| 254 | end |
|---|
| 255 | end |
|---|
| 256 | |
|---|
| 257 | # Load any project-specific rules defined in 'Rakefile.local' if it exists |
|---|
| 258 | import LOCAL_RAKEFILE if LOCAL_RAKEFILE.exist? |
|---|
| 259 | |
|---|
| 260 | |
|---|
| 261 | ##################################################################### |
|---|
| 262 | ### T A S K S |
|---|
| 263 | ##################################################################### |
|---|
| 264 | |
|---|
| 265 | ### Default task |
|---|
| 266 | task :default => [:clean, :local, :spec, :rdoc, :package] |
|---|
| 267 | |
|---|
| 268 | ### Task the local Rakefile can append to -- no-op by default |
|---|
| 269 | task :local |
|---|
| 270 | |
|---|
| 271 | |
|---|
| 272 | ### Task: clean |
|---|
| 273 | CLEAN.include 'coverage' |
|---|
| 274 | CLOBBER.include 'artifacts', 'coverage.info', PKGDIR |
|---|
| 275 | |
|---|
| 276 | # Target to hinge on ChangeLog updates |
|---|
| 277 | file SVN_ENTRIES |
|---|
| 278 | |
|---|
| 279 | ### Task: changelog |
|---|
| 280 | file 'ChangeLog' => SVN_ENTRIES.to_s do |task| |
|---|
| 281 | log "Updating #{task.name}" |
|---|
| 282 | |
|---|
| 283 | changelog = make_svn_changelog() |
|---|
| 284 | File.open( task.name, 'w' ) do |fh| |
|---|
| 285 | fh.print( changelog ) |
|---|
| 286 | end |
|---|
| 287 | end |
|---|
| 288 | |
|---|
| 289 | |
|---|
| 290 | ### Task: cruise (Cruisecontrol task) |
|---|
| 291 | desc "Cruisecontrol build" |
|---|
| 292 | task :cruise => [:clean, 'spec:quiet', :package] do |task| |
|---|
| 293 | raise "Artifacts dir not set." if ARTIFACTS_DIR.to_s.empty? |
|---|
| 294 | artifact_dir = ARTIFACTS_DIR.cleanpath + ENV['CC_BUILD_LABEL'] |
|---|
| 295 | artifact_dir.mkpath |
|---|
| 296 | |
|---|
| 297 | coverage = BASEDIR + 'coverage' |
|---|
| 298 | if coverage.exist? && coverage.directory? |
|---|
| 299 | $stderr.puts "Copying coverage stats..." |
|---|
| 300 | FileUtils.cp_r( 'coverage', artifact_dir ) |
|---|
| 301 | end |
|---|
| 302 | |
|---|
| 303 | $stderr.puts "Copying packages..." |
|---|
| 304 | FileUtils.cp_r( FileList['pkg/*'].to_a, artifact_dir ) |
|---|
| 305 | end |
|---|
| 306 | |
|---|
| 307 | |
|---|
| 308 | desc "Update the build system to the latest version" |
|---|
| 309 | task :update_build do |
|---|
| 310 | log "Updating the build system" |
|---|
| 311 | sh 'svn', 'up', RAKE_TASKDIR |
|---|
| 312 | log "Updating the Rakefile" |
|---|
| 313 | sh 'rake', '-f', RAKE_TASKDIR + 'Metarakefile' |
|---|
| 314 | end |
|---|