196 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			196 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|  | require 'rubygems/tasks' | ||
|  | require 'rbconfig' | ||
|  | require 'rake/clean' | ||
|  | require File.expand_path("./lib/ffi/version") | ||
|  | 
 | ||
|  | require 'date' | ||
|  | require 'fileutils' | ||
|  | require 'rbconfig' | ||
|  | require 'rspec/core/rake_task' | ||
|  | require 'rubygems/package_task' | ||
|  | 
 | ||
|  | def java? | ||
|  |   /java/ === RUBY_PLATFORM | ||
|  | end | ||
|  | 
 | ||
|  | 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 | ||
|  | 
 | ||
|  | TEST_DEPS = [] | ||
|  | if RUBY_PLATFORM == "java" | ||
|  |   RSpec::Core::RakeTask.new(:spec) do |config| | ||
|  |     config.rspec_opts = YAML.load_file 'spec/spec.opts' | ||
|  |   end | ||
|  | else | ||
|  |   RSpec::Core::RakeTask.new(:spec => :compile) do |config| | ||
|  |     config.rspec_opts = YAML.load_file 'spec/spec.opts' | ||
|  |   end | ||
|  | 
 | ||
|  |   TEST_DEPS.unshift :compile | ||
|  | end | ||
|  | 
 | ||
|  | desc "Build all packages" | ||
|  | task :package => %w[ gem:java gem:windows ] | ||
|  | 
 | ||
|  | CLOBBER.include 'lib/ffi/types.conf' | ||
|  | CLOBBER.include 'pkg' | ||
|  | CLOBBER.include 'log' | ||
|  | 
 | ||
|  | CLEAN.include 'build' | ||
|  | CLEAN.include 'conftest.dSYM' | ||
|  | CLEAN.include 'spec/ffi/fixtures/libtest.{dylib,so,dll}' | ||
|  | CLEAN.include 'spec/ffi/fixtures/*.o' | ||
|  | CLEAN.include 'spec/ffi/embed-test/ext/*.{o,def}' | ||
|  | CLEAN.include 'spec/ffi/embed-test/ext/Makefile' | ||
|  | CLEAN.include "pkg/ffi-*-{mingw32,java}" | ||
|  | CLEAN.include 'lib/1.*' | ||
|  | CLEAN.include 'lib/2.*' | ||
|  | 
 | ||
|  | task :distclean => :clobber | ||
|  | 
 | ||
|  | desc "Test the extension" | ||
|  | task :test => [ :spec ] | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace :bench do | ||
|  |   ITER = ENV['ITER'] ? ENV['ITER'].to_i : 100000
 | ||
|  |   bench_libs = "-Ilib" unless RUBY_PLATFORM == "java" | ||
|  |   bench_files = Dir["bench/bench_*.rb"].reject { |f| f == "bench/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 => :spec | ||
|  | 
 | ||
|  | 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(LICENSE COPYING README.md CHANGELOG.md Rakefile) | ||
|  |     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' | ||
|  | 
 | ||
|  | unless java? | ||
|  |   require 'rake/extensiontask' | ||
|  |   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 = %w[i386-mingw32 x64-mingw32]                     # forces the Windows platform instead of the default one | ||
|  |     ext.cross_compiling do |spec| | ||
|  |       spec.files.reject! { |path| File.fnmatch?('ext/*', path) } | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   # To reduce the gem file size strip mingw32 dlls before packaging | ||
|  |   ENV['RUBY_CC_VERSION'].to_s.split(':').each do |ruby_version| | ||
|  |     task "build/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" do |t| | ||
|  |       sh "i686-w64-mingw32-strip -S build/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" | ||
|  |     end | ||
|  | 
 | ||
|  |     task "build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" do |t| | ||
|  |       sh "x86_64-w64-mingw32-strip -S build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" | ||
|  |     end | ||
|  |   end | ||
|  | end | ||
|  | 
 | ||
|  | desc "build a windows gem without all the ceremony" | ||
|  | task "gem:windows" do | ||
|  |   require "rake_compiler_dock" | ||
|  |   sh "bundle package" | ||
|  |   RakeCompilerDock.sh "sudo apt-get update && sudo apt-get install -y libltdl-dev && bundle --local && rake cross native gem MAKE='nice make -j`nproc`'" | ||
|  | end | ||
|  | 
 | ||
|  | directory "ext/ffi_c/libffi" | ||
|  | file "ext/ffi_c/libffi/autogen.sh" => "ext/ffi_c/libffi" do | ||
|  |   warn "Downloading libffi ..." | ||
|  |   sh "git submodule update --init --recursive" | ||
|  | end | ||
|  | task :libffi => "ext/ffi_c/libffi/autogen.sh" | ||
|  | 
 | ||
|  | LIBFFI_GIT_FILES = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0") | ||
|  | 
 | ||
|  | # Generate files in gemspec but not in libffi's git repo by running autogen.sh | ||
|  | gem_spec.files.select do |f| | ||
|  |   f =~ /ext\/ffi_c\/libffi\/(.*)/ && !LIBFFI_GIT_FILES.include?($1) | ||
|  | end.each do |f| | ||
|  |   file f => "ext/ffi_c/libffi/autogen.sh" do | ||
|  |     chdir "ext/ffi_c/libffi" do | ||
|  |       sh "sh ./autogen.sh" | ||
|  |     end | ||
|  |     touch f | ||
|  |     if gem_spec.files != Gem::Specification.load('./ffi.gemspec').files | ||
|  |       warn "gemspec files have changed -> Please restart rake!" | ||
|  |       exit 1
 | ||
|  |     end | ||
|  |   end | ||
|  | end | ||
|  | 
 | ||
|  | $LOAD_PATH.unshift File.join(File.dirname(__FILE__), 'lib') | ||
|  | require 'ffi/platform' | ||
|  | types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf')) | ||
|  | logfile = File.join(File.dirname(__FILE__), 'types_log') | ||
|  | 
 | ||
|  | file types_conf => File.join("lib", "ffi", "version.rb") do |task| | ||
|  |   require 'fileutils' | ||
|  |   require 'ffi/tools/types_generator' | ||
|  |   options = {} | ||
|  |   FileUtils.mkdir_p(File.dirname(task.name), { :mode => 0755 }) | ||
|  |   File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f| | ||
|  |     f.puts FFI::TypesGenerator.generate(options) | ||
|  |   end | ||
|  |   File.open(logfile, 'w') do |log| | ||
|  |     log.puts(types_conf) | ||
|  |   end | ||
|  | end | ||
|  | 
 | ||
|  | task :types_conf => types_conf do | ||
|  | end | ||
|  | 
 | ||
|  | Gem::Tasks.new do |t| | ||
|  |   t.scm.tag.format = '%s' | ||
|  | end | ||
|  | 
 | ||
|  | begin | ||
|  |   require 'yard' | ||
|  | 
 | ||
|  |   namespace :doc do | ||
|  |     YARD::Rake::YardocTask.new do |yard| | ||
|  |     end | ||
|  |   end | ||
|  | rescue LoadError | ||
|  |   warn "[warn] YARD unavailable" | ||
|  | end |