Class: Teapot::Command::Build

Inherits:
Selection
  • Object
show all
Defined in:
lib/teapot/command/build.rb

Overview

A command to build targets in the project.

Instance Method Summary collapse

Methods inherited from Selection

#selection, #targets

Instance Method Details

#callObject

Build the selected targets or default build targets, resolving dependencies and executing the build controller.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/teapot/command/build.rb', line 31

def call
	context = parent.context
	
	# The targets to build:
	if @targets.any?
		selection = context.select(@targets)
	else
		selection = context.select(context.configuration.targets[:build])
	end
	
	chain = selection.chain
	environment = context.configuration.environment
	
	controller = ::Build::Controller.build(limit: @options[:limit]) do |builder|
		builder.add_chain(chain, self.argv, environment)
	end
	
	walker = nil
	
	# We need to catch interrupt here, and exit with the correct exit code:
	begin
		controller.run do |walker|
			show_dependencies(walker) if @options[:show_dependencies]
			
			# Only run once is asked:
			unless @options[:continuous]
				if walker.failed?
					raise BuildFailedError.new("Failed to build all nodes successfully!")
				end
				
				break
			end
		end
	rescue Interrupt
		if walker && walker.failed?
			raise BuildFailedError.new("Failed to build all nodes successfully!")
		end
	end
	
	return chain
end

#show_dependencies(walker) ⇒ Object

Display task dependencies for debugging, showing which tasks generate which outputs.



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/teapot/command/build.rb', line 75

def show_dependencies(walker)
	outputs = {}
	
	walker.tasks.each do |node, task|
		# puts "Task #{task} (#{node}) outputs:"
		
		task.outputs.each do |path|
			path = path.to_s
			
			# puts "\t#{path}"
			
			outputs[path] = task
		end
	end
	
	walker.tasks.each do |node, task|
		dependencies = {}
		task.inputs.each do |path|
			path = path.to_s
			
			if generating_task = outputs[path]
				dependencies[path] = generating_task
			end
		end
		
		puts "Task #{task.inspect} has #{dependencies.count} dependencies."
		dependencies.each do |path, task|
			puts "\t#{task.inspect}: #{path}"
		end
	end
end