Class: SoftwareSpec
Direct Known Subclasses
Constant Summary collapse
- PREDEFINED_OPTIONS =
{ universal: Option.new("universal", "Build a universal binary"), cxx11: Option.new("c++11", "Build using C++11 mode"), }.freeze
Instance Attribute Summary collapse
-
#bottle_specification ⇒ Object
readonly
private
Returns the value of attribute bottle_specification.
-
#build ⇒ Object
readonly
private
Returns the value of attribute build.
-
#compiler_failures ⇒ Object
readonly
private
Returns the value of attribute compiler_failures.
-
#dependency_collector ⇒ Object
readonly
private
Returns the value of attribute dependency_collector.
-
#deprecated_flags ⇒ Object
readonly
private
Returns the value of attribute deprecated_flags.
-
#deprecated_options ⇒ Object
readonly
private
Returns the value of attribute deprecated_options.
-
#full_name ⇒ Object
readonly
private
Returns the value of attribute full_name.
-
#name ⇒ Object
readonly
private
Returns the value of attribute name.
-
#options ⇒ Object
readonly
private
Returns the value of attribute options.
-
#owner ⇒ Object
private
Returns the value of attribute owner.
-
#patches ⇒ Object
readonly
private
Returns the value of attribute patches.
-
#resources ⇒ Object
readonly
private
Returns the value of attribute resources.
Instance Method Summary collapse
- #add_dep_option(dep) ⇒ Object
- #bottle(&block) ⇒ Object
- #bottle_defined? ⇒ Boolean
- #bottle_tag?(tag = nil) ⇒ Boolean
- #bottled?(tag = nil) ⇒ Boolean
- #declared_deps ⇒ Object
- #depends_on(spec) ⇒ Object
- #deprecated_option(hash) ⇒ Object
- #deps ⇒ Object
- #fails_with(compiler, &block) ⇒ Object
- #freeze ⇒ Object
- #go_resource(name, &block) ⇒ Object
-
#initialize(flags: []) ⇒ SoftwareSpec
constructor
A new instance of SoftwareSpec.
- #initialize_dup(other) ⇒ Object
- #needs(*standards) ⇒ Object
- #option(name, description = "") ⇒ Object
- #option_defined?(name) ⇒ Boolean
- #patch(strip = :p1, src = nil, &block) ⇒ Object
- #recursive_dependencies ⇒ Object
- #recursive_requirements ⇒ Object
- #requirements ⇒ Object
- #resource(name, klass = Resource, &block) ⇒ Resource? private
- #resource_defined?(name) ⇒ Boolean
- #url(val = nil, specs = {}) ⇒ Object
- #uses_from_macos(dep, bounds = {}) ⇒ void private
Methods included from OnSystem::MacOSAndLinux
Constructor Details
#initialize(flags: []) ⇒ SoftwareSpec
Returns a new instance of SoftwareSpec.
36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'software_spec.rb', line 36 def initialize(flags: []) # Ensure this is synced with `initialize_dup` and `freeze` (excluding simple objects like integers and booleans) @resource = Resource.new @resources = {} @dependency_collector = DependencyCollector.new @bottle_specification = BottleSpecification.new @patches = [] @options = Options.new @flags = flags @deprecated_flags = [] @deprecated_options = [] @build = BuildOptions.new(Options.create(@flags), ) @compiler_failures = [] end |
Instance Attribute Details
#bottle_specification ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute bottle_specification.
27 28 29 |
# File 'software_spec.rb', line 27 def bottle_specification @bottle_specification end |
#build ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute build.
27 28 29 |
# File 'software_spec.rb', line 27 def build @build end |
#compiler_failures ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute compiler_failures.
27 28 29 |
# File 'software_spec.rb', line 27 def compiler_failures @compiler_failures end |
#dependency_collector ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute dependency_collector.
27 28 29 |
# File 'software_spec.rb', line 27 def dependency_collector @dependency_collector end |
#deprecated_flags ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute deprecated_flags.
27 28 29 |
# File 'software_spec.rb', line 27 def deprecated_flags @deprecated_flags end |
#deprecated_options ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute deprecated_options.
27 28 29 |
# File 'software_spec.rb', line 27 def @deprecated_options end |
#full_name ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute full_name.
27 28 29 |
# File 'software_spec.rb', line 27 def full_name @full_name end |
#name ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute name.
27 28 29 |
# File 'software_spec.rb', line 27 def name @name end |
#options ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute options.
27 28 29 |
# File 'software_spec.rb', line 27 def @options end |
#owner ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute owner.
27 28 29 |
# File 'software_spec.rb', line 27 def owner @owner end |
#patches ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute patches.
27 28 29 |
# File 'software_spec.rb', line 27 def patches @patches end |
#resources ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the value of attribute resources.
27 28 29 |
# File 'software_spec.rb', line 27 def resources @resources end |
Instance Method Details
#add_dep_option(dep) ⇒ Object
265 266 267 268 269 270 271 272 273 |
# File 'software_spec.rb', line 265 def add_dep_option(dep) dep.option_names.each do |name| if dep.optional? && !option_defined?("with-#{name}") << Option.new("with-#{name}", "Build with #{name} support") elsif dep.recommended? && !option_defined?("without-#{name}") << Option.new("without-#{name}", "Build without #{name} support") end end end |
#bottle(&block) ⇒ Object
117 118 119 |
# File 'software_spec.rb', line 117 def bottle(&block) bottle_specification.instance_eval(&block) end |
#bottle_defined? ⇒ Boolean
104 105 106 |
# File 'software_spec.rb', line 104 def bottle_defined? !bottle_specification.collector..empty? end |
#bottle_tag?(tag = nil) ⇒ Boolean
108 109 110 |
# File 'software_spec.rb', line 108 def bottle_tag?(tag = nil) bottle_specification.tag?(Utils::Bottles.tag(tag)) end |
#bottled?(tag = nil) ⇒ Boolean
112 113 114 115 |
# File 'software_spec.rb', line 112 def bottled?(tag = nil) bottle_tag?(tag) && (tag.present? || bottle_specification.compatible_locations? || owner.force_bottle) end |
#declared_deps ⇒ Object
218 219 220 |
# File 'software_spec.rb', line 218 def declared_deps dependency_collector.deps end |
#depends_on(spec) ⇒ Object
189 190 191 192 |
# File 'software_spec.rb', line 189 def depends_on(spec) dep = dependency_collector.add(spec) add_dep_option(dep) if dep end |
#deprecated_option(hash) ⇒ Object
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'software_spec.rb', line 167 def deprecated_option(hash) raise ArgumentError, "deprecated_option hash must not be empty" if hash.empty? hash.each do |, | Array().each do |old_option| Array().each do |new_option| deprecated_option = DeprecatedOption.new(old_option, new_option) << deprecated_option old_flag = deprecated_option.old_flag new_flag = deprecated_option.current_flag next unless @flags.include? old_flag @flags -= [old_flag] @flags |= [new_flag] @deprecated_flags << deprecated_option end end end @build = BuildOptions.new(Options.create(@flags), ) end |
#deps ⇒ Object
214 215 216 |
# File 'software_spec.rb', line 214 def deps dependency_collector.deps.dup_without_system_deps end |
#fails_with(compiler, &block) ⇒ Object
255 256 257 |
# File 'software_spec.rb', line 255 def fails_with(compiler, &block) compiler_failures << CompilerFailure.create(compiler, &block) end |
#freeze ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'software_spec.rb', line 66 def freeze @resource.freeze @resources.freeze @dependency_collector.freeze @bottle_specification.freeze @patches.freeze @options.freeze @flags.freeze @deprecated_flags.freeze @deprecated_options.freeze @build.freeze @compiler_failures.freeze super end |
#go_resource(name, &block) ⇒ Object
144 145 146 147 |
# File 'software_spec.rb', line 144 def go_resource(name, &block) odeprecated "`SoftwareSpec#go_resource`", "Go modules" resource name, Resource::Go, &block end |
#initialize_dup(other) ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'software_spec.rb', line 51 def initialize_dup(other) super @resource = @resource.dup @resources = @resources.dup @dependency_collector = @dependency_collector.dup @bottle_specification = @bottle_specification.dup @patches = @patches.dup @options = @options.dup @flags = @flags.dup @deprecated_flags = @deprecated_flags.dup @deprecated_options = @deprecated_options.dup @build = @build.dup @compiler_failures = @compiler_failures.dup end |
#needs(*standards) ⇒ Object
259 260 261 262 263 |
# File 'software_spec.rb', line 259 def needs(*standards) standards.each do |standard| compiler_failures.concat CompilerFailure.for_standard(standard) end end |
#option(name, description = "") ⇒ Object
153 154 155 156 157 158 159 160 161 162 163 164 165 |
# File 'software_spec.rb', line 153 def option(name, description = "") opt = PREDEFINED_OPTIONS.fetch(name) do unless name.is_a?(String) raise ArgumentError, "option name must be string or symbol; got a #{name.class}: #{name}" end raise ArgumentError, "option name is required" if name.empty? raise ArgumentError, "option name must be longer than one character: #{name}" if name.length <= 1 raise ArgumentError, "option name must not start with dashes: #{name}" if name.start_with?("-") Option.new(name, description) end << opt end |
#option_defined?(name) ⇒ Boolean
149 150 151 |
# File 'software_spec.rb', line 149 def option_defined?(name) .include?(name) end |
#patch(strip = :p1, src = nil, &block) ⇒ Object
247 248 249 250 251 252 253 |
# File 'software_spec.rb', line 247 def patch(strip = :p1, src = nil, &block) p = Patch.create(strip, src, &block) return if p.is_a?(ExternalPatch) && p.url.blank? dependency_collector.add(p.resource) if p.is_a? ExternalPatch patches << p end |
#recursive_dependencies ⇒ Object
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
# File 'software_spec.rb', line 222 def recursive_dependencies deps_f = [] recursive_dependencies = deps.filter_map do |dep| deps_f << dep.to_formula dep rescue TapFormulaUnavailableError # Don't complain about missing cross-tap dependencies next end.uniq deps_f.compact.each do |f| f.recursive_dependencies.each do |dep| recursive_dependencies << dep unless recursive_dependencies.include?(dep) end end recursive_dependencies end |
#recursive_requirements ⇒ Object
243 244 245 |
# File 'software_spec.rb', line 243 def recursive_requirements Requirement.(self) end |
#requirements ⇒ Object
239 240 241 |
# File 'software_spec.rb', line 239 def requirements dependency_collector.requirements end |
#resource(name, klass = Resource, &block) ⇒ Resource?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'software_spec.rb', line 129 def resource(name, klass = Resource, &block) if block raise DuplicateResourceError, name if resource_defined?(name) res = klass.new(name, &block) return unless res.url resources[name] = res dependency_collector.add(res) res else resources.fetch(name) { raise ResourceMissingError.new(owner, name) } end end |
#resource_defined?(name) ⇒ Boolean
121 122 123 |
# File 'software_spec.rb', line 121 def resource_defined?(name) resources.key?(name) end |
#url(val = nil, specs = {}) ⇒ Object
97 98 99 100 101 102 |
# File 'software_spec.rb', line 97 def url(val = nil, specs = {}) return @resource.url if val.nil? @resource.url(val, **specs) dependency_collector.add(@resource) end |
#uses_from_macos(dep, bounds = {}) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'software_spec.rb', line 200 def uses_from_macos(dep, bounds = {}) if dep.is_a?(Hash) bounds = dep.dup dep, = bounds.shift dep = T.cast(dep, String) = [*] bounds = T.cast(bounds, T::Hash[Symbol, Symbol]) else = [] end depends_on UsesFromMacOSDependency.new(dep, , bounds:) end |