Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

executable file 436 lines (352 sloc) 10.597 kb
#!/usr/bin/env ruby
require 'rbconfig'
require 'tempfile'
root = File.expand_path File.dirname(__FILE__)
require File.join(root, "kernel", "delta", "options")
class Configure
def initialize(root)
@defines = []
@config = File.join(root, "config.rb")
# LLVM settings
@llvm = :no
@llvm_path = nil
@llvm_configure = nil
@llvm_svn_dir = File.join(root, "vm", "external_libs", "llvm")
# File system paths
@bindir = root + "/bin"
@includedir = root + "/vm/capi"
@libdir = root
@runtime = @libdir + "/runtime"
@lib_path = @libdir + "/lib"
@ext_path = @libdir + "/lib/ext"
@mandir = root + "/man"
@gemsdir = root + "/gems"
@program_name = "rbx"
# Essential settings
@libversion = "1.0"
@version = "#{@libversion}.0-rc1"
if File.directory? root + "/.git"
@buildrev = `git rev-list --all | head -n1`.chomp
else
@buildrev = "release"
end
# TODO: conditionalize for Windows
@host = `./rakelib/config.guess`.chomp
/([^-]+)-([^-]+)-(.*)/ =~ @host
@cpu, @vendor, @os = $1, $2, $3
# TODO: add conditionals for platforms
if Config::CONFIG["build_os"] =~ /darwin/
@ldshared = "cc -dynamic -bundle -undefined suppress -flat_namespace"
else
@ldshared = "cc -shared"
end
end
def options
o = Rubinius::Options.new "Usage: configure [options]", 30
o.left_align
o.doc " LLVM settings"
@use_llvm = true
o.on "--disable-llvm", "Don't build with LLVM" do
@use_llvm = false
end
o.on "--llvm-path", "PATH", "Where to find LLVM" do |dir|
@llvm_path = dir
end
o.on "--update-prebuilt", "Update prebuilt LLVM packages from the internet" do
update_prebuilt
end
o.doc "\n File system paths for installing Rubinius"
o.on "-P", "--prefix", "PATH", "Install Rubinius in subdirectories of PATH" do |dir|
@bindir = dir + "/bin"
@includedir = dir + "/include"
@libdir = dir
@runtime = @libdir + "/runtime"
@lib_path = @libdir + "/lib"
@ext_path = @libdir + "/lib/ext"
@mandir = dir + "/man"
@gemsdir = dir + "/gems"
end
o.on "-B", "--bindir", "PATH", "Install Rubinius executable in PATH" do |dir|
@bindir = dir
end
o.on "-I", "--includedir", "PATH", "Install Rubinius C-API include files in PATH" do |dir|
@includedir = dir
end
o.on "-L", "--libdir", "PATH", "Install Ruby library in PATH" do |dir|
@libdir = dir + "/rubinius/#{@libversion}"
@runtime = @libdir + "/runtime"
@lib_path = @libdir + "/lib"
@ext_path = @libdir + "/lib/ext"
end
o.on "-M", "--mandir", "PATH", "Install man pages in PATH" do |dir|
@mandir = dir
end
o.on "-G", "--gemsdir", "PATH", "Install gems in PATH" do |dir|
@gemsdir = dir
end
o.doc "\n Help!"
o.on "--show", "Print the current configuration and exit" do
print_debug
exit 0
end
o.on "-V", "--verbose", "Print additional info" do
@verbose = true
end
o.help
o.doc ""
@options = o
end
def parse(ary)
@options.parse ary
end
def update_prebuilt
file = "llvm-#{@host}.tar.bz2"
full_path = "vm/external_libs/prebuilt/#{file}"
url = "http://asset.rubini.us/prebuilt/#{file}"
unless File.exists?(full_path)
dir = File.dirname(full_path)
Dir.mkdir dir unless File.directory?(dir)
puts " Fetching #{url}..."
require 'net/http'
begin
Net::HTTP.get_response(URI(url)) do |res|
size, total = 0, res.header['Content-Length'].to_i
File.open full_path, "w" do |f|
res.read_body do |chunk|
f << chunk
size += chunk.size
print "\r [ %d%% (%d of %d) ]" % [(size * 100) / total, size, total]
end
end
puts ": done!"
end
rescue Exception => e
File.unlink full_path if File.exists?(full_path)
end
unless File.exists? full_path
puts "ERROR. No #{file} available on server."
return false
end
end
puts " Prebuilt packages updated."
end
LLVM_SVN_DIR = %w!vm external_libs llvm!
LLVM_SVN_URL = "http://llvm.org/svn/llvm-project/llvm/branches/release_26/"
def setup_svn
unless File.directory?(@llvm_svn_dir)
print " Checking out LLVM from svn: #{LLVM_SVN_URL}"
unless system("svn co -q #{LLVM_SVN_URL} #{@llvm_svn_dir}")
puts " Unable to checkout from svn."
return false
end
end
if File.exists?(File.join(@llvm_svn_dir, "include"))
puts " Code appears to be proper svn tree."
@llvm = :svn
else
puts " Code in #{@llvm_svn_dir} doesn't appear to be proper LLVM tree!"
return false
end
return true
end
def setup_prebuilt
puts " Checking for prebuilt LLVM build..."
file = "vm/external_libs/prebuilt/llvm-#{@host}.tar.bz2"
update_prebuilt unless File.exists?(file)
if File.exists?(file)
print " Unpacking prebuilt LLVM for #{@host}: "
system "cd vm/external_libs; mkdir llvm; cd llvm; tar xjf ../prebuilt/llvm-#{@host}.tar.bz2"
puts "done!"
@llvm = :prebuilt
return true
end
return false
end
def setup_path
print "Validating '#{@llvm_path}': "
if File.directory? @llvm_path
["Release", "Debug"].each do |which|
sub = File.join(@llvm_path, which, "bin")
if File.directory? sub
puts "Ok! Using #{which}"
@llvm_configure = File.join(@llvm_path, which, "bin", "llvm-config")
@llvm = :config
return true
end
end
puts "ERROR. Doesn't appear to be built already!"
return false
end
puts "ERROR. Path doesn't exist."
return false
end
def setup_auto
print " Checking for existing LLVM tree: "
if File.directory?(@llvm_svn_dir)
puts "found!"
if File.exists?(File.join(@llvm_svn_dir, "Makefile.common"))
@llvm = :svn
else
@llvm = :prebuilt
end
return
else
puts "not found."
end
# If they explicitly said where LLVM is, use that and fail hard.
if @llvm_path
unless setup_path
puts "ABORT: Path '#{@llvm_path}' not a proper LLVM path"
exit 1
end
return
end
return if setup_config
return if setup_prebuilt
return if setup_svn
puts "WARNING: Unable to configure for LLVM, disabling support."
@use_llvm = false
end
def setup_config
print " Checking for 'llvm-config': "
which = ENV['PATH'].split(":").find do |path|
File.exists? File.join(path, "llvm-config")
end
if which
config = File.join(which, "llvm-config")
version = `#{config} --version`.strip
parts = version.sub(/svn$/, "").split(".").map { |i| i.to_i }
# 2.6svn is an unknown beast, don't trust it.
if version == "2.6svn" or parts[0] < 2 or parts[1] < 6
puts "too old of a version"
else
puts "found! (version #{version})"
@llvm_configure = which
@llvm = :config
return true
end
else
puts "not found"
end
false
end
def c_includes
str = []
if File.exists? "/usr/local/include"
str << "-I/usr/local/include"
end
if File.exists? "/opt/local/include"
str << "-I/opt/local/include"
end
return str.join(" ")
end
def env(which)
ENV[which] || ""
end
def has_function(name, includes=[])
print "Checking for function '#{name}': "
tf = Tempfile.new("rbx-test")
includes.each do |i|
tf.puts "#include <#{i}>"
end
tf.puts "int main() { void* ptr = &#{name}; }"
tf.close
`#{compiler} -S -o - -x c #{c_includes} #{env('CFLAGS')} #{tf.path} 2>&1`
status = ($?.exitstatus == 0)
tf.unlink
if status
puts "found!"
else
puts "not found."
end
return status
end
def detect_features
if has_function("backtrace", ["execinfo.h"])
@defines << "HAS_EXECINFO"
end
end
def process
if @use_llvm
puts "Configuring LLVM..."
setup_auto
else
print "WARNING: LLVM disabled."
end
puts
detect_features
end
def compiler
ENV['CC'] || "gcc"
end
def write_config
unless @use_llvm
@llvm = :no
@llvm_configure = ""
end
File.open @config, "w" do |f|
f.puts <<-EOC
module Rubinius
BUILD_CONFIG = {
:llvm => :#{@llvm},
:llvm_configure => "#{@llvm_configure}",
:compiler => "#{compiler()}",
:defines => #{@defines.inspect},
:host => "#{@host}",
:cpu => "#{@cpu}",
:vendor => "#{@vendor}",
:os => "#{@os}",
:bindir => "#{@bindir}",
:libdir => "#{@libdir}",
:runtime => "#{@runtime}",
:lib_path => "#{@lib_path}",
:ext_path => "#{@ext_path}",
:includedir => "#{@includedir}",
:mandir => "#{@mandir}",
:gemsdir => "#{@gemsdir}",
:program_name => "#{@program_name}",
:version => "#{@version}",
:libversion => "#{@libversion}"
}
end
EOC
end
Dir.mkdir "vm/gen" unless File.directory? "vm/gen"
File.open "vm/gen/config.h", "w" do |f|
f.puts <<-EOC
#define RBX_HOST "#{@host}"
#define RBX_CPU "#{@cpu}"
#define RBX_VENDOR "#{@vendor}"
#define RBX_OS "#{@os}"
#define RBX_BIN_PATH "#{@bindir}"
#define RBX_GEMS_PATH "#{@gemsdir}"
#define RBX_RUNTIME "#{@runtime}"
#define RBX_LIB_PATH "#{@lib_path}"
#define RBX_EXT_PATH "#{@ext_path}"
#define RBX_HDR_PATH "#{@includedir}"
#define RBX_VERSION "#{@version}"
#define RBX_LIB_VERSION "#{@libversion}"
#define RBX_BUILD_REV "#{@buildrev}"
#define RBX_LDSHARED "#{@ldshared}"
EOC
end
end
def print_debug
puts "\nUsing the following configuration to build"
puts "------------------------------------------"
system "cat config.rb"
puts "\nSetting the following defines for the VM"
puts "----------------------------------------"
system "cat vm/gen/config.h"
end
def run
options
parse ARGV
process
write_config
print_debug if @verbose
puts "\nConfigured. Run 'rake' to build and run VM tests and rubyspecs"
end
end
STDOUT.sync = true
Configure.new(root).run
Jump to Line
Something went wrong with that request. Please try again.