From 38938ccaad2656af71752cc5b7fc7d6eb782ca03 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 23 Dec 2014 13:24:33 +0000 Subject: extlibs.rb: external libraries * tool/extlibs.rb: download, extract, and patch external libraries. * ext/fiddle/extlibs: libffi-3.2.1 and patch for mswin. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48935 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- tool/extlibs.rb | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tool/make-snapshot | 13 ++++-- 2 files changed, 130 insertions(+), 3 deletions(-) create mode 100755 tool/extlibs.rb (limited to 'tool') diff --git a/tool/extlibs.rb b/tool/extlibs.rb new file mode 100755 index 0000000000..116964c2af --- /dev/null +++ b/tool/extlibs.rb @@ -0,0 +1,120 @@ +#!/usr/bin/ruby +require 'fileutils' +require 'digest' +require_relative 'downloader' + +cache_dir = ".downloaded-cache" +FileUtils.mkdir_p(cache_dir) + +def do_download(url, base, cache_dir) + Downloader.download(url, base, cache_dir, nil) +end + +def do_checksum(cache, chksums) + chksums.each do |sum| + name, sum = sum.split(/:/) + if $VERBOSE + $stdout.print "checking #{name} of #{cache} ..." + $stdout.flush + end + hd = Digest(name.upcase).file(cache).hexdigest + if hd == sum + if $VERBOSE + $stdout.puts " OK" + $stdout.flush + end + else + if $VERBOSE + $stdout.puts " NG" + $stdout.flush + end + raise "checksum mismatch: #{cache}, #{name}:#{hd}, expected #{sum}" + end + end +end + +def do_extract(cache, dir) + if $VERBOSE + $stdout.puts "extracting #{cache} into #{dir}" + $stdout.flush + end + Process.wait(Process.spawn("tar", "xpf", "-", in: cache, chdir: dir)) + $?.success? or raise "failed to extract #{cache}" +end + +def do_patch(dest, patch, args) + if $VERBOSE + $stdout.puts "applying #{patch} under #{dest}" + $stdout.flush + end + Process.wait(Process.spawn("patch", *args, in: File.join(dest, patch), chdir: dest)) + $?.success? or raise "failed to patch #{patch}" +end + +case ARGV[0] +when '--download' + mode = :download + ARGV.shift +when '--extract' + mode = :extract + ARGV.shift +when '--patch' + mode = :patch + ARGV.shift +when '--all' + mode = :all + ARGV.shift +else + mode = :all +end + +success = true +ARGV.each do |dir| + Dir.glob("#{dir}/**/extlibs") do |list| + if $VERBOSE + $stdout.puts "downloading for #{list}" + $stdout.flush + end + extracted = false + dest = File.dirname(list) + IO.foreach(list) do |line| + line.sub!(/\s*#.*/, '') + if /^\t/ =~ line + if extracted and (mode == :all or mode == :patch) + patch, *args = line.split + do_patch(dest, patch, args) + end + next + end + url, *chksums = line.split(' ') + next unless url + extracted = false + base = File.basename(url) + cache = File.join(cache_dir, base) + target = File.join(dest, base[/.*(?=\.tar(?:\.\w+)?\z)/]) + begin + case mode + when :download + do_download(url, base, cache_dir) + do_checksum(cache, chksums) + when :extract + unless File.directory?(target) + do_checksum(cache, chksums) + extracted = do_extract(cache, dest) + end + when :all + do_download(url, base, cache_dir) + unless File.directory?(target) + do_checksum(cache, chksums) + extracted = do_extract(cache, dest) + end + end + rescue => e + warn e.inspect + success = false + end + end + end +end + +exit(success) diff --git a/tool/make-snapshot b/tool/make-snapshot index 9e05e66ee9..0c245325a2 100755 --- a/tool/make-snapshot +++ b/tool/make-snapshot @@ -186,9 +186,15 @@ def package(vcs, rev, destdir, tmp = nil) return end if $srcdir - Dir.glob($srcdir + "/{tool/config.{guess,sub},gems/*.gem}") do |file| + Dir.glob($srcdir + "/{tool/config.{guess,sub},gems/*.gem,.downloaded-cache/*}") do |file| puts "copying #{file}" - FileUtils.cp(file, exported + file[$srcdir.size..-1], preserve: true) + dest = exported + file[$srcdir.size..-1] + FileUtils.mkpath(File.dirname(dest)) + begin + FileUtils.ln(file, dest, force: true) + rescue SystemCallError + FileUtils.cp(file, dest, preserve: true) + end end end end @@ -280,6 +286,7 @@ def package(vcs, rev, destdir, tmp = nil) srcdir=. CHDIR=cd NULLCMD=: PATH_SEPARATOR=#{File::PATH_SEPARATOR} IFCHANGE=tool/ifchange MAKEDIRS=mkdir\ -p + RMALL=rm\ -fr MINIRUBY=#{miniruby} RUNRUBY=#{miniruby} RUBY=#{ENV["RUBY"]} @@ -289,7 +296,7 @@ def package(vcs, rev, destdir, tmp = nil) prereq] IO.popen(cmd, "w") do |f| f.puts mk - f.puts "after-update::", "prereq: after-update" + f.puts "after-update::", "clean-cache $(CLEAN_CACHE): after-update", "prereq: clean-cache $(CLEAN_CACHE)" end clean.push("rbconfig.rb", ".rbconfig.time", "enc.mk") print "prerequisites" -- cgit v1.2.3