From 3ba3111a45fa02085b187a774d1ddd2ab3a0d672 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 30 Jun 2013 19:26:09 -0400 Subject: [PATCH] add functionality to add builders to an Environment --- lib/rscons.rb | 8 ++++++++ lib/rscons/builders/cc.rb | 4 ++++ lib/rscons/builders/program.rb | 4 ++++ lib/rscons/environment.rb | 32 ++++++++++++++++++++++++++++++++ lib/rscons/monkey/module.rb | 5 +++++ 5 files changed, 53 insertions(+) create mode 100644 lib/rscons/builders/cc.rb create mode 100644 lib/rscons/builders/program.rb create mode 100644 lib/rscons/monkey/module.rb diff --git a/lib/rscons.rb b/lib/rscons.rb index 3763eb0..c543e0d 100644 --- a/lib/rscons.rb +++ b/lib/rscons.rb @@ -2,7 +2,15 @@ require "rscons/builder" require "rscons/environment" require "rscons/version" +require "rscons/monkey/module" + +# default builders +require "rscons/builders/cc" +require "rscons/builders/program" + module Rscons DEFAULT_BUILDERS = [ + CC, + Program, ] end diff --git a/lib/rscons/builders/cc.rb b/lib/rscons/builders/cc.rb new file mode 100644 index 0000000..a27c64b --- /dev/null +++ b/lib/rscons/builders/cc.rb @@ -0,0 +1,4 @@ +module Rscons + class CC < Builder + end +end diff --git a/lib/rscons/builders/program.rb b/lib/rscons/builders/program.rb new file mode 100644 index 0000000..4dd9414 --- /dev/null +++ b/lib/rscons/builders/program.rb @@ -0,0 +1,4 @@ +module Rscons + class Program < Builder + end +end diff --git a/lib/rscons/environment.rb b/lib/rscons/environment.rb index 41c8e56..23c9c6d 100644 --- a/lib/rscons/environment.rb +++ b/lib/rscons/environment.rb @@ -21,9 +21,41 @@ module Rscons # which are lowercase symbols (such as :echo). def initialize(variables = {}) @variables = variables + @targets = {} + @builders = {} + @variables[:exclude_builders] ||= [] + unless @variables[:exclude_builders] == :all + exclude_builders = Set.new(@variables[:exclude_builders] || []) + DEFAULT_BUILDERS.each do |builder_class| + unless exclude_builders.include?(builder_class.short_name) + add_builder(builder_class) + end + end + end + (@variables[:builders] || []).each do |builder_class| + add_builder(builder_class) + end + end + + def add_builder(builder_class) + @builders[builder_class.short_name] = builder_class end def process end + + alias_method :orig_method_missing, :method_missing + def method_missing(method, *args) + if @builders.has_key?(method.to_s) + target, source, *rest = args + @targets[target] = { + builder: method.to_s, + source: source, + args: rest, + } + else + orig_method_missing(method, *args) + end + end end end diff --git a/lib/rscons/monkey/module.rb b/lib/rscons/monkey/module.rb new file mode 100644 index 0000000..eda3d0e --- /dev/null +++ b/lib/rscons/monkey/module.rb @@ -0,0 +1,5 @@ +class Module + def short_name + name.split(':').last + end +end