Compare commits

...
4 Commits
7 changed files with 74 additions and 17 deletions

No files matched your search

+4
View File
@@ -243,6 +243,10 @@ http://rubydoc.info/github/holtrop/rscons/frames.
## Release Notes ## Release Notes
### v1.2.0
- add :clone option to Environment#clone to control exactly which Environment attributes are cloned
- allow nil to be passed in to Environment#build_root=
### v1.1.0 ### v1.1.0
- Change Cache#up_to_date?() and #register_build() to accept a single target - Change Cache#up_to_date?() and #register_build() to accept a single target
+1 -1
View File
@@ -1,6 +1,6 @@
module Rscons module Rscons
module Builders module Builders
# A default RScons builder that produces a static library archive. # A default Rscons builder that produces a static library archive.
class Rscons::Builders::Library < Rscons::Builder class Rscons::Builders::Library < Rscons::Builder
def default_variables(env) def default_variables(env)
{ {
+1 -1
View File
@@ -1,6 +1,6 @@
module Rscons module Rscons
module Builders module Builders
# A default RScons builder which knows how to produce an object file from # A default Rscons builder which knows how to produce an object file from
# various types of source files. # various types of source files.
class Object < Builder class Object < Builder
KNOWN_SUFFIXES = { KNOWN_SUFFIXES = {
+1 -1
View File
@@ -1,6 +1,6 @@
module Rscons module Rscons
module Builders module Builders
# A default RScons builder that knows how to link object files into an # A default Rscons builder that knows how to link object files into an
# executable program. # executable program.
class Rscons::Builders::Program < Rscons::Builder class Rscons::Builders::Program < Rscons::Builder
def default_variables(env) def default_variables(env)
+43 -13
View File
@@ -2,7 +2,7 @@ require 'set'
require 'fileutils' require 'fileutils'
module Rscons module Rscons
# The Environment class is the main programmatic interface to RScons. It # The Environment class is the main programmatic interface to Rscons. It
# contains a collection of construction variables, options, builders, and # contains a collection of construction variables, options, builders, and
# rules for building targets. # rules for building targets.
class Environment class Environment
@@ -15,7 +15,8 @@ module Rscons
# String or +nil+ # String or +nil+
attr_reader :build_root attr_reader :build_root
def build_root=(build_root) def build_root=(build_root)
@build_root = build_root.gsub('\\', '/') @build_root = build_root
@build_root.gsub!('\\', '/') if @build_root
end end
# Create an Environment object. # Create an Environment object.
@@ -50,24 +51,53 @@ module Rscons
end end
# Make a copy of the Environment object. # Make a copy of the Environment object.
# The cloned environment will contain a copy of all environment options, #
# construction variables, and builders (unless :exclude_builders => true is # By default, a cloned environment will contain a copy of all environment
# passed as an option). It will not contain a copy of the targets, build # options, construction variables, and builders, but not a copy of the
# hooks, build directories, or the build root. If a block is given, the # targets, build hooks, build directories, or the build root.
# Environment object is yielded to the block and when the block returns, #
# the {#process} method is automatically called. The possible options keys # Exactly which items are cloned are controllable via the optional :clone
# match those documented in the #initialize method. # parameter, which can be :none, :all, or a set or array of any of the
# following:
# - :variables to clone construction variables (on by default)
# - :builders to clone the builders (on by default)
# - :build_root to clone the build root (off by default)
# - :build_dirs to clone the build directories (off by default)
# - :build_hooks to clone the build hooks (off by default)
#
# If a block is given, the Environment object is yielded to the block and
# when the block returns, the {#process} method is automatically called.
#
# Any options that #initialize receives can also be specified here.
#
# @return a new {Environment} object.
def clone(options = {}) def clone(options = {})
clone = options[:clone] || Set[:variables, :builders]
clone = Set[:variables, :builders, :build_root, :build_dirs, :build_hooks] if clone == :all
clone = Set[] if clone == :none
clone = Set.new(clone) if clone.is_a?(Array)
clone.delete(:builders) if options[:exclude_builders]
env = self.class.new( env = self.class.new(
echo: options[:echo] || @echo, echo: options[:echo] || @echo,
build_root: options[:build_root], build_root: options[:build_root],
exclude_builders: true) exclude_builders: true)
unless options[:exclude_builders] if clone.include?(:builders)
@builders.each do |builder_name, builder| @builders.each do |builder_name, builder|
env.add_builder(builder) env.add_builder(builder)
end end
end end
env.append(@varset.clone) env.append(@varset.clone) if clone.include?(:variables)
env.build_root = @build_root if clone.include?(:build_root)
if clone.include?(:build_dirs)
@build_dirs.each do |src_dir, obj_dir|
env.build_dir(src_dir, obj_dir)
end
end
if clone.include?(:build_hooks)
@build_hooks.each do |build_hook_block|
env.add_build_hook(&build_hook_block)
end
end
if block_given? if block_given?
yield env yield env
@@ -246,7 +276,7 @@ module Rscons
# Build a list of source files into files containing one of the suffixes # Build a list of source files into files containing one of the suffixes
# given by suffixes. # given by suffixes.
# This method is used internally by RScons builders. # This method is used internally by Rscons builders.
# @param sources [Array] List of source files to build. # @param sources [Array] List of source files to build.
# @param suffixes [Array] List of suffixes to try to convert source files into. # @param suffixes [Array] List of suffixes to try to convert source files into.
# @param cache [Cache] The Cache. # @param cache [Cache] The Cache.
@@ -294,7 +324,7 @@ module Rscons
end end
# Parse dependencies for a given target from a Makefile. # Parse dependencies for a given target from a Makefile.
# This method is used internally by RScons builders. # This method is used internally by Rscons builders.
# @param mf_fname [String] File name of the Makefile to read. # @param mf_fname [String] File name of the Makefile to read.
# @param target [String] Name of the target to gather dependencies for. # @param target [String] Name of the target to gather dependencies for.
def self.parse_makefile_deps(mf_fname, target) def self.parse_makefile_deps(mf_fname, target)
+1 -1
View File
@@ -1,4 +1,4 @@
module Rscons module Rscons
# gem version # gem version
VERSION = "1.1.0" VERSION = "1.2.0"
end end
+23
View File
@@ -298,6 +298,29 @@ EOF
] ]
end end
it 'allows cloning all attributes of an Environment object' do
test_dir('clone_env')
env1 = Rscons::Environment.new(echo: :command) do |env|
env.build_dir('src', 'build')
env['CFLAGS'] = '-O2'
env.add_build_hook do |build_op|
build_op[:vars]['CPPFLAGS'] = '-DSTRING="Hello"'
end
env.Program('program', Dir['src/*.c'])
end
env2 = env1.clone(clone: :all) do |env|
env.Program('program2', Dir['src/*.c'])
end
lines.should == [
%q{gcc -c -o build/program.o -MMD -MF build/program.mf -DSTRING="Hello" -O2 src/program.c},
%q{gcc -o program build/program.o},
%q{gcc -o program2 build/program.o},
]
end
it 'builds a C++ program with one source file' do it 'builds a C++ program with one source file' do
test_dir('simple_cc') test_dir('simple_cc')
Rscons::Environment.new do |env| Rscons::Environment.new do |env|