From d01767981c8b1e95eabf84ecd135da49e0153b5d Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 8 Nov 2013 14:52:39 -0500 Subject: [PATCH] add Environment#build_root to be used if no build directories match --- lib/rscons/environment.rb | 12 ++++++++++-- spec/build_tests_spec.rb | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/lib/rscons/environment.rb b/lib/rscons/environment.rb index 84a4a5a..982eaf1 100644 --- a/lib/rscons/environment.rb +++ b/lib/rscons/environment.rb @@ -9,6 +9,9 @@ module Rscons # Hash of +{"builder_name" => builder_object}+ pairs. attr_reader :builders + # String or +nil+ + attr_accessor :build_root + # Create an Environment object. # @param variables [Hash] # The variables hash can contain construction variables, which are @@ -88,14 +91,19 @@ module Rscons # This method takes into account the Environment's build directories. def get_build_fname(source_fname, suffix) build_fname = source_fname.set_suffix(suffix).gsub('\\', '/') - @build_dirs.each do |src_dir, obj_dir| + found_match = @build_dirs.find do |src_dir, obj_dir| if src_dir.is_a?(Regexp) build_fname.sub!(src_dir, obj_dir) else build_fname.sub!(%r{^#{src_dir}/}, "#{obj_dir}/") end - build_fname.gsub!('\\', '/') end + if @build_root and not found_match + unless source_fname.start_with?('/') or source_fname =~ %r{^\w:[\\/]} + build_fname = "#{@build_root}/#{build_fname}" + end + end + build_fname.gsub!('\\', '/') build_fname end diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index b3735c8..a7837bf 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -158,6 +158,28 @@ describe Rscons do File.exists?('build_two/two.o').should be_true end + it 'uses build directories before build root' do + test_dir('build_dir') + Rscons::Environment.new do |env| + env.append('CPPPATH' => Dir['src/**/*/']) + env.build_dir("src", "build") + env.build_root = "build_root" + env.Program('build_dir', Dir['src/**/*.c']) + end + lines.should == ["CC build/one/one.o", "CC build/two/two.o", "LD build_dir"] + end + + it 'uses build_root if no build directories match' do + test_dir('build_dir') + Rscons::Environment.new do |env| + env.append('CPPPATH' => Dir['src/**/*/']) + env.build_dir("src2", "build") + env.build_root = "build_root" + env.Program('build_dir', Dir['src/**/*.c']) + end + lines.should == ["CC build_root/src/one/one.o", "CC build_root/src/two/two.o", "LD build_dir"] + end + it 'cleans built files' do test_dir('build_dir') Rscons::Environment.new do |env|