blob: c8e4cf3f5dbf4b3f4f0fc1f2bf0d808b10c55879 [file] [log] [blame]
require 'rubygems/tasks'
require 'rbconfig'
require 'rake/clean'
require File.expand_path("./lib/ffi/version")
USE_RAKE_COMPILER = (RUBY_PLATFORM =~ /java/) ? false : true
if USE_RAKE_COMPILER
require 'rake/extensiontask'
end
require 'date'
require 'fileutils'
require 'rbconfig'
require 'rspec/core/rake_task'
require 'rubygems/package_task'
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
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
TEST_DEPS = [ LIBTEST ]
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 => 'gem:package'
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 "pkg/ffi-*-{mingw32,java}"
CLEAN.include 'lib/1.*'
CLEAN.include 'lib/2.*'
CLEAN.include 'bin'
task :distclean => :clobber
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 => [ :spec ]
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 => :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 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 = %w[i386-mingw32 x64-mingw32] # forces the Windows platform instead of the default one
end
ENV['RUBY_CC_VERSION'] ||= '1.8.7:1.9.3:2.0.0:2.1.6:2.2.2:2.3.0'
# 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
desc "build a windows gem without all the ceremony."
task "gem:windows" do
require "rake_compiler_dock"
RakeCompilerDock.sh "bundle && rake cross native gem MAKE='nice make -j`nproc`'"
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