From e1d8dfbab672d2f19ecf0c3af8f7e0f3f2385858 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 16 Feb 2017 18:09:02 -0500 Subject: [PATCH] add JobSet class --- lib/rscons.rb | 1 + lib/rscons/job_set.rb | 56 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 lib/rscons/job_set.rb diff --git a/lib/rscons.rb b/lib/rscons.rb index a7e8f08..c760982 100644 --- a/lib/rscons.rb +++ b/lib/rscons.rb @@ -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" diff --git a/lib/rscons/job_set.rb b/lib/rscons/job_set.rb new file mode 100644 index 0000000..76de53e --- /dev/null +++ b/lib/rscons/job_set.rb @@ -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] + # 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