add JobSet class

This commit is contained in:
Josh Holtrop 2017-02-16 18:09:02 -05:00
parent c69da1044d
commit e1d8dfbab6
2 changed files with 57 additions and 0 deletions

View File

@ -2,6 +2,7 @@ require_relative "rscons/build_target"
require_relative "rscons/builder" require_relative "rscons/builder"
require_relative "rscons/cache" require_relative "rscons/cache"
require_relative "rscons/environment" require_relative "rscons/environment"
require_relative "rscons/job_set"
require_relative "rscons/varset" require_relative "rscons/varset"
require_relative "rscons/version" require_relative "rscons/version"

56
lib/rscons/job_set.rb Normal file
View File

@ -0,0 +1,56 @@
require "set"
module Rscons
# Class to keep track of a set of jobs that need to be performed.
class JobSet
# Create a JobSet
def initialize
@jobs = {}
end
# Add a job to the JobSet.
#
# @param target [Symbol, String]
# Build target name.
# @param builder [Builder]
# The {Builder} to use to build the target.
# @param sources [Array<String>]
# Source file name(s).
# @param vars [Hash]
# Construction variable overrides.
def add_job(builder, target, sources, vars)
@jobs[target] = {
builder: builder,
target: target,
sources: sources,
vars: vars,
}
end
# Get the next job that is ready to run from the JobSet.
#
# This method will remove the job from the JobSet.
#
# @return [nil, Hash]
# The next job to run.
def get_next_job_to_run
if @jobs.size > 0
evaluated_targets = Set.new
attempt = lambda do |target|
evaluated_targets << target
@jobs[target][:sources].each do |src|
if @jobs.include?(src) and not evaluated_targets.include?(src)
return attempt[src]
end
end
job = @jobs[target].merge(target: target)
@jobs.delete(target)
return job
end
attempt[@jobs.first.first]
end
end
end
end