require 'rake' require 'rubygems' require 'rdoc/task' require 'rake/clean' require 'rake/gempackagetask' require 'rbconfig' require 'pp' include Config include Rake # Configurable section RUBYSFML_VERSION = "2.0" SO_SRCS = {'audio' => FileList.new('sfml-audio/audio/*.cpp'), 'graphics' => FileList.new('sfml-graphics/graphics/*.cpp'), 'window' => FileList.new('sfml-window/window/*.cpp'), 'system' => FileList.new('sfml-system/system/*.cpp'), 'all' => FileList.new('sfml-all/all/*.cpp') } OTHER_SRCS = FileList.new('shared/*.cpp') OBJDIR = 'obj' SODIR = 'sfml' spec = Gem::Specification.new do |s| s.platform = Gem::Platform::CURRENT s.name = "rbSFML" s.version = RUBYSFML_VERSION s.authors = ["Henrik Valter Vogelius Hansson", 'Brandon Whitehead'] s.email = "groogy@groogy.se" s.homepage = 'http://sfml-dev.org' s.summary = "Ruby bindings for SFML 2.0" s.has_rdoc = true s.requirements << 'none' s.require_path = '' s.files = FileList.new do |fl| fl.include("sfml-audio/audio/*.cpp", "sfml-audio/audio/*.hpp") fl.include("sfml-graphics/graphics/*.cpp", "sfml-graphics/graphics/*.hpp") fl.include("sfml-window/window/*.cpp", "sfml-window/window/*.hpp") fl.include("sfml-system/system/*.cpp", "sfml-system/system/*.hpp") fl.include("sfml-all/all/*.cpp", "sfml-all/all/*.hpp") end s.extensions = ["Rakefile"] s.description = <<-EOF rbSFML are bindings for the SFML library version 2.0 for Ruby. SFML or Simple Fast Multimedia library is is a free multimedia C++ API that provides you low and high level access to graphics, input, audio, etc. EOF s.extra_rdoc_files = FileList.new do |fl| fl.include "doc/*.rdoc" end end verbose(false) # Do not touch SO_OBJS = {} SO_SRCS.each do |file, list| SO_OBJS[file] = list.collect { |fn| File.join("#{OBJDIR}/#{file}", File.basename(fn).ext('o')) } end OTHER_OBJS = OTHER_SRCS.collect {|fn| File.join("#{OBJDIR}/shared/#{file}", File.basename(fn).ext('o')) } SO_LIBS = [] SO_SRCS.each_key {|file| SO_LIBS << "#{SODIR}/#{file}.so"} SO_SRCS.each_key {|dir| CLEAN.include("#{OBJDIR}/#{dir}")} SO_OBJS.each_value {|list| CLEAN.include(list)} CLEAN.include(OTHER_OBJS) CLEAN.include("#{OBJDIR}/shared") CLEAN.include(OBJDIR) SO_LIBS.each {|so_file| CLOBBER.include(so_file)} CLOBBER.include(SODIR) # Sets the default task to build task :default => [:build] desc "Compiles and builds the library" task :build desc "Recompiles the library" task :rebuild desc "Installs the generated files" task :install desc "Uninstalls the generated files" task :uninstall task :clean do puts "Cleaning out temporary generated files" end task :clobber do puts "Cleaning out all generated files" end task :rebuild => [:clobber, :build] do end Rake::GemPackageTask.new(spec) do |pkg| pkg.need_tar_bz2 = true end RDoc::Task.new do |rd| rd.title = "RSFML #{RUBYSFML_VERSION} Documentation" rd.rdoc_files.include(SO_SRCS.values) rd.options << '--line-numbers' << '--quiet' << '--all' rd.rdoc_dir = "doc" end CFLAGS = CONFIG['CFLAGS'] CC = CONFIG['CC'] # CONFIG['INSTALL_PROGRAM'] INSTALL = "install" LOCATION = CONFIG['sitearchdir'] + '/sfml' RUBYSFML_INC = "shared" SFML_INC = ENV.key?('SFML_INCLUDE') ? ENV['SFML_INCLUDE'] : '../../include' SFML_LIB = ENV.key?('SFML_LIB') ? ENV['SFML_LIB'] : '../../lib' SFML_LIBS = '-lsfml-audio -lsfml-graphics -lsfml-window -lsfml-system' RUBY_INC = CONFIG['rubyhdrdir'] RUBY_LIB = (CONFIG['ENABLE_SHARED'] == 'yes' ? CONFIG['LIBRUBYARG_SHARED'] : CONFIG['LIBRUBYARG_STATIC']) + ' ' + CONFIG['SOLIBS'] RUBY_LIB_PATH = CONFIG['libdir'] LINK = CONFIG['LDSHAREDXX'] # Windows screws up this variable... LINK.sub!("$(if $(filter-out -g -g0,#{CONFIG["debugflags"]}),,-s)", '') LINK_FLAGS = CONFIG['DLDFLAGS'] + " " + CONFIG['LDFLAGS'] LINK_FLAGS.sub!("$(DEFFILE)", "") SO_SRCS.each_key {|dir| directory "#{OBJDIR}/#{dir}"} directory "#{OBJDIR}/shared" directory SODIR directory LOCATION OTHER_SRCS.each do |srcfile| objdir = "#{OBJDIR}/shared" objfile = File.join(objdir, File.basename(srcfile).ext('o')) file objfile => [srcfile, objdir] do puts "Compiling #{File.basename(srcfile)}" sh "#{CC} #{CFLAGS} -c #{srcfile} -o #{objfile} -I#{SFML_INC} -I#{RUBY_INC} -I#{RUBY_INC}/#{CONFIG['arch']} -I#{RUBYSFML_INC}" end end task :shared => OTHER_OBJS SO_SRCS.each do |so_file, list| begin list.each do |srcfile| objdir = "#{OBJDIR}/#{so_file}" objfile = File.join(objdir, File.basename(srcfile).ext('o')) file objfile => [srcfile, objdir] do puts "Compiling #{File.basename(srcfile)}" sh "#{CC} #{CFLAGS} -c #{srcfile} -o #{objfile} -I#{SFML_INC} -I#{RUBY_INC} -I#{RUBY_INC}/#{CONFIG['arch']} -I#{RUBYSFML_INC}" #p "#{CC} #{CFLAGS} -c #{srcfile} -o #{objfile} -I#{SFML_INC} -I#{RUBY_INC} -I#{RUBY_INC}/#{CONFIG['arch']} -I#{RUBYSFML_INC}" end end rescue end end SO_OBJS.each do |so_file, objs| begin prestep = "pre#{so_file}".to_sym task prestep do puts "Creating #{so_file}.so" end file "#{SODIR}/#{so_file}.so" => [prestep, :shared, SODIR, *objs] do puts "Linking files to create #{so_file}.so" #p "#{LINK} -o #{SODIR}/#{so_file}.so #{objs} -L. -L#{SFML_LIB} -L#{RUBY_LIB_PATH} #{LINK_FLAGS} #{RUBY_LIB} #{SFML_LIBS}" sh "#{LINK} -o #{SODIR}/#{so_file}.so #{objs} #{OTHER_OBJS} -L. -L#{SFML_LIB} -L#{RUBY_LIB_PATH} #{LINK_FLAGS} #{RUBY_LIB} #{SFML_LIBS}" end rescue end end task :install => [:build, LOCATION] do puts "Installing library to #{LOCATION}" begin SO_SRCS.each_key do |so_file| sh "#{INSTALL} #{SODIR}/#{so_file}.so #{LOCATION}" end rescue Exception=>e p e end end task :uninstall do puts "Uninstalling library to #{LOCATION}" begin SO_SRCS.each_key do |so_file| sh "rm -f #{LOCATION}/#{so_file}.so" end sh "rm -rf #{LOCATION}" rescue end end task :build => [:shared, *SO_LIBS] do end