47 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
 | 
						|
# modified version of Rake's provided make-style dependency loader
 | 
						|
# customizations: 
 | 
						|
#  (1) handles windows drives in paths -- colons don't confuse task demarcation
 | 
						|
#  (2) handles spaces in directory paths
 | 
						|
 | 
						|
module Rake
 | 
						|
 | 
						|
  # Makefile loader to be used with the import file loader.
 | 
						|
  class MakefileLoader
 | 
						|
 | 
						|
    # Load the makefile dependencies in +fn+.
 | 
						|
    def load(fn)
 | 
						|
      open(fn) do |mf|
 | 
						|
        lines = mf.read
 | 
						|
        lines.gsub!(/#[^\n]*\n/m, "") # remove comments
 | 
						|
        lines.gsub!(/\\\n/, ' ')      # string together line continuations into single line
 | 
						|
        lines.split("\n").each do |line|
 | 
						|
          process_line(line)
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    private
 | 
						|
 | 
						|
    # Process one logical line of makefile data.
 | 
						|
    def process_line(line)
 | 
						|
      # split on presence of task demaractor followed by space (i.e don't get confused by a colon in a win path)
 | 
						|
      file_tasks, args = line.split(/:\s/)
 | 
						|
 | 
						|
      return if args.nil?
 | 
						|
      
 | 
						|
      # split at non-escaped space boundary between files (i.e. escaped spaces in paths are left alone)
 | 
						|
      dependents = args.split(/\b\s+/)
 | 
						|
      # replace escaped spaces and clean up any extra whitespace
 | 
						|
      dependents.map! { |path| path.gsub(/\\ /, ' ').strip }
 | 
						|
 | 
						|
      file_tasks.strip.split.each do |file_task|
 | 
						|
        file file_task => dependents
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  # Install the handler
 | 
						|
  Rake.application.add_loader('mf', MakefileLoader.new)
 | 
						|
end
 |