diff --git a/build_tests/simple/user_dep_build_order.rb b/build_tests/simple/user_dep_build_order.rb new file mode 100644 index 0000000..c6afd2b --- /dev/null +++ b/build_tests/simple/user_dep_build_order.rb @@ -0,0 +1,22 @@ +class TestBuilder < Rscons::Builder + def run(options) + target, env, vars, cache = options.values_at(:target, :env, :vars, :cache) + if target == "two" + return false unless File.exists?("one") + end + wait_time = env.expand_varref("${wait_time}", vars) + command = ["ruby", "-e", "require 'fileutils'; sleep #{wait_time}; FileUtils.touch('#{target}');"] + standard_threaded_build("TestBuilder", target, command, [], env, cache) + end + + def finalize(options) + standard_finalize(options) + end +end + +Rscons::Environment.new do |env| + env.add_builder(TestBuilder.new) + env.TestBuilder("one", [], "wait_time" => "3") + env.TestBuilder("two", [], "wait_time" => "0") + env.depends("two", "one") +end diff --git a/lib/rscons/environment.rb b/lib/rscons/environment.rb index 0239470..d85e821 100644 --- a/lib/rscons/environment.rb +++ b/lib/rscons/environment.rb @@ -451,6 +451,7 @@ module Rscons user_deps = user_deps.map {|ud| expand_varref(ud)} @user_deps[target] ||= [] @user_deps[target] = (@user_deps[target] + user_deps).uniq + build_after(target, user_deps) end # Manually record the given target(s) as needing to be built after the diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index 88761cb..9b96fc8 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -746,6 +746,12 @@ EOF expect(result.status).to_not eq 0 end + it "orders builds to respect user dependencies" do + test_dir("simple") + result = run_test(rsconsfile: "user_dep_build_order.rb", rscons_args: %w[-j4]) + expect(result.stderr).to eq "" + end + context "backward compatibility" do it "allows a builder to call Environment#run_builder in a non-threaded manner" do test_dir("simple")