From dee2b98f6e7f8f232b946ab6262ae378fccb9791 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 19 Sep 2014 11:10:59 -0400 Subject: [PATCH] allow build hooks to register new build targets - close #15 --- lib/rscons/environment.rb | 19 ++++++++++--------- spec/build_tests_spec.rb | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/lib/rscons/environment.rb b/lib/rscons/environment.rb index 7f435c3..e3eed64 100644 --- a/lib/rscons/environment.rb +++ b/lib/rscons/environment.rb @@ -216,23 +216,25 @@ module Rscons # # @return [void] def process - unless @targets.empty? - expand_paths! + expand_paths! + while @targets.size > 0 + targets = @targets + @targets = {} cache = Cache.instance cache.clear_checksum_cache! targets_processed = {} process_target = proc do |target| targets_processed[target] ||= begin - @targets[target][:sources].each do |src| - if @targets.include?(src) and not targets_processed.include?(src) + targets[target][:sources].each do |src| + if targets.include?(src) and not targets_processed.include?(src) process_target.call(src) end end - result = run_builder(@targets[target][:builder], + result = run_builder(targets[target][:builder], target, - @targets[target][:sources], + targets[target][:sources], cache, - @targets[target][:vars] || {}) + targets[target][:vars] || {}) unless result raise BuildError.new("Failed to build #{target}") end @@ -240,14 +242,13 @@ module Rscons end end begin - @targets.each do |target, target_params| + targets.each do |target, target_params| process_target.call(target) end ensure cache.write end end - clear_targets end # Clear all targets registered for the Environment. diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index 2f6a81b..9c2f568 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -10,6 +10,7 @@ class Dir end describe Rscons do + BUILD_TEST_RUN_DIR = "build_test_run" def rm_rf(dir) @@ -574,4 +575,20 @@ EOF expect(e2.expand_varref("${computed}")).to eq("-H38xyz") expect(env.expand_varref("${lambda_recurse}")).to eq("-Hello") end + + it "supports registering build targets from within a build hook" do + test_dir("simple") + Rscons::Environment.new do |env| + env.Program("simple", Dir["*.c"]) + env.add_build_hook do |build_op| + if build_op[:target].end_with?(".o") + env.Disassemble("#{build_op[:target]}.txt", build_op[:target]) + end + end + end + expect(File.exists?("simple.o")).to be_truthy + expect(File.exists?("simple.o.txt")).to be_truthy + expect(`./simple`).to eq "This is a simple C program\n" + end + end