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 |