misc/monkeypatches.rb
author Mahlon E. Smith <mahlon@martini.nu>
Mon, 18 Aug 2008 06:25:08 +0000
branchmahlon-misc
changeset 8 296a03a08be2
parent 1 09d0d209d06d
child 2 0c24586f579a
child 9 4c51ebe6e9b6
permissions -rw-r--r--
Branching for experimental work. ie: I know the bsd jail subsystem _real_ well, but using this project as a guinea pig to 'get to know' the ruby C bindings. :)

### Monkeypatch to work around the broken Rakefile generated by Mkrf <= 0.2.3

# This fixes:
# * Some weird unnecessary string interpolation
# * The :install task doesn't work unless you have RUBYARCHDIR in your environment, instead of
#   falling back to CONFIG['sitearchdir'].
# * The :install task created the target install directory every time instead of just
#   declaring a dependency on a directory task

require 'mkrf/generator'

RAKEFILE_TEMPLATE = %q{
	# Generated by monkeypatched mkrf
	require 'rake/clean'
	require 'rbconfig'

	include Config

	SRC = FileList[#{sources.join(',')}]
	OBJ = SRC.ext('#{objext}')
	CC = '#{@cc}'

	ADDITIONAL_OBJECTS = '#{objects}'

	LDSHARED = "#{@available.ldshared_string} #{ldshared}"

	LIBPATH =  "#{library_path(CONFIG['libdir'])} #{@available.library_paths_compile_string}"

	INCLUDES = "#{@available.includes_compile_string}"

	LIBS = "#{@available.library_compile_string}"

	CFLAGS = "#{cflags} #{defines_compile_string}"

	RUBYARCHDIR = ENV["RUBYARCHDIR"] || CONFIG['sitearchdir']
	LIBRUBYARG_SHARED = "#{CONFIG['LIBRUBYARG_SHARED']}"
	EXT = '#{@extension_name}'

	CLEAN.include( EXT, '*.#{objext}' )
	CLOBBER.include( 'mkrf.log' )

	task :default => EXT

	rule '.#{objext}' => '.#{@source_extension}' do |t|
	  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}"
	end


	directory RUBYARCHDIR

	desc "Install this extension"
	task :install => [EXT, RUBYARCHDIR] do
	  install EXT, RUBYARCHDIR, :verbose => true
	end

	#{additional_code}
}.gsub( /^\t/m, '' )



module Mkrf

	class Availability
		# No-op the stupid squashing of output
		def silence_stream( stream )
			old_stream = stream.dup
			stream.reopen( @logger.instance_variable_get(:@logdev).dev )
			stream.sync = true
			yield
		ensure
			stream.reopen( old_stream )
		end
	end

	class Generator

		def rakefile_contents # :nodoc:
			objext = CONFIG['OBJEXT']
			return interpolate( RAKEFILE_TEMPLATE, binding() )
		end


		### Interpolate any '#{...}' placeholders in the string within the given
		### +scope+ (a Binding object).
	    def interpolate( string, scope )
	        unless scope.is_a?( Binding )
	            raise TypeError, "Argument to interpolate must be a Binding, not "\
	                "a #{scope.class.name}"
	        end

			# $stderr.puts ">>> Interpolating '#{self}'..."

	        copy = string.gsub( /"/, %q:\": )
	        eval( '"' + copy + '"', scope )
		rescue Exception => err
			nicetrace = err.backtrace.find_all {|frame|
				/in `(interpolate|eval)'/i !~ frame
			}
			Kernel.raise( err, err.message, nicetrace )
	    end

	end # class Generator

end # module Mkrf