From 295324eafd6d1915e8c32630915f981aaee1cb88 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 27 Dec 2013 14:31:46 -0500 Subject: [PATCH] add Environment#depends() to specify user dependencies for a build target --- lib/rscons/environment.rb | 10 +++++++++- spec/build_tests_spec.rb | 31 +++++++++++++++++++++++++++++++ spec/rscons/environment_spec.rb | 14 ++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/lib/rscons/environment.rb b/lib/rscons/environment.rb index ba51fae..5d7c187 100644 --- a/lib/rscons/environment.rb +++ b/lib/rscons/environment.rb @@ -26,6 +26,7 @@ module Rscons def initialize(options = {}) @varset = VarSet.new @targets = {} + @user_deps = {} @builders = {} @build_dirs = [] @build_hooks = [] @@ -147,7 +148,7 @@ module Rscons result = run_builder(@targets[target][:builder], target, @targets[target][:source], - [], + @user_deps[target] || [], cache, @targets[target][:vars] || {}) unless result @@ -221,6 +222,13 @@ module Rscons end end + # Manually record a given target as depending on the specified + # dependency files. + def depends(target, *user_deps) + @user_deps[target] ||= [] + @user_deps[target] = (@user_deps[target] + user_deps).uniq + end + # Build a list of source files into files containing one of the suffixes # given by suffixes. # This method is used internally by RScons builders. diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index 77c22ec..5800a9b 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -328,6 +328,37 @@ EOF ] end + it 'rebuilds when user-specified dependencies change' do + test_dir('simple') + Rscons::Environment.new do |env| + env.Program('simple', Dir['*.c']) + File.open("file.ld", "w") do |fh| + fh.puts("foo") + end + env.depends('simple', 'file.ld') + end + lines.should == ["CC simple.o", "LD simple"] + File.exists?('simple.o').should be_true + `./simple`.should == "This is a simple C program\n" + Rscons::Environment.new do |env| + env.Program('simple', Dir['*.c']) + File.open("file.ld", "w") do |fh| + fh.puts("bar") + end + env.depends('simple', 'file.ld') + end + lines.should == ["LD simple"] + Rscons::Environment.new do |env| + env.Program('simple', Dir['*.c']) + File.unlink("file.ld") + end + lines.should == ["LD simple"] + Rscons::Environment.new do |env| + env.Program('simple', Dir['*.c']) + end + lines.should == [] + end + unless ENV["omit_gdc_tests"] it "supports building D sources" do test_dir("d") diff --git a/spec/rscons/environment_spec.rb b/spec/rscons/environment_spec.rb index 9aa4131..6b63e73 100644 --- a/spec/rscons/environment_spec.rb +++ b/spec/rscons/environment_spec.rb @@ -230,6 +230,20 @@ module Rscons end end + describe "#depends" do + it "records the given dependencies in @user_deps" do + env = Environment.new + env.depends("foo", "bar", "baz") + env.instance_variable_get(:@user_deps).should == {"foo" => ["bar", "baz"]} + end + it "records user dependencies only once" do + env = Environment.new + env.instance_variable_set(:@user_deps, {"foo" => ["bar"]}) + env.depends("foo", "bar", "baz") + env.instance_variable_get(:@user_deps).should == {"foo" => ["bar", "baz"]} + end + end + describe "#build_sources" do class ABuilder < Builder def produces?(target, source, env)