diff -r 09d0d209d06d -r 0c24586f579a misc/monkeypatches.rb
--- a/misc/monkeypatches.rb Fri Aug 15 16:23:03 2008 +0000
+++ b/misc/monkeypatches.rb Thu Oct 16 02:43:08 2008 +0000
@@ -42,12 +42,14 @@
task :default => EXT
rule '.#{objext}' => '.#{@source_extension}' do |t|
- sh "\#{CC} \#{CFLAGS} \#{INCLUDES} -c \#{t.source}"
+ $stderr.puts " building \#{t.name} from \#{t.source}"
+ sh "\#{CC} \#{CFLAGS} \#{INCLUDES} -c \#{t.source}"
end
desc "Build this extension"
file EXT => OBJ do
- sh "\#{LDSHARED} \#{LIBPATH} #{@available.ld_outfile(@extension_name)} \#{OBJ} \#{ADDITIONAL_OBJECTS} \#{LIBS} \#{LIBRUBYARG_SHARED}"
+ $stderr.puts " linking \#{OBJ.join(', ')} into \#{EXT}"
+ sh "\#{LDSHARED} \#{LIBPATH} #{@available.ld_outfile(@extension_name)} \#{OBJ} \#{ADDITIONAL_OBJECTS} \#{LIBS} \#{LIBRUBYARG_SHARED}"
end
@@ -55,7 +57,7 @@
desc "Install this extension"
task :install => [EXT, RUBYARCHDIR] do
- install EXT, RUBYARCHDIR, :verbose => true
+ install EXT, RUBYARCHDIR, :verbose => true
end
#{additional_code}
@@ -66,7 +68,83 @@
module Mkrf
class Availability
- # No-op the stupid squashing of output
+
+ # Create a new Availability instance.
+ #
+ # Valid keys for the options hash include:
+ # * :loaded_libs -- libraries to load by default
+ # * :library_paths -- libraries paths to include by default
+ # * :headers -- headers to load by default
+ # * :compiler -- which compiler to use when determining availability
+ # * :includes -- directories that should be searched for include files
+ def initialize(options = {})
+ @loaded_libs = options[:loaded_libs] || []
+ @loaded_libs.flatten!
+
+ @library_paths = [(options[:library_paths] || [])].flatten
+ # Not sure what COMMON_HEADERS looks like when populated
+ @headers = options[:headers] || [] # Config::CONFIG["COMMON_HEADERS"]
+ @compiler = options[:compiler] || Config::CONFIG["CC"]
+ @includes = [(options[:includes] || DEFAULT_INCLUDES)].flatten
+ @logger = Logger.new('mkrf.log')
+ @defines = []
+ end
+
+
+ def can_link?( function_body )
+ silence_command_line do
+ create_source(function_body)
+ cmd = link_command()
+ @logger.debug "Running link command: #{cmd}"
+ system( cmd )
+ end
+ ensure
+ FileUtils.rm_f TEMP_SOURCE_FILE
+ FileUtils.rm_f TEMP_EXECUTABLE
+ end
+
+
+ # Add the LIBRUBYARG_SHARED setting to the library paths for non-windows boxen. This is
+ # necessary if Ruby is installed in a directory that isn't in the default library
+ # search path (e.g., on FreeBSD where Ruby is /usr/local/bin/ruby).
+ def library_paths_compile_string
+ if RUBY_PLATFORM =~ /mswin/
+ @library_paths.collect {|l| "/libpath:#{l}"}.join(' ')
+ else
+ Config::CONFIG['LIBRUBYARG_SHARED'] + @library_paths.collect {|l| "-L#{l}"}.join(' ')
+ end
+ end
+
+
+ # Separate includes with a newline instead of a literal '\n'
+ def header_include_string
+ @headers.collect {|header| "#include <#{header}>"}.join( "\n" )
+ end
+
+
+ # Log the created source to the logfile
+ def create_source( src )
+ @logger.debug "Creating source file:\n#{src}"
+ File.open( TEMP_SOURCE_FILE, "w+" ) do |f|
+ f.write( src )
+ end
+ end
+
+ # Prepend the LIBS string directly to the @loaded_libs, as not all arguments in
+ # it
+ def library_compile_string
+ added_libs = nil
+ if RUBY_PLATFORM =~ /mswin/
+ added_libs = @loaded_libs.join(' ')
+ else
+ added_libs = @loaded_libs.collect {|l| "-l#{l}"}.join(' ')
+ end
+
+ return Config::CONFIG["LIBS"] + ' ' + added_libs
+ end
+
+
+ # Redirect to the mkrf log instead of /dev/null
def silence_stream( stream )
old_stream = stream.dup
stream.reopen( @logger.instance_variable_get(:@logdev).dev )