add JobSet class
This commit is contained in:
parent
c69da1044d
commit
e1d8dfbab6
@ -2,6 +2,7 @@ require_relative "rscons/build_target"
|
||||
require_relative "rscons/builder"
|
||||
require_relative "rscons/cache"
|
||||
require_relative "rscons/environment"
|
||||
require_relative "rscons/job_set"
|
||||
require_relative "rscons/varset"
|
||||
require_relative "rscons/version"
|
||||
|
||||
|
56
lib/rscons/job_set.rb
Normal file
56
lib/rscons/job_set.rb
Normal 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
|
Loading…
x
Reference in New Issue
Block a user