gem 'rake-compiler'
require 'rake/extensioncompiler'
HOST = Rake::ExtensionCompiler.mingw_host
require 'resolv'
require 'mini_portile'
dependencies = YAML.load_file("dependencies.yml")
$recipes = {}
%w[zlib libiconv libxml2 libxslt].each do |lib|
$recipes[lib] = MiniPortile.new lib, dependencies[lib]
end
$recipes.each { |_, recipe| recipe.host = HOST }
file "lib/nokogiri/nokogiri.rb" do
File.open("lib/nokogiri/nokogiri.rb", 'wb') do |f|
f.write %Q{require "nokogiri/\#{RUBY_VERSION.sub(/\\.\\d+$/, '')}/nokogiri"\n}
end
end
namespace :cross do
task :zlib do
recipe = $recipes["zlib"]
recipe.files = ["http://zlib.net/#{recipe.name}-#{recipe.version}.tar.gz"]
class << recipe
def configure
Dir.chdir work_path do
mk = File.read 'win32/Makefile.gcc'
File.open 'win32/Makefile.gcc', 'wb' do |f|
f.puts "BINARY_PATH = #{CROSS_DIR}/bin"
f.puts "LIBRARY_PATH = #{CROSS_DIR}/lib"
f.puts "INCLUDE_PATH = #{CROSS_DIR}/include"
f.puts mk.sub(/^PREFIX\s*=\s*$/, "PREFIX = #{HOST}-")
end
end
end
def configured?
Dir.chdir work_path do
!! (File.read('win32/Makefile.gcc') =~ /^BINARY_PATH/)
end
end
def compile
execute "compile", "make -f win32/Makefile.gcc"
end
def install
execute "install", "make -f win32/Makefile.gcc install"
end
end
checkpoint = "#{CROSS_DIR}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
unless File.exist?(checkpoint)
recipe.cook
touch checkpoint
end
recipe.activate
end
task :libiconv do
recipe = $recipes["libiconv"]
recipe.files = ["http://ftp.gnu.org/pub/gnu/libiconv/#{recipe.name}-#{recipe.version}.tar.gz"]
recipe.configure_options = [
"--host=#{HOST}",
"--enable-static",
"--disable-shared",
"CPPFLAGS='-mno-cygwin -Wall'",
"CFLAGS='-mno-cygwin -O2 -g'",
"CXXFLAGS='-mno-cygwin -O2 -g'",
"LDFLAGS=-mno-cygwin"
]
checkpoint = "#{CROSS_DIR}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
unless File.exist?(checkpoint)
recipe.cook
touch checkpoint
end
recipe.activate
end
task :libxml2 => ["cross:zlib", "cross:libiconv"] do
recipe = $recipes["libxml2"]
recipe.files = ["ftp://ftp.xmlsoft.org/libxml2/#{recipe.name}-#{recipe.version}.tar.gz"]
recipe.configure_options = [
"--host=#{HOST}",
"--enable-static",
"--disable-shared",
"--with-zlib=#{CROSS_DIR}",
"--with-iconv=#{$recipes["libiconv"].path}",
"--without-python",
"--without-readline",
"CFLAGS='-DIN_LIBXML'"
]
checkpoint = "#{CROSS_DIR}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
unless File.exist?(checkpoint)
recipe.cook
touch checkpoint
end
recipe.activate
end
task :libxslt => ['cross:libxml2'] do
recipe = $recipes["libxslt"]
recipe.files = ["ftp://ftp.xmlsoft.org/libxml2/#{recipe.name}-#{recipe.version}.tar.gz"]
recipe.configure_options = [
"--host=#{HOST}",
"--enable-static",
"--disable-shared",
"--with-libxml-prefix=#{$recipes["libxml2"].path}",
"--without-python",
"--without-crypto",
"CFLAGS='-DIN_LIBXML'"
]
checkpoint = "#{CROSS_DIR}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
unless File.exist?(checkpoint)
recipe.cook
touch checkpoint
end
recipe.activate
end
task :file_list do
HOE.spec.files += Dir["lib/nokogiri/nokogiri.rb"]
HOE.spec.files += Dir["lib/nokogiri/{1.9,2.0}/nokogiri.so"]
end
end
require 'rake/clean'
CLOBBER.include("#{CROSS_DIR}/*.installed", "#{CROSS_DIR}/#{HOST}", "tmp/#{HOST}")
task :cross => ["cross:libxslt", "lib/nokogiri/nokogiri.rb", "cross:file_list"]