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 )