Rakefile in ffi-0.6.3-java vs Rakefile in ffi-0.6.4
- old
+ new
@@ -1,24 +1,217 @@
-begin
- require 'bones'
- Bones.setup
-rescue LoadError
- load 'tasks/setup.rb'
+require 'rubygems'
+require 'rubygems/package_task'
+require 'rbconfig'
+
+USE_RAKE_COMPILER = (RUBY_PLATFORM =~ /java/) ? false : true
+if USE_RAKE_COMPILER
+ gem 'rake-compiler', '>=0.6.0'
+ require 'rake/extensiontask'
end
-task :default => 'gem:repackage'
+require 'date'
+require 'fileutils'
+require 'rbconfig'
-PROJ.name = 'ffi'
-PROJ.authors = "JRuby Project"
-PROJ.email = "ruby-ffi@groups.google.com"
-PROJ.url = "http://wiki.github.com/ffi/ffi"
-PROJ.version = "0.6.3"
-PROJ.rubyforge.name = 'ffi'
-PROJ.svn.path = 'ffi'
-PROJ.summary = "A Ruby foreign function interface"
-PROJ.exclude << [ "\\.git", "^nbproject/" ]
-PROJ.notes.exclude = %w(^README\.txt$ History\.txt ^data/ ^nbproject/)
-PROJ.gem.files = %w(README.txt History.txt LICENSE Rakefile) + Dir.glob("lib/**/*") + Dir.glob("tasks/*")
-PROJ.gem.extras['platform'] = 'java'
-PROJ.gem.extras['has_rdoc']=false
-PROJ.gem.need_tar = false
-PROJ.gem.need_zip = false
+
+LIBEXT = case RbConfig::CONFIG['host_os'].downcase
+ when /darwin/
+ "dylib"
+ when /mswin|mingw/
+ "dll"
+ else
+ RbConfig::CONFIG['DLEXT']
+ end
+
+CPU = case RbConfig::CONFIG['host_cpu'].downcase
+ when /i[3456]86/
+ # Darwin always reports i686, even when running in 64bit mode
+ if RbConfig::CONFIG['host_os'] =~ /darwin/ && 0xfee1deadbeef.is_a?(Fixnum)
+ "x86_64"
+ else
+ "i386"
+ end
+
+ when /amd64|x86_64/
+ "x86_64"
+
+ when /ppc64|powerpc64/
+ "powerpc64"
+
+ when /ppc|powerpc/
+ "powerpc"
+
+ when /^arm/
+ "arm"
+
+ else
+ RbConfig::CONFIG['host_cpu']
+ end
+
+OS = case RbConfig::CONFIG['host_os'].downcase
+ when /linux/
+ "linux"
+ when /darwin/
+ "darwin"
+ when /freebsd/
+ "freebsd"
+ when /openbsd/
+ "openbsd"
+ when /sunos|solaris/
+ "solaris"
+ when /mswin|mingw/
+ "win32"
+ else
+ RbConfig::CONFIG['host_os'].downcase
+ end
+
+CC = ENV['CC'] || RbConfig::CONFIG['CC'] || "gcc"
+
+GMAKE = system('which gmake >/dev/null') && 'gmake' || 'make'
+
+LIBTEST = "build/libtest.#{LIBEXT}"
+BUILD_DIR = "build"
+BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUBY_VERSION)
+
+def gem_spec
+ @gem_spec ||= Gem::Specification.load('ffi.gemspec')
+end
+
+Gem::PackageTask.new(gem_spec) do |pkg|
+ pkg.need_zip = true
+ pkg.need_tar = true
+ pkg.package_dir = 'pkg'
+end
+
+TEST_DEPS = [ LIBTEST ]
+if RUBY_PLATFORM == "java"
+ desc "Run all specs"
+ task :specs => TEST_DEPS do
+ sh %{#{Gem.ruby} -w -S rspec #{Dir["spec/ffi/*_spec.rb"].join(" ")} -fs --color}
+ end
+ desc "Run rubinius specs"
+ task :rbxspecs => TEST_DEPS do
+ sh %{#{Gem.ruby} -w -S rspec #{Dir["spec/ffi/rbx/*_spec.rb"].join(" ")} -fs --color}
+ end
+else
+ TEST_DEPS.unshift :compile
+ desc "Run all specs"
+ task :specs => TEST_DEPS do
+ ENV["MRI_FFI"] = "1"
+ sh %{#{Gem.ruby} -w -Ilib -I#{BUILD_EXT_DIR} -S rspec #{Dir["spec/ffi/*_spec.rb"].join(" ")} -fs --color}
+ end
+ desc "Run rubinius specs"
+ task :rbxspecs => TEST_DEPS do
+ ENV["MRI_FFI"] = "1"
+ sh %{#{Gem.ruby} -w -Ilib -I#{BUILD_EXT_DIR} -S rspec #{Dir["spec/ffi/rbx/*_spec.rb"].join(" ")} -fs --color}
+ end
+end
+
+desc "Build all packages"
+task :package => 'gem:package'
+
+desc "Install the gem locally"
+task :install => 'gem:install'
+
+namespace :gem do
+ task :install => :gem do
+ ruby %{ -S gem install pkg/ffi-#{gem_spec.version}.gem }
+ end
+end
+
+desc "Clean all built files"
+task :distclean => :clobber do
+ FileUtils.rm_rf('build')
+ FileUtils.rm_rf(Dir["lib/**/ffi_c.#{RbConfig::CONFIG['DLEXT']}"])
+ FileUtils.rm_rf('lib/1.8')
+ FileUtils.rm_rf('lib/1.9')
+ FileUtils.rm_rf('lib/ffi/types.conf')
+ FileUtils.rm_rf('conftest.dSYM')
+ FileUtils.rm_rf('pkg')
+end
+
+
+desc "Build the native test lib"
+file "build/libtest.#{LIBEXT}" => FileList['libtest/**/*.[ch]'] do
+ sh %{#{GMAKE} -f libtest/GNUmakefile CPU=#{CPU} OS=#{OS} }
+end
+
+
+desc "Build test helper lib"
+task :libtest => "build/libtest.#{LIBEXT}"
+
+desc "Test the extension"
+task :test => [ :specs, :rbxspecs ]
+
+
+namespace :bench do
+ ITER = ENV['ITER'] ? ENV['ITER'].to_i : 100000
+ bench_libs = "-Ilib -I#{BUILD_DIR}" unless RUBY_PLATFORM == "java"
+ bench_files = Dir["bench/bench_*.rb"].reject { |f| f == "bench_helper.rb" }
+ bench_files.each do |bench|
+ task File.basename(bench, ".rb")[6..-1] => TEST_DEPS do
+ sh %{#{Gem.ruby} #{bench_libs} #{bench} #{ITER}}
+ end
+ end
+ task :all => TEST_DEPS do
+ bench_files.each do |bench|
+ sh %{#{Gem.ruby} #{bench_libs} #{bench}}
+ end
+ end
+end
+
+task 'spec:run' => TEST_DEPS
+task 'spec:specdoc' => TEST_DEPS
+
+task :default => :specs
+
+task 'gem:win32' do
+ sh("rake cross native gem RUBY_CC_VERSION='1.8.7:1.9.3'") || raise("win32 build failed!")
+end
+
+
+namespace 'java' do
+
+ java_gem_spec = Gem::Specification.new do |s|
+ s.name = gem_spec.name
+ s.version = gem_spec.version
+ s.author = gem_spec.author
+ s.email = gem_spec.email
+ s.homepage = gem_spec.homepage
+ s.summary = gem_spec.summary
+ s.description = gem_spec.description
+ s.files = %w(History.txt LICENSE COPYING COPYING.LESSER README.md Rakefile)
+ s.has_rdoc = false
+ s.license = gem_spec.license
+ s.platform = 'java'
+ end
+
+ Gem::PackageTask.new(java_gem_spec) do |pkg|
+ pkg.need_zip = true
+ pkg.need_tar = true
+ pkg.package_dir = 'pkg'
+ end
+end
+
+task 'gem:java' => 'java:gem'
+
+
+if USE_RAKE_COMPILER
+ Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext|
+ ext.name = 'ffi_c' # indicate the name of the extension.
+ # ext.lib_dir = BUILD_DIR # put binaries into this folder.
+ ext.tmp_dir = BUILD_DIR # temporary folder used during compilation.
+ ext.cross_compile = true # enable cross compilation (requires cross compile toolchain)
+ ext.cross_platform = 'i386-mingw32' # forces the Windows platform instead of the default one
+ end
+end
+
+begin
+ require 'yard'
+
+ namespace :doc do
+ YARD::Rake::YardocTask.new do |yard|
+ end
+ end
+rescue LoadError
+ warn "[warn] YARD unavailable"
+end