TeapotSourceTeapotCommandBuild

class Build

A command to build targets in the project.

Nested

Definitions

def call

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

Signature

returns Build::Dependency::Chain

The dependency chain.

Implementation

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

def show_dependencies(walker)

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

Signature

parameter walker Build::Walker

The build walker.

Implementation

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