misc/monkeypatches.rb
branchmahlon-misc
changeset 9 4c51ebe6e9b6
parent 1 09d0d209d06d
child 10 b1426511fb64
--- a/misc/monkeypatches.rb	Mon Aug 18 06:25:08 2008 +0000
+++ b/misc/monkeypatches.rb	Tue Oct 14 16:11:19 2008 +0000
@@ -66,7 +66,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 )