metasploit-framework/lib/gemcache/ruby/1.9.1/arch/linux64/pg-0.13.2/Rakefile.cross

240 lines
7.0 KiB
Ruby

#!/usr/bin/env rake
require 'uri'
require 'tempfile'
require 'rbconfig'
require 'rake/clean'
require 'rake/extensiontask'
require 'rake/extensioncompiler'
MISCDIR = BASEDIR + 'misc'
NUM_CPUS = if File.exist?('/proc/cpuinfo')
File.read('/proc/cpuinfo').scan('processor').length
elsif RUBY_PLATFORM.include?( 'darwin' )
`system_profiler SPHardwareDataType | grep 'Cores' | awk '{print $5}'`.chomp
else
1
end
# Cross-compilation constants
OPENSSL_VERSION = ENV['OPENSSL_VERSION'] || '1.0.0e'
POSTGRESQL_VERSION = ENV['POSTGRESQL_VERSION'] || '9.1.1'
COMPILE_HOME = Pathname( "./build" ).expand_path
STATIC_SOURCESDIR = COMPILE_HOME + 'sources'
STATIC_BUILDDIR = COMPILE_HOME + 'builds'
# Static OpenSSL build vars
STATIC_OPENSSL_BUILDDIR = STATIC_BUILDDIR + "openssl-#{OPENSSL_VERSION}"
OPENSSL_SOURCE_URI =
URI( "http://www.openssl.org/source/openssl-#{OPENSSL_VERSION}.tar.gz" )
OPENSSL_TARBALL = STATIC_SOURCESDIR + File.basename( OPENSSL_SOURCE_URI.path )
OPENSSL_MAKEFILE = STATIC_OPENSSL_BUILDDIR + 'Makefile'
LIBSSLEAY32 = STATIC_OPENSSL_BUILDDIR + 'libssleay32.a'
LIBEAY32 = STATIC_OPENSSL_BUILDDIR + 'libeay32.a'
OPENSSL_PATCHES = Rake::FileList[ MISCDIR + "openssl-#{OPENSSL_VERSION}.*.patch" ]
# Static PostgreSQL build vars
STATIC_POSTGRESQL_BUILDDIR = STATIC_BUILDDIR + "postgresql-#{POSTGRESQL_VERSION}"
POSTGRESQL_SOURCE_URI = begin
uristring = "http://ftp.postgresql.org/pub/source/v%s/postgresql-%s.tar.bz2" %
[ POSTGRESQL_VERSION, POSTGRESQL_VERSION ]
URI( uristring )
end
POSTGRESQL_TARBALL = STATIC_SOURCESDIR + File.basename( POSTGRESQL_SOURCE_URI.path )
STATIC_POSTGRESQL_SRCDIR = STATIC_POSTGRESQL_BUILDDIR + 'src'
STATIC_POSTGRESQL_LIBDIR = STATIC_POSTGRESQL_SRCDIR + 'interfaces/libpq'
STATIC_POSTGRESQL_INCDIR = STATIC_POSTGRESQL_SRCDIR + 'include'
POSTGRESQL_GLOBAL_MAKEFILE = STATIC_POSTGRESQL_SRCDIR + 'Makefile.global'
POSTGRESQL_SHLIB_MAKEFILE = STATIC_POSTGRESQL_SRCDIR + 'Makefile.shlib'
POSTGRESQL_SHLIB_MF_ORIG = STATIC_POSTGRESQL_SRCDIR + 'Makefile.shlib.orig'
POSTGRESQL_LIB = STATIC_POSTGRESQL_LIBDIR + 'libpq.a'
CROSS_PREFIX = begin
Rake::ExtensionCompiler.mingw_host
rescue => err
$stderr.puts "Cross-compilation disabled -- %s" % [ err.message ]
'unknown'
end
# clean intermediate files and folders
CLEAN.include( STATIC_BUILDDIR.to_s )
ENV['RUBY_CC_VERSION'] ||= '1.8.7:1.9.3'
def download(url, save_to)
part = save_to+".part"
sh "wget #{url.to_s.inspect} -O #{part.inspect} || curl #{url.to_s.inspect} -o #{part.inspect}"
FileUtils.mv part, save_to
end
def run(*args)
sh *args
end
#####################################################################
### C R O S S - C O M P I L A T I O N - T A S K S
#####################################################################
directory STATIC_SOURCESDIR.to_s
#
# Static OpenSSL build tasks
#
directory STATIC_OPENSSL_BUILDDIR.to_s
# openssl source file should be stored there
file OPENSSL_TARBALL => STATIC_SOURCESDIR do |t|
download( OPENSSL_SOURCE_URI, t.name )
end
# Extract the openssl builds
file STATIC_OPENSSL_BUILDDIR => OPENSSL_TARBALL do |t|
puts "extracting %s to %s" % [ OPENSSL_TARBALL, STATIC_OPENSSL_BUILDDIR.parent ]
STATIC_OPENSSL_BUILDDIR.mkpath
run 'tar', '-xzf', OPENSSL_TARBALL.to_s, '-C', STATIC_OPENSSL_BUILDDIR.parent.to_s
OPENSSL_MAKEFILE.unlink if OPENSSL_MAKEFILE.exist?
OPENSSL_PATCHES.each do |patchfile|
puts " applying patch #{patchfile}..."
run 'patch', '-Np1', '-d', STATIC_OPENSSL_BUILDDIR.to_s,
'-i', File.expand_path( patchfile, BASEDIR )
end
end
CMD_PRELUDE = [
'env',
"CC=#{CROSS_PREFIX}-gcc",
"CFLAGS=-DDSO_WIN32",
"AR=#{CROSS_PREFIX}-ar",
"RANLIB=#{CROSS_PREFIX}-ranlib"
]
# generate the makefile in a clean build location
file OPENSSL_MAKEFILE => STATIC_OPENSSL_BUILDDIR do |t|
Dir.chdir( STATIC_OPENSSL_BUILDDIR ) do
cmd = CMD_PRELUDE.dup
cmd << "./Configure" << 'mingw'
run( *cmd )
end
end
desc "compile static openssl libraries"
task :openssl_libs => [ LIBSSLEAY32, LIBEAY32 ]
task :compile_static_openssl => OPENSSL_MAKEFILE do |t|
Dir.chdir( STATIC_OPENSSL_BUILDDIR ) do
cmd = CMD_PRELUDE.dup
cmd << 'make' << "-j#{NUM_CPUS}" << 'build_libs'
run( *cmd )
end
end
desc "compile static #{LIBEAY32}"
file LIBEAY32 => :compile_static_openssl do |t|
FileUtils.cp( STATIC_OPENSSL_BUILDDIR + 'libcrypto.a', LIBEAY32.to_s )
end
desc "compile static #{LIBSSLEAY32}"
file LIBSSLEAY32 => :compile_static_openssl do |t|
FileUtils.cp( STATIC_OPENSSL_BUILDDIR + 'libssl.a', LIBSSLEAY32.to_s )
end
#
# Static PostgreSQL build tasks
#
directory STATIC_POSTGRESQL_BUILDDIR.to_s
# postgresql source file should be stored there
file POSTGRESQL_TARBALL => STATIC_SOURCESDIR do |t|
download( POSTGRESQL_SOURCE_URI, t.name )
end
# Extract the postgresql sources
file STATIC_POSTGRESQL_BUILDDIR => POSTGRESQL_TARBALL do |t|
puts "extracting %s to %s" % [ POSTGRESQL_TARBALL, STATIC_POSTGRESQL_BUILDDIR.parent ]
STATIC_POSTGRESQL_BUILDDIR.mkpath
run 'tar', '-xjf', POSTGRESQL_TARBALL.to_s, '-C', STATIC_POSTGRESQL_BUILDDIR.parent.to_s
mv POSTGRESQL_SHLIB_MAKEFILE, POSTGRESQL_SHLIB_MF_ORIG
end
# generate the makefile in a clean build location
file POSTGRESQL_GLOBAL_MAKEFILE => [ STATIC_POSTGRESQL_BUILDDIR, :openssl_libs ] do |t|
options = [
'--target=i386-mingw32',
"--host=#{Rake::ExtensionCompiler.mingw_host}",
'--with-openssl',
'--without-zlib',
'--disable-shared',
]
Dir.chdir( STATIC_POSTGRESQL_BUILDDIR ) do
configure_path = STATIC_POSTGRESQL_BUILDDIR + 'configure'
cmd = [ configure_path.to_s, *options ]
cmd << "CFLAGS=-L#{STATIC_OPENSSL_BUILDDIR}"
cmd << "LDFLAGS=-L#{STATIC_OPENSSL_BUILDDIR}"
cmd << "LDFLAGS_SL=-L#{STATIC_OPENSSL_BUILDDIR}"
cmd << "LIBS=-lwsock32 -lws2_32 -lgdi32"
cmd << "CPPFLAGS=-I#{STATIC_OPENSSL_BUILDDIR}/include"
run( *cmd )
end
end
# patch the Makefile.shlib -- depend on the build dir so it's only
# rewritten if the tarball is re-extracted.
file POSTGRESQL_SHLIB_MAKEFILE => POSTGRESQL_SHLIB_MF_ORIG do |t|
tf = Tempfile.new( POSTGRESQL_SHLIB_MAKEFILE.basename )
POSTGRESQL_SHLIB_MF_ORIG.open( File::RDONLY ) do |ifh|
ifh.each_line do |line|
tf.print( line.sub(/^(\s*haslibarule\s*=\s*yes)/, "# \\1 ") )
end
end
tf.close
FileUtils.mv( tf.path, t.name, :verbose => $puts )
end
# make libpq.a
task POSTGRESQL_LIB => [ POSTGRESQL_GLOBAL_MAKEFILE, POSTGRESQL_SHLIB_MAKEFILE ] do |t|
Dir.chdir( POSTGRESQL_LIB.dirname ) do
sh 'make', "-j#{NUM_CPUS}", POSTGRESQL_LIB.basename.to_s, 'PORTNAME=win32'
end
end
#desc 'compile static libpg.a'
task :static_libpq => POSTGRESQL_LIB
desc 'cross compile pg for win32'
task :cross do
ENV['CROSS_COMPILING'] = 'yes'
end
task :cross => [ :mingw32, :static_libpq ]
task :mingw32 do
# Use Rake::ExtensionCompiler helpers to find the proper host
unless Rake::ExtensionCompiler.mingw_host then
warn "You need to install mingw32 cross compile functionality to be able to continue."
warn "Please refer to your distribution/package manager documentation about installation."
fail
end
end