121 lines
3.2 KiB
Ruby
121 lines
3.2 KiB
Ruby
|
require 'rubygems'
|
||
|
require 'rubygems/package_task'
|
||
|
|
||
|
begin
|
||
|
require 'rake/extensiontask'
|
||
|
require 'rake/javaextensiontask'
|
||
|
rescue LoadError => e
|
||
|
puts <<-MSG
|
||
|
rake-compiler gem seems to be missing. Please install it with
|
||
|
|
||
|
gem install rake-compiler
|
||
|
|
||
|
(add sudo if necessary).
|
||
|
MSG
|
||
|
end
|
||
|
|
||
|
Gem::PackageTask.new(GEMSPEC) do |pkg|
|
||
|
end
|
||
|
|
||
|
if RUBY_PLATFORM =~ /java/
|
||
|
Rake::JavaExtensionTask.new("rubyeventmachine", GEMSPEC) do |ext|
|
||
|
ext.ext_dir = 'java/src'
|
||
|
end
|
||
|
else
|
||
|
def setup_cross_compilation(ext)
|
||
|
unless RUBY_PLATFORM =~ /mswin|mingw/
|
||
|
ext.cross_compile = true
|
||
|
ext.cross_platform = ['x86-mingw32', 'x64-mingw32']
|
||
|
end
|
||
|
end
|
||
|
def hack_cross_compilation(ext)
|
||
|
# inject 1.8/1.9 pure-ruby entry point
|
||
|
# HACK: add these dependencies to the task instead of using cross_compiling
|
||
|
if ext.cross_platform.is_a?(Array)
|
||
|
ext.cross_platform.each do |platform|
|
||
|
task = "native:#{GEMSPEC.name}:#{platform}"
|
||
|
if Rake::Task.task_defined?(task)
|
||
|
Rake::Task[task].prerequisites.unshift "lib/#{ext.name}.rb"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
em = Rake::ExtensionTask.new("rubyeventmachine", GEMSPEC) do |ext|
|
||
|
ext.ext_dir = 'ext'
|
||
|
ext.source_pattern = '*.{h,c,cpp}'
|
||
|
setup_cross_compilation(ext)
|
||
|
end
|
||
|
hack_cross_compilation em
|
||
|
|
||
|
ff = Rake::ExtensionTask.new("fastfilereaderext", GEMSPEC) do |ext|
|
||
|
ext.ext_dir = 'ext/fastfilereader'
|
||
|
ext.source_pattern = '*.{h,c,cpp}'
|
||
|
setup_cross_compilation(ext)
|
||
|
end
|
||
|
hack_cross_compilation ff
|
||
|
end
|
||
|
|
||
|
# Setup shim files that require 1.8 vs 1.9 extensions in win32 bin gems
|
||
|
%w[ rubyeventmachine fastfilereaderext ].each do |filename|
|
||
|
file("lib/#{filename}.rb") do |t|
|
||
|
File.open(t.name, 'wb') do |f|
|
||
|
f.write <<-eoruby
|
||
|
RUBY_VERSION =~ /(\\d+.\\d+)/
|
||
|
require "\#{$1}/#{File.basename(t.name, '.rb')}"
|
||
|
eoruby
|
||
|
end
|
||
|
at_exit{ FileUtils.rm t.name if File.exist?(t.name) }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
task :cross_cxx do
|
||
|
ENV['CROSS_COMPILING'] = 'yes'
|
||
|
require 'rake/extensioncompiler'
|
||
|
ENV['CXX'] = "#{Rake::ExtensionCompiler.mingw_host}-g++"
|
||
|
end
|
||
|
|
||
|
if Rake::Task.task_defined?(:cross)
|
||
|
task :cross => 'lib/rubyeventmachine.rb'
|
||
|
task :cross => 'lib/fastfilereaderext.rb'
|
||
|
task :cross => :cross_cxx
|
||
|
end
|
||
|
|
||
|
def windows?; RUBY_PLATFORM =~ /mswin|mingw/; end
|
||
|
def sudo(cmd)
|
||
|
if windows? || (require 'etc'; Etc.getpwuid.uid == 0)
|
||
|
sh cmd
|
||
|
else
|
||
|
sh "sudo #{cmd}"
|
||
|
end
|
||
|
end
|
||
|
def gem_cmd(action, name, *args)
|
||
|
rb = Gem.ruby rescue nil
|
||
|
rb ||= (require 'rbconfig'; File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']))
|
||
|
sudo "#{rb} -r rubygems -e 'require %{rubygems/gem_runner}; Gem::GemRunner.new.run(%w{#{action} #{name} #{args.join(' ')}})'"
|
||
|
end
|
||
|
|
||
|
Rake::Task[:clean].enhance [:clobber_package]
|
||
|
|
||
|
# DevKit task following the example of Luis Lavena's test-ruby-c-extension
|
||
|
task :devkit do
|
||
|
begin
|
||
|
require "devkit"
|
||
|
rescue LoadError => e
|
||
|
abort "Failed to activate RubyInstaller's DevKit required for compilation."
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if RUBY_PLATFORM =~ /mingw|mswin/
|
||
|
Rake::Task['compile'].prerequisites.unshift 'devkit'
|
||
|
end
|
||
|
|
||
|
desc "Build binary gems for Windows with rake-compiler-dock"
|
||
|
task 'gem:windows' do
|
||
|
require 'rake_compiler_dock'
|
||
|
RakeCompilerDock.sh <<-EOT
|
||
|
RUBY_CC_VERSION="${RUBY_CC_VERSION//1.8.7/}"
|
||
|
bundle && rake cross native gem
|
||
|
EOT
|
||
|
end
|