add Environment#build_root to be used if no build directories match

This commit is contained in:
Josh Holtrop 2013-11-08 14:52:39 -05:00
parent 01c847fa32
commit d01767981c
2 changed files with 32 additions and 2 deletions

View File

@ -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

View File

@ -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|