allow build hooks to register new build targets - close #15
This commit is contained in:
parent
b186b3102c
commit
dee2b98f6e
@ -216,23 +216,25 @@ module Rscons
|
|||||||
#
|
#
|
||||||
# @return [void]
|
# @return [void]
|
||||||
def process
|
def process
|
||||||
unless @targets.empty?
|
expand_paths!
|
||||||
expand_paths!
|
while @targets.size > 0
|
||||||
|
targets = @targets
|
||||||
|
@targets = {}
|
||||||
cache = Cache.instance
|
cache = Cache.instance
|
||||||
cache.clear_checksum_cache!
|
cache.clear_checksum_cache!
|
||||||
targets_processed = {}
|
targets_processed = {}
|
||||||
process_target = proc do |target|
|
process_target = proc do |target|
|
||||||
targets_processed[target] ||= begin
|
targets_processed[target] ||= begin
|
||||||
@targets[target][:sources].each do |src|
|
targets[target][:sources].each do |src|
|
||||||
if @targets.include?(src) and not targets_processed.include?(src)
|
if targets.include?(src) and not targets_processed.include?(src)
|
||||||
process_target.call(src)
|
process_target.call(src)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
result = run_builder(@targets[target][:builder],
|
result = run_builder(targets[target][:builder],
|
||||||
target,
|
target,
|
||||||
@targets[target][:sources],
|
targets[target][:sources],
|
||||||
cache,
|
cache,
|
||||||
@targets[target][:vars] || {})
|
targets[target][:vars] || {})
|
||||||
unless result
|
unless result
|
||||||
raise BuildError.new("Failed to build #{target}")
|
raise BuildError.new("Failed to build #{target}")
|
||||||
end
|
end
|
||||||
@ -240,14 +242,13 @@ module Rscons
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
begin
|
begin
|
||||||
@targets.each do |target, target_params|
|
targets.each do |target, target_params|
|
||||||
process_target.call(target)
|
process_target.call(target)
|
||||||
end
|
end
|
||||||
ensure
|
ensure
|
||||||
cache.write
|
cache.write
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
clear_targets
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Clear all targets registered for the Environment.
|
# Clear all targets registered for the Environment.
|
||||||
|
@ -10,6 +10,7 @@ class Dir
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe Rscons do
|
describe Rscons do
|
||||||
|
|
||||||
BUILD_TEST_RUN_DIR = "build_test_run"
|
BUILD_TEST_RUN_DIR = "build_test_run"
|
||||||
|
|
||||||
def rm_rf(dir)
|
def rm_rf(dir)
|
||||||
@ -574,4 +575,20 @@ EOF
|
|||||||
expect(e2.expand_varref("${computed}")).to eq("-H38xyz")
|
expect(e2.expand_varref("${computed}")).to eq("-H38xyz")
|
||||||
expect(env.expand_varref("${lambda_recurse}")).to eq("-Hello")
|
expect(env.expand_varref("${lambda_recurse}")).to eq("-Hello")
|
||||||
end
|
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
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user