From b8acc74b5d70d8da480f57ef05cac368d36a544d Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Mon, 15 Jul 2013 21:44:07 -0400 Subject: [PATCH] add Environment#clone() and a build test for it --- build_tests/clone_env/build.rb | 11 +++++++++++ build_tests/clone_env/src/program.c | 6 ++++++ lib/rscons/environment.rb | 18 ++++++++++++++++++ spec/build_tests_spec.rb | 10 ++++++++++ 4 files changed, 45 insertions(+) create mode 100644 build_tests/clone_env/build.rb create mode 100644 build_tests/clone_env/src/program.c diff --git a/build_tests/clone_env/build.rb b/build_tests/clone_env/build.rb new file mode 100644 index 0000000..19f05f3 --- /dev/null +++ b/build_tests/clone_env/build.rb @@ -0,0 +1,11 @@ +debug = Rscons::Environment.new do |env| + env.build_dir('src', 'debug') + env['CFLAGS'] = '-O2' + env['CPPFLAGS'] = '-DSTRING="Debug Version"' + env.Program('program-debug', Dir['src/*.c']) +end + +release = debug.clone('CPPFLAGS' => '-DSTRING="Release Version"') do |env| + env.build_dir('src', 'release') + env.Program('program-release', Dir['src/*.c']) +end diff --git a/build_tests/clone_env/src/program.c b/build_tests/clone_env/src/program.c new file mode 100644 index 0000000..97b0a2c --- /dev/null +++ b/build_tests/clone_env/src/program.c @@ -0,0 +1,6 @@ +#include + +int main(int argc, char *argv[]) +{ + printf("Hello, %s\n", STRING); +} diff --git a/lib/rscons/environment.rb b/lib/rscons/environment.rb index 1f1e3f2..ba7cbef 100644 --- a/lib/rscons/environment.rb +++ b/lib/rscons/environment.rb @@ -36,6 +36,24 @@ module Rscons end end + def clone(variables = {}) + env = Environment.new() + @builders.each do |builder_name, builder| + env.add_builder(builder) + end + @build_dirs.each do |src_dir, obj_dir| + env.build_dir(src_dir, obj_dir) + end + env.append(@varset) + env.append(variables) + + if block_given? + yield env + env.process + end + env + end + def add_builder(builder) @builders[builder.class.short_name] = builder var_defs = builder.default_variables(self) diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index 204e5ae..6b79dab 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -126,4 +126,14 @@ describe Rscons do File.exists?('inc.h').should be_true `./program`.should == "The value is 5678\n" end + + it 'allows cloning Environment objects' do + lines = test_dir('clone_env') + lines.should == [ + %q{gcc -c -o debug/program.o -MMD -MF debug/program.mf '-DSTRING="Debug Version"' -O2 src/program.c}, + %q{gcc -o program-debug debug/program.o}, + %q{gcc -c -o release/program.o -MMD -MF release/program.mf '-DSTRING="Release Version"' -O2 src/program.c}, + %q{gcc -o program-release release/program.o}, + ] + end end