| 30 | | require 'pathname' |
| 31 | | |
| 32 | | begin |
| 33 | | require 'fm' |
| 34 | | rescue LoadError => err |
| 35 | | $stderr.puts "FaerieMUD class library didn't load cleanly: #{err.message}" |
| 36 | | end |
| 37 | | |
| 38 | | include Config |
| 39 | | |
| 40 | | |
| 41 | | PKG_NAME = 'faeriemud' |
| 42 | | PKG_VERSION = FaerieMUD::VERSION |
| 43 | | PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" |
| 44 | | |
| 45 | | PKG_SUMMARY = "FaerieMUD - A multi-user online role-playing game" |
| 46 | | |
| 47 | | PKG_DESCRIPTION = <<-EOD |
| 48 | | FaerieMUD is a not-for-profit effort to create a new multi-user online |
| 49 | | role-playing game, one with a high degree of immersiveness and believability, |
| 50 | | depth of character, and above all, an emphasis on Story. |
| 51 | | EOD |
| 52 | | |
| 53 | | RELEASE_NAME = "REL #{PKG_VERSION}" |
| 54 | | |
| 55 | | BASEDIR = Pathname.new( __FILE__ ).dirname |
| 56 | | DOCSDIR = BASEDIR + 'docs' |
| 57 | | MANUALDIR = DOCSDIR + 'manual' |
| 58 | | APIDOCSDIR = DOCSDIR + 'api' |
| | 28 | require 'rake/rdoctask' |
| | 29 | require 'rake/testtask' |
| | 30 | require 'rake/packagetask' |
| | 31 | require 'rake/clean' |
| | 32 | |
| | 33 | $dryrun = false |
| | 34 | |
| | 35 | ### Config constants |
| | 36 | BASEDIR = Pathname.new( __FILE__ ).dirname.relative_path_from( Pathname.getwd ) |
| | 37 | BINDIR = BASEDIR + 'bin' |
| | 38 | LIBDIR = BASEDIR + 'lib' |
| | 39 | EXTDIR = BASEDIR + 'ext' |
| | 40 | DOCSDIR = BASEDIR + 'docs' |
| | 41 | PKGDIR = BASEDIR + 'pkg' |
| | 42 | |
| | 43 | PROJECT_NAME = 'FaerieMUD' |
| | 44 | PKG_NAME = PROJECT_NAME.downcase |
| | 45 | PKG_SUMMARY = 'An online multiplayer roleplaying game' |
| | 46 | VERSION_FILE = LIBDIR + 'fm.rb' |
| | 47 | PKG_VERSION = VERSION_FILE.read[ /VERSION = '(\d+\.\d+\.\d+)'/, 1 ] |
| | 48 | PKG_FILE_NAME = "#{PKG_NAME.downcase}-#{PKG_VERSION}" |
| | 49 | GEM_FILE_NAME = "#{PKG_FILE_NAME}.gem" |
| | 50 | |
| | 51 | ARTIFACTS_DIR = Pathname.new( ENV['CC_BUILD_ARTIFACTS'] || 'artifacts' ) |
| | 52 | |
| | 53 | TEXT_FILES = %w( Rakefile ChangeLog README LICENSE ).collect {|filename| BASEDIR + filename } |
| | 54 | BIN_FILES = Pathname.glob( BINDIR + '*' ).delete_if {|item| item =~ /\.svn/ } |
| | 55 | LIB_FILES = Pathname.glob( LIBDIR + '**/*.rb' ).delete_if {|item| item =~ /\.svn/ } |
| | 56 | EXT_FILES = Pathname.glob( EXTDIR + '**/*.{c,h,rb}' ).delete_if {|item| item =~ /\.svn/ } |
| 61 | | SPEC_FILES = Pathname.glob( SPECDIR + '**/*_spec.rb' ). |
| 62 | | delete_if {|item| item =~ /\.svn/ } |
| 63 | | SPEC_EXCLUDES = 'spec,monkeypatches,/Library/Ruby,/var/lib,/usr/local/lib' |
| 64 | | |
| 65 | | LIBDIR = BASEDIR + 'lib' |
| 66 | | LIB_FILES = Pathname.glob( LIBDIR + '**/*.rb' ) . |
| 67 | | delete_if {|item| item =~ /\.svn/ } |
| 68 | | |
| 69 | | TEXT_FILES = %w( Rakefile README ) |
| 70 | | |
| 71 | | RELEASE_FILES = TEXT_FILES + LIB_FILES + SPEC_FILES |
| 72 | | |
| 73 | | GEMSPEC = Gem::Specification.new do |gem| |
| 74 | | gem.name = PKG_NAME |
| 75 | | gem.version = PKG_VERSION |
| 76 | | |
| 77 | | gem.summary = PKG_SUMMARY |
| 78 | | gem.description = PKG_DESCRIPTION |
| 79 | | |
| 80 | | gem.authors = "Michael Granger, Martin Chase, Dave McCorkhill, Jeremiah Jordan" |
| 81 | | gem.email = "ged@FaerieMUD.org" |
| 82 | | gem.homepage = "http://www.FaerieMUD.org/" |
| 83 | | |
| 84 | | gem.has_rdoc = true |
| 85 | | |
| 86 | | gem.files = RELEASE_FILES |
| 87 | | gem.test_files = SPEC_FILES |
| 88 | | |
| 89 | | gem.add_dependency( 'Linguistics', '>= 1.0.6' ) |
| 90 | | gem.add_dependency( 'Ruby-LinkParser', '>= 1.0.0' ) |
| 91 | | gem.add_dependency( 'Ruby-WordNet', '>= 0.0.3' ) |
| 92 | | gem.add_dependency( 'PluginFactory', '>= 1.0.2' ) |
| 93 | | end |
| 94 | | |
| 95 | | |
| 96 | | |
| 97 | | # Load task plugins |
| 98 | | RAKE_TASKDIR = BASEDIR + 'rake' |
| | 59 | SPECLIBDIR = SPECDIR + 'lib' |
| | 60 | SPEC_FILES = Pathname.glob( SPECDIR + '**/*_spec.rb' ).delete_if {|item| item =~ /\.svn/ } + |
| | 61 | Pathname.glob( SPECLIBDIR + '**/*.rb' ).delete_if {|item| item =~ /\.svn/ } |
| | 62 | |
| | 63 | TESTDIR = BASEDIR + 'tests' |
| | 64 | TEST_FILES = Pathname.glob( TESTDIR + '**/*.tests.rb' ).delete_if {|item| item =~ /\.svn/ } |
| | 65 | |
| | 66 | RAKE_TASKDIR = BASEDIR + 'rake' |
| | 67 | RAKE_TASKLIBS = Pathname.glob( RAKE_TASKDIR + '*.rb' ) |
| | 68 | |
| | 69 | LOCAL_RAKEFILE = BASEDIR + 'Rakefile.local' |
| | 70 | |
| | 71 | EXTRA_PKGFILES = [] |
| | 72 | |
| | 73 | RELEASE_FILES = TEXT_FILES + |
| | 74 | SPEC_FILES + |
| | 75 | TEST_FILES + |
| | 76 | BIN_FILES + |
| | 77 | LIB_FILES + |
| | 78 | EXT_FILES + |
| | 79 | RAKE_TASKLIBS + |
| | 80 | EXTRA_PKGFILES |
| | 81 | |
| | 82 | RELEASE_FILES << LOCAL_RAKEFILE if LOCAL_RAKEFILE.exist? |
| | 83 | |
| | 84 | COVERAGE_MINIMUM = ENV['COVERAGE_MINIMUM'] ? Float( ENV['COVERAGE_MINIMUM'] ) : 85.0 |
| | 85 | RCOV_EXCLUDES = 'spec,tests,/Library/Ruby,/var/lib,/usr/local/lib' |
| | 86 | RCOV_OPTS = [ |
| | 87 | '--exclude', RCOV_EXCLUDES, |
| | 88 | '--xrefs', |
| | 89 | '--save', |
| | 90 | '--callsites', |
| | 91 | #'--aggregate', 'coverage.data' # <- doesn't work as of 0.8.1.2.0 |
| | 92 | ] |
| | 93 | |
| | 94 | |
| | 95 | # Subversion constants -- directory names for releases and tags |
| | 96 | SVN_TRUNK_DIR = 'trunk' |
| | 97 | SVN_RELEASES_DIR = 'releases' |
| | 98 | SVN_BRANCHES_DIR = 'branches' |
| | 99 | SVN_TAGS_DIR = 'tags' |
| | 100 | |
| | 101 | SVN_DOTDIR = BASEDIR + '.svn' |
| | 102 | SVN_ENTRIES = SVN_DOTDIR + 'entries' |
| | 103 | |
| | 104 | |
| | 105 | ### Load some task libraries that need to be loaded early |
| | 106 | require RAKE_TASKDIR + 'helpers.rb' |
| 101 | | Pathname.glob( RAKE_TASKDIR + '*.rb' ).each do |tasklib| |
| | 109 | |
| | 110 | # Define some constants that depend on the 'svn' tasklib |
| | 111 | PKG_BUILD = get_svn_rev( BASEDIR ) || 0 |
| | 112 | SNAPSHOT_PKG_NAME = "#{PKG_FILE_NAME}.#{PKG_BUILD}" |
| | 113 | SNAPSHOT_GEM_NAME = "#{SNAPSHOT_PKG_NAME}.gem" |
| | 114 | |
| | 115 | # Documentation constants |
| | 116 | RDOCDIR = DOCSDIR + 'api' |
| | 117 | RDOC_OPTIONS = [ |
| | 118 | '-w', '4', |
| | 119 | '-SHN', |
| | 120 | '-i', '.', |
| | 121 | '-m', 'README', |
| | 122 | '-W', 'http://trac.FaerieMUD.org//browser/trunk/' |
| | 123 | ] |
| | 124 | |
| | 125 | # Release constants |
| | 126 | SMTP_HOST = 'mail.faeriemud.org' |
| | 127 | SMTP_PORT = 465 # SMTP + SSL |
| | 128 | |
| | 129 | # Project constants |
| | 130 | PROJECT_HOST = 'deveiate.org' |
| | 131 | PROJECT_PUBDIR = "/usr/local/www/public/code" |
| | 132 | PROJECT_DOCDIR = "#{PROJECT_PUBDIR}/#{PKG_NAME}" |
| | 133 | PROJECT_SCPPUBURL = "#{PROJECT_HOST}:#{PROJECT_PUBDIR}" |
| | 134 | PROJECT_SCPDOCURL = "#{PROJECT_HOST}:#{PROJECT_DOCDIR}" |
| | 135 | |
| | 136 | # Rubyforge stuff |
| | 137 | RUBYFORGE_GROUP = 'deveiate' |
| | 138 | RUBYFORGE_PROJECT = 'faeriemud' |
| | 139 | |
| | 140 | # Gem dependencies: gemname => version |
| | 141 | DEPENDENCIES = { |
| | 142 | 'wordnet' => '>= 0.0.5', |
| | 143 | 'linguistics' => '>= 1.0.6', |
| | 144 | 'linkparser' => '>= 1.0.2', |
| | 145 | } |
| | 146 | |
| | 147 | # Developer Gem dependencies: gemname => version |
| | 148 | DEVELOPMENT_DEPENDENCIES = { |
| | 149 | 'amatch' => '>= 0.2.3', |
| | 150 | 'rake' => '>= 0.8.1', |
| | 151 | 'rcodetools' => '>= 0.7.0.0', |
| | 152 | 'rcov' => '>= 0', |
| | 153 | 'RedCloth' => '>= 4.0.3', |
| | 154 | 'rspec' => '>= 0', |
| | 155 | 'rubyforge' => '>= 0', |
| | 156 | 'termios' => '>= 0', |
| | 157 | 'text-format' => '>= 1.0.0', |
| | 158 | 'tmail' => '>= 1.2.3.1', |
| | 159 | 'ultraviolet' => '>= 0.10.2', |
| | 160 | 'libxml-ruby' => '>= 0.8.3', |
| | 161 | 'rspec' => '>= 1.1.4', |
| | 162 | 'rake' => '0.8.1', |
| | 163 | 'rcov' => '>= 0.8.1.2.0', |
| | 164 | } |
| | 165 | |
| | 166 | # Non-gem requirements: packagename => version |
| | 167 | REQUIREMENTS = { |
| | 168 | } |
| | 169 | |
| | 170 | # RubyGem specification |
| | 171 | GEMSPEC = Gem::Specification.new do |gem| |
| | 172 | gem.name = PKG_NAME.downcase |
| | 173 | gem.version = PKG_VERSION |
| | 174 | |
| | 175 | gem.summary = PKG_SUMMARY |
| | 176 | gem.description = <<-EOD |
| | 177 | a new multi-user online role-playing game, one with a high degree of immersiveness and believability, depth of character, and, above all, an emphasis on Story. |
| | 178 | EOD |
| | 179 | |
| | 180 | gem.authors = 'Michael Granger' |
| | 181 | gem.email = 'ged@FaerieMUD.org' |
| | 182 | gem.homepage = 'http://trac.FaerieMUD.org/' |
| | 183 | gem.rubyforge_project = RUBYFORGE_PROJECT |
| | 184 | |
| | 185 | gem.has_rdoc = true |
| | 186 | gem.rdoc_options = RDOC_OPTIONS |
| | 187 | |
| | 188 | gem.bindir = BINDIR.relative_path_from(BASEDIR).to_s |
| | 189 | |
| | 190 | |
| | 191 | gem.files = RELEASE_FILES. |
| | 192 | collect {|f| f.relative_path_from(BASEDIR).to_s } |
| | 193 | gem.test_files = SPEC_FILES. |
| | 194 | collect {|f| f.relative_path_from(BASEDIR).to_s } |
| | 195 | |
| | 196 | DEPENDENCIES.each do |name, version| |
| | 197 | version = '>= 0' if version.length.zero? |
| | 198 | gem.add_runtime_dependency( name, version ) |
| | 199 | end |
| | 200 | |
| | 201 | DEVELOPMENT_DEPENDENCIES.each do |name, version| |
| | 202 | version = '>= 0' if version.length.zero? |
| | 203 | gem.add_development_dependency( name, version ) |
| | 204 | end |
| | 205 | |
| | 206 | REQUIREMENTS.each do |name, version| |
| | 207 | gem.requirements << [ name, version ].compact.join(' ') |
| | 208 | end |
| | 209 | end |
| | 210 | |
| | 211 | # Manual-generation config |
| | 212 | MANUALDIR = DOCSDIR + 'manual' |
| | 213 | |
| | 214 | $trace = Rake.application.options.trace ? true : false |
| | 215 | $dryrun = Rake.application.options.dryrun ? true : false |
| | 216 | |
| | 217 | |
| | 218 | # Load any remaining task libraries |
| | 219 | RAKE_TASKLIBS.each do |tasklib| |
| | 220 | next if tasklib =~ %r{/(helpers|svn|verifytask)\.rb$} |
| 139 | | desc "Clean pkg, coverage, and rdoc; remove .bak files" |
| 140 | | task :clean => [ :clobber_rdoc, :clobber_manual, :clobber_package, 'coverage:clobber' ] do |
| 141 | | files = FileList['**/*{.bak,~}'] |
| 142 | | files.clear_exclude |
| 143 | | rm( files, :verbose => true ) unless files.empty? |
| 144 | | end |
| 145 | | |
| 146 | | |
| 147 | | ### Task: rdoc |
| 148 | | begin |
| 149 | | gem 'darkfish-rdoc' |
| 150 | | require 'rake/rdoctask' |
| 151 | | |
| 152 | | Rake::RDocTask.new do |rdoc| |
| 153 | | rdoc.rdoc_dir = APIDOCSDIR.to_s |
| 154 | | rdoc.title = "FaerieMUD #{PKG_VERSION}" |
| 155 | | |
| 156 | | rdoc.options += [ |
| 157 | | '-w', '4', |
| 158 | | '-SHN', |
| 159 | | '-i', 'docs', |
| 160 | | '-f', 'darkfish', |
| 161 | | '-m', 'README', |
| 162 | | '-W', 'http://www.FaerieMUD.org/browser/trunk' |
| 163 | | ] |
| 164 | | |
| 165 | | rdoc.rdoc_files.include 'README' |
| 166 | | rdoc.rdoc_files.include LIB_FILES. |
| 167 | | collect {|file| file.relative_path_from(BASEDIR).to_s } |
| 168 | | end |
| 169 | | |
| 170 | | rescue LoadError => err |
| 171 | | task :no_rdoc do |
| 172 | | $stderr.puts "API documentation tasks not defined: %s" % [ err.message ] |
| 173 | | end |
| 174 | | |
| 175 | | task :rdoc => :no_rdoc |
| 176 | | end |
| 177 | | |
| 178 | | |
| 179 | | ### Task: manual |
| 180 | | Manual::GenTask.new( :manual ) do |manual| |
| 181 | | manual.metadata.version = PKG_VERSION |
| 182 | | manual.metadata.gemspec = GEMSPEC |
| 183 | | manual.base_dir = MANUALDIR |
| 184 | | manual.output_dir = 'output' |
| 185 | | end |
| 186 | | task :manual => [ :rdoc ] do |
| 187 | | log "Copying API docs into the manual output" |
| 188 | | |
| 189 | | apidocs = FileList[ APIDOCSDIR + '**/*' ] |
| 190 | | copydocs = apidocs.pathmap( '%{^docs/}p' ) |
| 191 | | end |
| 192 | | |
| 193 | | |
| 194 | | ### Task: install |
| 195 | | desc "Install FaerieMUD as a conventional library" |
| 196 | | task :install do |
| 197 | | log "Installing FaerieMUD as a convention library" |
| 198 | | sitelib = Pathname.new( CONFIG['sitelibdir'] ) |
| 199 | | Dir.chdir( LIBDIR ) do |
| 200 | | LIB_FILES.each do |libfile| |
| 201 | | relpath = libfile.relative_path_from( LIBDIR ) |
| 202 | | target = sitelib + relpath |
| 203 | | FileUtils.mkpath target.dirname, |
| 204 | | :mode => 0755, :verbose => true, :noop => $dryrun unless target.dirname.directory? |
| 205 | | FileUtils.install relpath, target, |
| 206 | | :mode => 0644, :verbose => true, :noop => $dryrun |
| 207 | | end |
| 208 | | end |
| 209 | | end |
| 210 | | |
| 211 | | ### Task: install_gem |
| 212 | | desc "Install FaerieMUD as a gem" |
| 213 | | task :install_gem => [:package] do |
| 214 | | installer = Gem::Installer.new( %{pkg/#{PKG_FILE_NAME}.gem} ) |
| 215 | | installer.install |
| 216 | | end |
| 217 | | |
| 218 | | ### Task: uninstall |
| 219 | | desc "Uninstall FaerieMUD if it's been installed as a conventional library" |
| 220 | | task :uninstall do |
| 221 | | log "Uninstalling conventionally-installed FaerieMUD library files" |
| 222 | | sitelib = Pathname.new( CONFIG['sitelibdir'] ) |
| 223 | | dir = sitelib + 'fm' |
| 224 | | FileUtils.rm_rf( dir, :verbose => true, :noop => $dryrun ) |
| 225 | | lib = sitelib + 'fm.rb' |
| 226 | | FileUtils.rm( lib, :verbose => true, :noop => $dryrun ) |
| 227 | | end |
| 228 | | |
| 229 | | ### Task: uninstall_gem |
| 230 | | task :uninstall_gem => [:clean] do |
| 231 | | uninstaller = Gem::Uninstaller.new( PKG_FILE_NAME ) |
| 232 | | uninstaller.uninstall |
| 233 | | end |
| 234 | | |
| 235 | | |
| | 250 | CLEAN.include 'coverage' |
| | 251 | CLOBBER.include 'artifacts', 'coverage.info', PKGDIR |
| | 252 | |
| | 253 | # Target to hinge on ChangeLog updates |
| | 254 | file SVN_ENTRIES |
| | 255 | |
| | 256 | ### Task: changelog |
| | 257 | file 'ChangeLog' => SVN_ENTRIES.to_s do |task| |
| | 258 | log "Updating #{task.name}" |
| | 259 | |
| | 260 | changelog = make_svn_changelog() |
| | 261 | File.open( task.name, 'w' ) do |fh| |
| | 262 | fh.print( changelog ) |
| | 263 | end |
| | 264 | end |
| | 265 | |
| | 266 | |
| | 267 | ### Task: cruise (Cruisecontrol task) |
| | 268 | desc "Cruisecontrol build" |
| | 269 | task :cruise => [:clean, :spec, :package] do |task| |
| | 270 | raise "Artifacts dir not set." if ARTIFACTS_DIR.to_s.empty? |
| | 271 | artifact_dir = ARTIFACTS_DIR.cleanpath |
| | 272 | artifact_dir.mkpath |
| | 273 | |
| | 274 | coverage = BASEDIR + 'coverage' |
| | 275 | if coverage.exist? && coverage.directory? |
| | 276 | $stderr.puts "Copying coverage stats..." |
| | 277 | FileUtils.cp_r( 'coverage', artifact_dir ) |
| | 278 | end |
| | 279 | |
| | 280 | $stderr.puts "Copying packages..." |
| | 281 | FileUtils.cp_r( FileList['pkg/*'].to_a, artifact_dir ) |
| | 282 | end |
| | 283 | |
| | 284 | |
| | 285 | desc "Update the build system to the latest version" |
| | 286 | task :update_build do |
| | 287 | log "Updating the build system" |
| | 288 | sh 'svn', 'up', RAKE_TASKDIR |
| | 289 | log "Updating the Rakefile" |
| | 290 | sh 'rake', '-f', RAKE_TASKDIR + 'Metarakefile' |
| | 291 | end |
| | 292 | |