# Rake doc: http://rake.rubyforge.org/files/doc/rakefile_rdoc.html
require 'rake'
require 'net/ftp'
require 'net/http'
require 'uri'
include Rake

ENV["RUBYOPT"] = nil
EXTENSION = "RubySFML"
RUBY_VER = "ruby-1.8.6-p111"
GEMS_VER = "rubygems-0.9.4"
ROOT_DIR = Dir.pwd
RUBY_DIR = "#{ROOT_DIR}/#{RUBY_VER}"
GEMS_DIR = "#{ROOT_DIR}/#{GEMS_VER}"
EXTENSION_DIR = "#{ROOT_DIR}/#{EXTENSION}"
RUBY_URL = "ftp://ftp.ruby-lang.org/pub/ruby/1.8/#{RUBY_VER}.tar.gz"

# These are needed to build Ruby's zlib extension
raise "You forgot to run vcvars32.bat!" unless ENV['INCLUDE'] and ENV['LIB']
ENV['INCLUDE'] += ";#{ROOT_DIR}/../extlibs/headers;#{ROOT_DIR}/zlib"
ENV['LIB'] += ";#{ROOT_DIR}/../extlibs/libs-vc2005;#{ROOT_DIR}/zlib"

# Need this for the Unix utils, like gzip.exe and tar.exe, to run
ENV['PATH'] += ";#{ROOT_DIR}"


desc "Deletes all compiled and installed Ruby files for a clean rebuild"
task :cleanRuby do |t|
	rm_r "bin" rescue nil
	rm_r "lib" rescue nil
	rm_r "man" rescue nil
	rm_r RUBY_DIR rescue nil
	rm_r GEMS_DIR rescue nil
	rm "#{RUBY_VER}.tar" rescue nil
	rm "#{RUBY_VER}.tar.gz" rescue nil
end

desc "Gets the Ruby source code from the FTP server"
task :getRuby do |t|
	tar = "#{RUBY_VER}.tar"
	tgz = "#{tar}.gz"
	unless File.exists?(tar) or File.exists?(tgz)
		puts "Downloading #{RUBY_URL}. Please wait..."
		Net::FTP.open("ftp.ruby-lang.org") do |ftp|
			ftp.login
			files = ftp.chdir("pub/ruby/1.8")
			ftp.getbinaryfile(tgz, tgz)
		end
	end
end

desc "Unpacks the Ruby source tarball"
task :unpackRuby => [:getRuby] do |t|
	unless File.exists?(RUBY_DIR)
		tar = "#{RUBY_VER}.tar"
		tgz = "#{tar}.gz"
		sh "gzip", "-d", tgz if File.exists?(tgz)
		sh "tar", "-xvf", tar
	end

	unless File.exists?(GEMS_DIR)
		sh "unzip", "#{GEMS_VER}.zip"
	end
end

desc "Builds ruby.exe from the source code"
task :buildRuby => [:unpackRuby] do |t|
	unless File.exists? "#{RUBY_DIR}/ruby.exe"
		Dir.chdir RUBY_DIR
		sh "win32\\configure.bat", "--target=i686-mswin32"
		sh "nmake"
		Dir.chdir ROOT_DIR
	end
end

desc "Installs #{RUBY_VER} and copies the extlibs into the bin folder"
task :installRuby => [:buildRuby] do |t|
	unless File.exists? "#{ROOT_DIR}/bin/ruby.exe"
		Dir.chdir RUBY_DIR
		sh "nmake", "DESTDIR=\"#{ROOT_DIR}\"", "install"
		Dir.chdir ROOT_DIR
	end

	unless File.exists? "bin/zlib1.dll"
		cp Dir["../extlibs/bin/*.dll"], "bin"
		cp Dir["zlib/*.dll"], "bin"
		cp "#{RUBY_DIR}/.ext/i386-mswin32_80/zlib.so", "lib/ruby/1.8/i386-mswin32"
	end

	unless File.exists? "#{ROOT_DIR}/lib/ruby/site_ruby/1.8/rubygems.rb"
		Dir.chdir GEMS_DIR
		sh "../bin/ruby.exe", "setup.rb"
		rm_r "#{ROOT_DIR}/lib/ruby/gems/1.8/doc/rubygems-0.9.4" rescue nil
		Dir.chdir ROOT_DIR
	end
end

desc "Deletes all compiled and installed RubySFML files for a clean rebuild"
task :cleanExtension do |t|
	dirs = [EXTENSION_DIR, "#{ROOT_DIR}/RubyOpenGL/gl", "#{ROOT_DIR}/RubyOpenGL/glu"]
	dirs.each {|d|
		rm Dir["#{d}/*.so"]
		rm Dir["#{d}/*.def"]
		rm Dir["#{d}/*.pdb"]
		rm Dir["#{d}/*.lib"]
		rm Dir["#{d}/*.exp"]
		rm Dir["#{d}/*.log"]
		rm Dir["#{d}/*.obj"]
		rm "#{d}/Makefile" rescue nil
	}
	rm "#{ROOT_DIR}/lib/ruby/site_ruby/1.8/i386-msvcr80/RubySFML.so" rescue nil
	rm "#{ROOT_DIR}/lib/ruby/site_ruby/1.8/i386-msvcr80/gl.so" rescue nil
	rm "#{ROOT_DIR}/lib/ruby/site_ruby/1.8/i386-msvcr80/glu.so" rescue nil
end

desc "Builds the SFMLRuby extension"
task :buildExtension => [:installRuby] do |t|
	unless File.exists? "#{ROOT_DIR}/lib/ruby/site_ruby/1.8/i386-msvcr80/gl.so" and File.exists? "#{ROOT_DIR}/lib/ruby/site_ruby/1.8/i386-msvcr80/glu.so"
		Dir.chdir "#{ROOT_DIR}/RubyOpenGL/gl"
		sh "../../bin/ruby.exe", "extconf.rb"
		sh "nmake"
		cp "gl.so", "#{ROOT_DIR}/lib/ruby/site_ruby/1.8/i386-msvcr80"
		Dir.chdir "#{ROOT_DIR}/RubyOpenGL/glu"
		sh "../../bin/ruby.exe", "extconf.rb"
		sh "nmake"
		cp "glu.so", "#{ROOT_DIR}/lib/ruby/site_ruby/1.8/i386-msvcr80"
		Dir.chdir ROOT_DIR
	end

	inc = "../../include"
	lib = "../../lib/vc2005"
	ext = "#{EXTENSION_DIR}/RubySFML.so"
	File.delete(ext) unless uptodate?(ext, Dir["../lib/vc2005/*.lib"]) rescue nil

	Dir.chdir EXTENSION_DIR
	sh "../bin/ruby.exe", "extconf-win.rb", "--with-SFML-include=#{inc}", "--with-SFML-lib=#{lib}"
	sh "nmake"
	cp "RubySFML.so", "#{ROOT_DIR}/lib/ruby/site_ruby/1.8/i386-msvcr80"
	cp "RubySFML.rb", "#{ROOT_DIR}/lib/ruby/site_ruby/1.8"
	Dir.chdir ROOT_DIR
end

desc "Builds everything and runs test.rb"
task :test => [:buildExtension] do |t|
	Dir.chdir "#{ROOT_DIR}/test"
	sh "../bin/ruby.exe", "test.rb"
	Dir.chdir ROOT_DIR
end

desc "Zips up the compiled binaries for distribution"
task :package => [:buildExtension] do |t|
	sh "zip", "-r", "RubySFML.zip", "LICENSE.txt", "bin", "doc", "lib", "test"
end

desc "Deletes all files generated by this build"
task :clean => [:cleanExtension, :cleanRuby] do |t|
	rm "RubySFML.zip" rescue nil
end

desc "Deletes and rebuilds everything"
task :rebuild => [:clean, :package] do |t|
	rm "RubySFML.zip" rescue nil
end

desc "(Same as 'rake package')"
task :default => [:package]