gem 'rake-compiler' require 'rake/extensioncompiler' HOST = Rake::ExtensionCompiler.mingw_host 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"]