| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | require 'dependable' | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:47 -05:00
										 |  |  | require 'dependency' | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | require 'build_environment' | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:57 -05:00
										 |  |  | require 'extend/ENV' | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | # A base class for non-formula requirements needed by formulae. | 
					
						
							|  |  |  | # A "fatal" requirement is one that will fail the build if it is not present. | 
					
						
							|  |  |  | # By default, Requirements are non-fatal. | 
					
						
							|  |  |  | class Requirement | 
					
						
							|  |  |  |   include Dependable | 
					
						
							|  |  |  |   extend BuildEnvironmentDSL | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-09 14:36:10 -06:00
										 |  |  |   attr_reader :tags, :name, :option_name | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-06 16:08:50 -05:00
										 |  |  |   def initialize(tags=[]) | 
					
						
							|  |  |  |     @tags = tags | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |     @tags << :build if self.class.build | 
					
						
							| 
									
										
										
										
											2013-02-12 16:24:30 -06:00
										 |  |  |     @name ||= infer_name | 
					
						
							| 
									
										
										
										
											2013-12-09 14:36:10 -06:00
										 |  |  |     @option_name = @name | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # The message to show when the requirement is not met. | 
					
						
							|  |  |  |   def message; "" end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-07 18:58:26 -06:00
										 |  |  |   # Overriding #satisfied? is deprecated. | 
					
						
							| 
									
										
										
										
											2013-06-02 17:14:42 -05:00
										 |  |  |   # Pass a block or boolean to the satisfy DSL method instead. | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   def satisfied? | 
					
						
							|  |  |  |     result = self.class.satisfy.yielder do |proc| | 
					
						
							|  |  |  |       instance_eval(&proc) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     infer_env_modification(result) | 
					
						
							|  |  |  |     !!result | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Overriding #fatal? is deprecated. | 
					
						
							|  |  |  |   # Pass a boolean to the fatal DSL method instead. | 
					
						
							|  |  |  |   def fatal? | 
					
						
							|  |  |  |     self.class.fatal || false | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:47 -05:00
										 |  |  |   def default_formula? | 
					
						
							|  |  |  |     self.class.default_formula || false | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   # Overriding #modify_build_environment is deprecated. | 
					
						
							|  |  |  |   # Pass a block to the the env DSL method instead. | 
					
						
							| 
									
										
										
										
											2013-06-24 10:39:00 -05:00
										 |  |  |   # Note: #satisfied? should be called before invoking this method | 
					
						
							|  |  |  |   # as the env modifications may depend on its side effects. | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   def modify_build_environment | 
					
						
							| 
									
										
										
										
											2013-06-24 10:39:00 -05:00
										 |  |  |     env.modify_build_environment(self) | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def env | 
					
						
							|  |  |  |     @env ||= self.class.env | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def eql?(other) | 
					
						
							| 
									
										
										
										
											2013-06-27 01:18:32 -05:00
										 |  |  |     instance_of?(other.class) && name == other.name && tags == other.tags | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def hash | 
					
						
							| 
									
										
										
										
											2013-01-29 22:52:10 -06:00
										 |  |  |     [name, *tags].hash | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-07 22:24:36 -05:00
										 |  |  |   def inspect | 
					
						
							|  |  |  |     "#<#{self.class}: #{name.inspect} #{tags.inspect}>" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:47 -05:00
										 |  |  |   def to_dependency | 
					
						
							|  |  |  |     f = self.class.default_formula | 
					
						
							|  |  |  |     raise "No default formula defined for #{inspect}" if f.nil? | 
					
						
							| 
									
										
										
										
											2014-02-27 14:22:43 -06:00
										 |  |  |     Dependency.new(f, tags, method(:modify_build_environment), name) | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:47 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 16:24:30 -06:00
										 |  |  |   def infer_name | 
					
						
							|  |  |  |     klass = self.class.to_s | 
					
						
							|  |  |  |     klass.sub!(/(Dependency|Requirement)$/, '') | 
					
						
							| 
									
										
										
										
											2013-02-12 16:28:50 -06:00
										 |  |  |     klass.sub!(/^(\w+::)*/, '') | 
					
						
							| 
									
										
										
										
											2013-02-12 16:24:30 -06:00
										 |  |  |     klass.downcase | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   def infer_env_modification(o) | 
					
						
							|  |  |  |     case o | 
					
						
							|  |  |  |     when Pathname | 
					
						
							|  |  |  |       self.class.env do | 
					
						
							| 
									
										
										
										
											2013-08-19 17:21:13 -05:00
										 |  |  |         unless ENV["PATH"].split(File::PATH_SEPARATOR).include?(o.parent.to_s) | 
					
						
							|  |  |  |           ENV.append_path("PATH", o.parent) | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-19 12:33:00 -05:00
										 |  |  |   def which(cmd) | 
					
						
							|  |  |  |     super(cmd, ORIGINAL_PATHS.join(File::PATH_SEPARATOR)) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   class << self | 
					
						
							| 
									
										
										
										
											2013-06-04 11:05:02 -05:00
										 |  |  |     attr_rw :fatal, :build, :default_formula | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def satisfy(options={}, &block) | 
					
						
							|  |  |  |       @satisfied ||= Requirement::Satisfier.new(options, &block) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class Satisfier | 
					
						
							|  |  |  |     def initialize(options={}, &block) | 
					
						
							|  |  |  |       case options | 
					
						
							|  |  |  |       when Hash | 
					
						
							|  |  |  |         @options = { :build_env => true } | 
					
						
							|  |  |  |         @options.merge!(options) | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         @satisfied = options | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       @proc = block | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def yielder | 
					
						
							|  |  |  |       if instance_variable_defined?(:@satisfied) | 
					
						
							|  |  |  |         @satisfied | 
					
						
							|  |  |  |       elsif @options[:build_env] | 
					
						
							| 
									
										
										
										
											2013-08-19 12:33:00 -05:00
										 |  |  |         ENV.with_build_environment { yield @proc } | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |       else | 
					
						
							|  |  |  |         yield @proc | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-01-30 17:55:04 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:46 -05:00
										 |  |  |   class << self | 
					
						
							|  |  |  |     # Expand the requirements of dependent recursively, optionally yielding | 
					
						
							|  |  |  |     # [dependent, req] pairs to allow callers to apply arbitrary filters to | 
					
						
							|  |  |  |     # the list. | 
					
						
							|  |  |  |     # The default filter, which is applied when a block is not given, omits | 
					
						
							|  |  |  |     # optionals and recommendeds based on what the dependent has asked for. | 
					
						
							|  |  |  |     def expand(dependent, &block) | 
					
						
							|  |  |  |       reqs = ComparableSet.new | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       formulae = dependent.recursive_dependencies.map(&:to_formula) | 
					
						
							|  |  |  |       formulae.unshift(dependent) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-25 10:12:14 -05:00
										 |  |  |       formulae.each do |f| | 
					
						
							|  |  |  |         f.requirements.each do |req| | 
					
						
							|  |  |  |           if prune?(f, req, &block) | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:46 -05:00
										 |  |  |             next | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             reqs << req | 
					
						
							| 
									
										
										
										
											2013-01-30 17:55:04 -06:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:46 -05:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2013-01-30 17:55:04 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:46 -05:00
										 |  |  |       reqs | 
					
						
							| 
									
										
										
										
											2013-01-30 17:55:04 -06:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:46 -05:00
										 |  |  |     def prune?(dependent, req, &block) | 
					
						
							|  |  |  |       catch(:prune) do | 
					
						
							|  |  |  |         if block_given? | 
					
						
							|  |  |  |           yield dependent, req | 
					
						
							|  |  |  |         elsif req.optional? || req.recommended? | 
					
						
							| 
									
										
										
										
											2013-12-09 14:36:10 -06:00
										 |  |  |           prune unless dependent.build.with?(req) | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:46 -05:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2013-01-30 17:55:04 -06:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:46 -05:00
										 |  |  |     # Used to prune requirements when calling expand with a block. | 
					
						
							|  |  |  |     def prune | 
					
						
							|  |  |  |       throw(:prune, true) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-01-30 17:55:04 -06:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | end |