diff --git a/Library/Homebrew/build_environment.rb b/Library/Homebrew/build_environment.rb index 97a8fae42d..18876f9542 100644 --- a/Library/Homebrew/build_environment.rb +++ b/Library/Homebrew/build_environment.rb @@ -17,4 +17,29 @@ class BuildEnvironment def userpaths? @settings.include? :userpaths end + + def modify_build_environment + p = @settings.find { |s| Proc === s } + ENV.instance_eval(&p) unless p.nil? + end + + def _dump(*) + @settings.dup.reject { |s| Proc === s }.join(":") + end + + def self._load(s) + new(*s.split(":").map(&:to_sym)) + end +end + +module BuildEnvironmentDSL + def env(*settings, &block) + @env ||= BuildEnvironment.new + if block_given? + @env << block + else + settings.each { |s| @env << s } + end + @env + end end diff --git a/Library/Homebrew/dependencies.rb b/Library/Homebrew/dependencies.rb index 623591c786..c2dd63d7dc 100644 --- a/Library/Homebrew/dependencies.rb +++ b/Library/Homebrew/dependencies.rb @@ -170,6 +170,7 @@ end # By default, Requirements are non-fatal. class Requirement include Dependable + extend BuildEnvironmentDSL attr_reader :tags @@ -186,9 +187,11 @@ class Requirement # The message to show when the requirement is not met. def message; ""; end - # Requirements can modify the current build environment by overriding this. - # See X11Dependency - def modify_build_environment; nil end + # Overriding modify_build_environment is deprecated, pass a block to + # the env DSL method instead. + def modify_build_environment + env.modify_build_environment + end def env @env ||= self.class.env @@ -206,12 +209,6 @@ class Requirement def fatal(val=nil) val.nil? ? @fatal : @fatal = val end - - def env(*settings) - @env ||= BuildEnvironment.new - settings.each { |s| @env << s } - @env - end end end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index b7256ff0f5..b78434b91f 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -11,6 +11,7 @@ require 'extend/set' class Formula include FileUtils + extend BuildEnvironmentDSL attr_reader :name, :path, :homepage, :downloader attr_reader :stable, :bottle, :devel, :head, :active_spec @@ -727,12 +728,6 @@ private @stable.mirror(val) end - def env *settings - @env ||= BuildEnvironment.new - settings.each { |s| @env << s } - @env - end - def dependencies @dependencies ||= DependencyCollector.new end diff --git a/Library/Homebrew/test/test_build_environment.rb b/Library/Homebrew/test/test_build_environment.rb index fde3f3c70f..d8a227f51b 100644 --- a/Library/Homebrew/test/test_build_environment.rb +++ b/Library/Homebrew/test/test_build_environment.rb @@ -19,4 +19,37 @@ class BuildEnvironmentTests < Test::Unit::TestCase @env << :userpaths assert @env.userpaths? end + + def test_modify_build_environment + @env << Proc.new { 1 } + assert_equal 1, @env.modify_build_environment + end + + def test_marshal + @env << :userpaths + @env << Proc.new { 1 } + dump = Marshal.dump(@env) + assert Marshal.load(dump).userpaths? + end +end + +class BuildEnvironmentDSLTests < Test::Unit::TestCase + def make_instance(&block) + Class.new do + extend BuildEnvironmentDSL + def env; self.class.env end + class_eval(&block) + end.new + end + + def test_env_single_argument + obj = make_instance { env :userpaths } + assert obj.env.userpaths? + end + + def test_env_multiple_arguments + obj = make_instance { env :userpaths, :std } + assert obj.env.userpaths? + assert obj.env.std? + end end diff --git a/Library/Homebrew/test/test_requirement.rb b/Library/Homebrew/test/test_requirement.rb index 7bfb75ff3c..28e2afae71 100644 --- a/Library/Homebrew/test/test_requirement.rb +++ b/Library/Homebrew/test/test_requirement.rb @@ -26,17 +26,6 @@ class RequirementTests < Test::Unit::TestCase assert_equal [:build, "bar"], dep.tags end - def test_dsl_env_single_argument - req = Class.new(Requirement) { env :userpaths }.new - assert req.env.userpaths? - end - - def test_dsl_env_multiple_arguments - req = Class.new(Requirement) { env :userpaths, :std }.new - assert req.env.userpaths? - assert req.env.std? - end - def test_dsl_fatal req = Class.new(Requirement) { fatal true }.new assert req.fatal?