misc/monkeypatches.rb
changeset 2 0c24586f579a
parent 1 09d0d209d06d
--- 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:
+		# * <tt>:loaded_libs</tt> -- libraries to load by default
+		# * <tt>:library_paths</tt> -- libraries paths to include by default
+		# * <tt>:headers</tt> -- headers to load by default
+		# * <tt>:compiler</tt> -- which compiler to use when determining availability
+		# * <tt>:includes</tt> -- 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 )