зеркало из https://github.com/github/ruby.git
110 строки
2.5 KiB
Ruby
110 строки
2.5 KiB
Ruby
|
#!/usr/bin/ruby
|
||
|
# Copyright:: Copyright 2012 Google Inc.
|
||
|
# License:: All Rights Reserved.
|
||
|
# Original Author:: Yugui Sonoda (mailto:yugui@google.com)
|
||
|
#
|
||
|
# Generates a runnable package of the pepper API example.
|
||
|
|
||
|
require File.join(File.dirname(__FILE__), 'nacl-config')
|
||
|
require 'json'
|
||
|
require 'find'
|
||
|
require 'fileutils'
|
||
|
|
||
|
include NaClConfig
|
||
|
|
||
|
class Installation
|
||
|
include NaClConfig
|
||
|
|
||
|
SRC_DIRS = [ Dir.pwd, HOST_LIB ]
|
||
|
|
||
|
def initialize(destdir)
|
||
|
@destdir = destdir
|
||
|
@manifest = {
|
||
|
"files" => {}
|
||
|
}
|
||
|
ruby_libs.each do |path|
|
||
|
raise "Collision of #{path}" if @manifest['files'].key? path
|
||
|
@manifest['files'][path] = {
|
||
|
ARCH => {
|
||
|
"url" => path
|
||
|
}
|
||
|
}
|
||
|
if path[/\.so$/]
|
||
|
alternate_path = path.gsub('/', "_")
|
||
|
raise "Collision of #{alternate_path}" if @manifest['files'].key? alternate_path
|
||
|
@manifest['files'][alternate_path] = {
|
||
|
ARCH => {
|
||
|
"url" => path
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def manifest
|
||
|
@manifest.dup
|
||
|
end
|
||
|
|
||
|
def install_program(basename)
|
||
|
do_install_binary(basename, File.join(@destdir, "bin", ARCH))
|
||
|
@manifest["program"] = {
|
||
|
ARCH => {
|
||
|
"url" => File.join("bin", ARCH, basename)
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
def install_library(name, basename)
|
||
|
do_install_binary(basename, File.join(@destdir, "lib", ARCH))
|
||
|
@manifest["files"][name] = {
|
||
|
ARCH => {
|
||
|
"url" => File.join("lib", ARCH, basename)
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def do_install_binary(basename, dest_dir)
|
||
|
full_path = nil
|
||
|
catch(:found) {
|
||
|
SRC_DIRS.each do |path|
|
||
|
full_path = File.join(path, basename)
|
||
|
if File.exist? full_path
|
||
|
throw :found
|
||
|
end
|
||
|
end
|
||
|
raise Errno::ENOENT, "No such file to install: %s" % basename
|
||
|
}
|
||
|
FileUtils.mkdir_p dest_dir
|
||
|
system("#{INSTALL_PROGRAM} #{full_path} #{dest_dir}")
|
||
|
end
|
||
|
|
||
|
def ruby_libs
|
||
|
Find.find(RbConfig::CONFIG['rubylibdir']).select{|path| File.file?(path) }.map{|path| path.sub("#{@destdir}/", "") }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def install(destdir)
|
||
|
inst = Installation.new(destdir)
|
||
|
manifest = JSON.parse(File.read("pepper-ruby.nmf"))
|
||
|
|
||
|
program = File.basename(manifest['program'][ARCH]['url'])
|
||
|
inst.install_program(program)
|
||
|
|
||
|
manifest['files'].each do |name, attr|
|
||
|
inst.install_library(name, File.basename(attr[ARCH]["url"]))
|
||
|
end
|
||
|
|
||
|
File.open(File.join(destdir, "ruby.nmf"), "w") {|f|
|
||
|
f.puts JSON.pretty_generate(inst.manifest)
|
||
|
}
|
||
|
end
|
||
|
|
||
|
def main
|
||
|
install(ARGV[0])
|
||
|
end
|
||
|
|
||
|
if __FILE__ == $0
|
||
|
main()
|
||
|
end
|