Class: Formula Private

Inherits:
Object show all
Extended by:
APIHashable, Attrable, BuildEnvironment::DSL, Cachable, Forwardable, OnSystem::MacOSAndLinux
Includes:
Context, FileUtils, Homebrew::Livecheck::Constants, OnSystem::MacOSAndLinux, Utils::Shebang, Utils::Shell
Defined in:
extend/os/mac/formula.rb,
extend/os/linux/formula.rb,
formula.rb,
formula.rbi,
sorbet/rbi/parlour.rbi

Overview

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

This file provides definitions for Forwardable#delegate, which is currently not supported by Sorbet.

Constant Summary

Constants included from Homebrew::Livecheck::Constants

Homebrew::Livecheck::Constants::LATEST_VERSION

Constants included from Utils::Shell

Utils::Shell::SHELL_PROFILE_MAP, Utils::Shell::UNSAFE_SHELL_CHAR

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from OnSystem::MacOSAndLinux

included

Methods included from BuildEnvironment::DSL

inherited

Methods included from Cachable

cache

Methods included from Attrable

attr_predicate, attr_rw

Methods included from APIHashable

generated_hash!, generating_hash!, generating_hash?

Methods included from Context

current, current=, #debug?, #quiet?, #verbose?, #with_context

Methods included from Utils::Shell

csh_quote, export_value, from_path, parent, preferred, preferred_path, prepend_path_in_profile, profile, set_variable_in_profile, sh_quote

Methods included from Kernel

#disk_usage_readable, #ensure_executable!, #ensure_formula_installed!, #exec_browser, #exec_editor, #ignore_interrupts, #interactive_shell, #number_readable, #odebug, #odeprecated, #odie, #odisabled, #ofail, #oh1, #oh1_title, #ohai, #ohai_title, #onoe, #opoo, #paths, #pretty_duration, #pretty_installed, #pretty_outdated, #pretty_uninstalled, #quiet_system, #redact_secrets, #redirect_stdout, #require?, #safe_system, #tap_and_name_comparison, #truncate_text_to_approximate_size, #which, #which_all, #which_editor, #with_custom_locale, #with_env, #with_homebrew_path

Methods included from Utils::Shebang

rewrite_shebang

Constructor Details

#initialize(name, path, spec, alias_path: nil, tap: nil, force_bottle: false) ⇒ 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.

Parameters:

  • name (String)
  • path (Pathname)
  • spec (Symbol)
  • alias_path (Pathname, nil) (defaults to: nil)
  • tap (Tap, nil) (defaults to: nil)
  • force_bottle (Boolean) (defaults to: false)


216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# File 'formula.rb', line 216

def initialize(name, path, spec, alias_path: nil, tap: nil, force_bottle: false)
  # Only allow instances of subclasses. The base class does not hold any spec information (URLs etc).
  raise "Do not call `Formula.new' directly without a subclass." unless self.class < Formula

  # Stop any subsequent modification of a formula's definition.
  # Changes do not propagate to existing instances of formulae.
  # Now that we have an instance, it's too late to make any changes to the class-level definition.
  self.class.freeze

  @name = name
  @unresolved_path = path
  @path = path.resolved_path
  @alias_path = alias_path
  @alias_name = (File.basename(alias_path) if alias_path)
  @revision = self.class.revision || 0
  @version_scheme = self.class.version_scheme || 0

  @force_bottle = force_bottle

  @tap = tap
  @tap ||= if path == Formulary.core_path(name)
    CoreTap.instance
  else
    Tap.from_path(path)
  end

  @full_name = full_name_with_optional_tap(name)
  @full_alias_name = full_name_with_optional_tap(@alias_name)

  self.class.spec_syms.each do |sym|
    spec_eval sym
  end

  @active_spec = determine_active_spec(spec)
  @active_spec_sym = if head?
    :head
  else
    :stable
  end
  validate_attributes!
  @build = active_spec.build
  @pin = FormulaPin.new(self)
  @follow_installed_alias = true
  @prefix_returns_versioned_prefix = false
  @oldname_locks = []
end

Class Attribute Details

.allow_network_access!(phases = []) ⇒ 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.

The phases for which network access is allowed. By default, network access is allowed for all phases. Valid phases are :build, :test, and :postinstall. When no argument is passed, network access will be allowed for all phases.

Examples

allow_network_access!
allow_network_access! :build
allow_network_access! [:build, :test]

Parameters:



3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
# File 'formula.rb', line 3370

def allow_network_access!(phases = [])
  phases_array = Array(phases)
  if phases_array.empty?
    @network_access_allowed.each_key { |phase| @network_access_allowed[phase] = true }
  else
    phases_array.each do |phase|
      raise ArgumentError, "Unknown phase: #{phase}" unless SUPPORTED_NETWORK_ACCESS_PHASES.include?(phase)

      @network_access_allowed[phase] = true
    end
  end
end

.conflictsArray<FormulaConflict> (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:



3460
3461
3462
# File 'formula.rb', line 3460

def conflicts
  @conflicts
end

.deny_network_access!(phases = []) ⇒ 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.

The phases for which network access is denied. By default, network access is allowed for all phases. Valid phases are :build, :test, and :postinstall. When no argument is passed, network access will be denied for all phases.

Examples

deny_network_access!
deny_network_access! :build
deny_network_access! [:build, :test]

Parameters:



3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
# File 'formula.rb', line 3404

def deny_network_access!(phases = [])
  phases_array = Array(phases)
  if phases_array.empty?
    @network_access_allowed.each_key { |phase| @network_access_allowed[phase] = false }
  else
    phases_array.each do |phase|
      raise ArgumentError, "Unknown phase: #{phase}" unless SUPPORTED_NETWORK_ACCESS_PHASES.include?(phase)

      @network_access_allowed[phase] = false
    end
  end
end

.deprecated_option(hash) ⇒ 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.

Deprecated options are used to rename options and migrate users who used them to newer ones. They are mostly used for migrating non-with options (e.g. enable-debug) to with options (e.g. with-debug).

Example

deprecated_option "enable-debug" => "with-debug"


3849
3850
3851
# File 'formula.rb', line 3849

def deprecated_option(hash)
  specs.each { |spec| spec.deprecated_option(hash) }
end

.deprecation_dateObject (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.

The date that this Formula was or becomes deprecated. Returns nil if no date is specified.

Returns:

  • Date

See Also:



4216
4217
4218
# File 'formula.rb', line 4216

def deprecation_date
  @deprecation_date
end

.deprecation_reasonnil, ... (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.

The reason for deprecation of a Formula.

Returns:

  • (nil)

    if no reason was provided or the formula is not deprecated.

  • (String, Symbol)

See Also:



4223
4224
4225
# File 'formula.rb', line 4223

def deprecation_reason
  @deprecation_reason
end

.desc(arg = T.unsafe(nil)) ⇒ T.untyped

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.

Parameters:

  • arg (T.untyped) (defaults to: T.unsafe(nil))

Returns:

  • (T.untyped)


162
# File 'sorbet/rbi/parlour.rbi', line 162

def self.desc(arg = T.unsafe(nil)); end

.disable_dateObject (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.

The date that this Formula was or becomes disabled. Returns nil if no date is specified.

Returns:

  • Date

See Also:



4269
4270
4271
# File 'formula.rb', line 4269

def disable_date
  @disable_date
end

.disable_reasonString, Symbol (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.

The reason this Formula is disabled. Returns nil if no reason was provided or the formula is not disabled.

Returns:

See Also:



4276
4277
4278
# File 'formula.rb', line 4276

def disable_reason
  @disable_reason
end

.head(val = nil, specs = {}, &block) ⇒ 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.

Adds a head SoftwareSpec. This can be installed by passing the --HEAD option to allow installing software directly from a branch of a version-control repository. If called as a method this provides just the url for the SoftwareSpec. If a block is provided you can also add depends_on and Patches just to the head SoftwareSpec. The download strategies (e.g. :using =>) are the same as for url. master is the default branch and doesn't need stating with a branch: parameter.

Example

head "https://we.prefer.https.over.git.example.com/.git"
head "https://example.com/.git", branch: "name_of_branch"

or (if autodetect fails):

head "https://hg.is.awesome.but.git.has.won.example.com/", using: :hg


3684
3685
3686
3687
3688
3689
3690
3691
3692
# File 'formula.rb', line 3684

def head(val = nil, specs = {}, &block)
  if block
    @head.instance_eval(&block)
  elsif val
    @head.url(val, specs)
  else
    @head
  end
end

.homepage(arg = T.unsafe(nil)) ⇒ T.untyped

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.

Parameters:

  • arg (T.untyped) (defaults to: T.unsafe(nil))

Returns:

  • (T.untyped)


165
# File 'sorbet/rbi/parlour.rbi', line 165

def self.homepage(arg = T.unsafe(nil)); end

.keg_only_reasonObject (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.

The reason for why this software is not linked (by default) to HOMEBREW_PREFIX.



3275
3276
3277
# File 'formula.rb', line 3275

def keg_only_reason
  @keg_only_reason
end

.license(args = nil) ⇒ 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.

The SPDX ID of the open-source license that the formula uses. Shows when running brew info.

Use :any_of, :all_of or :with to describe complex license expressions. :any_of should be used when the user can choose which license to use. :all_of should be used when the user must use all licenses. :with should be used to specify a valid SPDX exception.

Add + to an identifier to indicate that the formulae can be licensed under later versions of the same license.

Examples

license "BSD-2-Clause"
license "EPL-1.0+"
license any_of: ["MIT", "GPL-2.0-only"]
license all_of: ["MIT", "GPL-2.0-only"]
license "GPL-2.0-only" => { with: "LLVM-exception" }
license :public_domain
license any_of: [
  "MIT",
  :public_domain,
  all_of: ["0BSD", "Zlib", "Artistic-1.0+"],
  "Apache-2.0" => { with: "LLVM-exception" },
]


3341
3342
3343
3344
3345
3346
3347
# File 'formula.rb', line 3341

def license(args = nil)
  if args.nil?
    @licenses
  else
    @licenses = args
  end
end

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.



3462
3463
3464
# File 'formula.rb', line 3462

def link_overwrite_paths
  @link_overwrite_paths
end

.livecheck(&block) ⇒ 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.

Livecheck can be used to check for newer versions of the software. This method evaluates the DSL specified in the livecheck block of the Formula (if it exists) and sets the instance variables of a Livecheck object accordingly. This is used by brew livecheck to check for newer versions of the software.

Example

livecheck do
  skip "Not maintained"
  url "https://example.com/foo/releases"
  regex /foo-(\d+(?:\.\d+)+)\.tar/
end


4089
4090
4091
4092
4093
4094
# File 'formula.rb', line 4089

def livecheck(&block)
  return @livecheck unless block

  @livecheckable = true
  @livecheck.instance_eval(&block)
end

.mirror(val) ⇒ 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.

Additional URLs for the stable version of the formula. These are only used if the url fails to download. It's optional and there can be more than one. Generally we add them when the main url is unreliable. If url is really unreliable then we may swap the mirror and url.

Example

mirror "https://in.case.the.host.is.down.example.com"
mirror "https://in.case.the.mirror.is.down.example.com


3572
3573
3574
# File 'formula.rb', line 3572

def mirror(val)
  stable.mirror(val)
end

.option(name, description = "") ⇒ 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.

Options can be used as arguments to brew install. To switch features on/off: "with-something" or "with-otherthing". To use other software: "with-other-software" or "without-foo". Note that for depends_on that are :optional or :recommended, options are generated automatically.

There are also some special options:

  • :universal: build a universal binary/library (e.g. on newer Intel Macs this means a combined x86_64/x86 binary/library).

Examples

option "with-spam", "The description goes here without a dot at the end"
option "with-qt", "Text here overwrites what's autogenerated by 'depends_on "qt" => :optional'"
option :universal


3833
3834
3835
# File 'formula.rb', line 3833

def option(name, description = "")
  specs.each { |spec| spec.option(name, description) }
end

.pour_bottle_check_unsatisfied_reasonObject

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.

If pour_bottle? returns false the user-visible reason to display for why they cannot use the bottle.



3466
3467
3468
# File 'formula.rb', line 3466

def pour_bottle_check_unsatisfied_reason
  @pour_bottle_check_unsatisfied_reason
end

.pour_bottle_only_ifObject (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.



3462
3463
3464
# File 'formula.rb', line 3462

def pour_bottle_only_if
  @pour_bottle_only_if
end

.revision(arg = T.unsafe(nil)) ⇒ T.untyped

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.

Parameters:

  • arg (T.untyped) (defaults to: T.unsafe(nil))

Returns:

  • (T.untyped)


168
# File 'sorbet/rbi/parlour.rbi', line 168

def self.revision(arg = T.unsafe(nil)); end

.service(&block) ⇒ 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.

Service can be used to define services. This method evaluates the DSL specified in the service block of the Formula (if it exists) and sets the instance variables of a Service object accordingly. This is used by brew install to generate a service file.

Example

service do
  run [opt_bin/"foo"]
end


4111
4112
4113
4114
4115
# File 'formula.rb', line 4111

def service(&block)
  return @service_block unless block

  @service_block = block
end

.sha256(val) ⇒ 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.

To verify the cached download's integrity and security we verify the SHA-256 hash matches what we've declared in the Formula. To quickly fill this value you can leave it blank and run brew fetch --force and it'll tell you the currently valid value.

Example

sha256 "2a2ba417eebaadcb4418ee7b12fe2998f26d6e6f7fda7983412ff66a741ab6f7"


3590
3591
3592
# File 'formula.rb', line 3590

def sha256(val)
  stable.sha256(val)
end

.skip_clean_pathsObject (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.



3462
3463
3464
# File 'formula.rb', line 3462

def skip_clean_paths
  @skip_clean_paths
end

.stable(&block) ⇒ 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.

Allows adding depends_on and Patches just to the stable SoftwareSpec. This is required instead of using a conditional. It is preferable to also pull the url and sha256 into the block if one is added.

Example

stable do
  url "https://example.com/foo-1.0.tar.gz"
  sha256 "2a2ba417eebaadcb4418ee7b12fe2998f26d6e6f7fda7983412ff66a741ab6f7"

  depends_on "libxml2"
  depends_on "libffi"
end


3654
3655
3656
3657
3658
# File 'formula.rb', line 3654

def stable(&block)
  return @stable unless block

  @stable.instance_eval(&block)
end

.url(val, specs = {}) ⇒ 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.

The URL used to download the source for the stable version of the formula. We prefer https for security and proxy reasons. If not inferable, specify the download strategy with using: ....

  • :git, :hg, :svn, :bzr, :fossil, :cvs,
  • :curl (normal file download, will also extract)
  • :nounzip (without extracting)
  • :post (download via an HTTP POST)

Examples

url "https://packed.sources.and.we.prefer.https.example.com/archive-1.2.3.tar.bz2"
url "https://some.dont.provide.archives.example.com",
    using:    :git,
    tag:      "1.2.3",
    revision: "db8e4de5b2d6653f66aea53094624468caad15d2"


3537
3538
3539
# File 'formula.rb', line 3537

def url(val, specs = {})
  stable.url(val, specs)
end

.version(val = nil) ⇒ 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.

The version string for the stable version of the formula. The version is autodetected from the URL and/or tag so only needs to be declared if it cannot be autodetected correctly.

Example

version "1.2-final"


3553
3554
3555
# File 'formula.rb', line 3553

def version(val = nil)
  stable.version(val)
end

.version_scheme(arg = T.unsafe(nil)) ⇒ T.untyped

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.

Parameters:

  • arg (T.untyped) (defaults to: T.unsafe(nil))

Returns:

  • (T.untyped)


171
# File 'sorbet/rbi/parlour.rbi', line 171

def self.version_scheme(arg = T.unsafe(nil)); end

Instance Attribute Details

#active_log_typeString? (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.

When performing a build, test, or other loggable action, indicates which log file location to use.

Returns:



191
192
193
# File 'formula.rb', line 191

def active_log_type
  @active_log_type
end

#active_spec=(spec_sym) ⇒ 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.



263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
# File 'formula.rb', line 263

def active_spec=(spec_sym)
  spec = send(spec_sym)
  raise FormulaSpecificationError, "#{spec_sym} spec is not available for #{full_name}" unless spec

  old_spec_sym = @active_spec_sym
  @active_spec = spec
  @active_spec_sym = spec_sym
  validate_attributes!
  @build = active_spec.build

  return if spec_sym == old_spec_sym

  Dependency.clear_cache
  Requirement.clear_cache
end

#active_spec_symSymbol (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.

A symbol to indicate currently active SoftwareSpec. It's either :stable or :head

Returns:

See Also:

  • #active_spec


156
157
158
# File 'formula.rb', line 156

def active_spec_sym
  @active_spec_sym
end

#alias_nameString? (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.

The name of the alias that was used to identify this Formula. e.g. another-name-for-this-formula

Returns:



97
98
99
# File 'formula.rb', line 97

def alias_name
  @alias_name
end

#alias_pathPathname? (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.

The path to the alias that was used to identify this Formula. e.g. /usr/local/Library/Taps/homebrew/homebrew-core/Aliases/another-name-for-this-formula

Returns:



92
93
94
# File 'formula.rb', line 92

def alias_path
  @alias_path
end

#buildBuildOptions, Tab

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.

The BuildOptions or Tab for this Formula. Lists the arguments passed and any options in the Formula. Note that these may differ at different times during the installation of a Formula. This is annoying but the result of state that we're trying to eliminate.

Returns:



198
199
200
# File 'formula.rb', line 198

def build
  @build
end

#buildpathPathname? (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.

The current working directory during builds. Will only be non-nil inside #install.

Returns:



176
177
178
# File 'formula.rb', line 176

def buildpath
  @buildpath
end

#follow_installed_aliasBoolean Also known as: follow_installed_alias?

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.

Whether this formula should be considered outdated if the target of the alias it was installed with has since changed. Defaults to true.

Returns:

  • (Boolean)


204
205
206
# File 'formula.rb', line 204

def follow_installed_alias
  @follow_installed_alias
end

#force_bottleBoolean

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.

Whether or not to force the use of a bottle.

Returns:

  • (Boolean)


210
211
212
# File 'formula.rb', line 210

def force_bottle
  @force_bottle
end

#full_alias_nameString? (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.

The fully-qualified alias referring to this Formula. For core formulae it's the same as #alias_name. e.g. homebrew/tap-name/another-name-for-this-formula

Returns:



111
112
113
# File 'formula.rb', line 111

def full_alias_name
  @full_alias_name
end

#full_nameString (readonly)

The fully-qualified name of this Formula. For core formulae it's the same as #name. e.g. homebrew/tap-name/this-formula

Returns:



105
106
107
# File 'formula.rb', line 105

def full_name
  @full_name
end

#headSoftwareSpec? (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.

The HEAD SoftwareSpec for this Formula. Installed when using brew install --HEAD. This is always installed with the version HEAD and taken from the latest commit in the version control system. nil if there is no HEAD version.

Returns:

See Also:



143
144
145
# File 'formula.rb', line 143

def head
  @head
end

#local_bottle_pathPathname?

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.

When installing a bottle (binary package) from a local path this will be set to the full path to the bottle tarball. If not, it will be nil.

Returns:



186
187
188
# File 'formula.rb', line 186

def local_bottle_path
  @local_bottle_path
end

#nameString (readonly)

The name of this Formula. e.g. this-formula

Returns:



87
88
89
# File 'formula.rb', line 87

def name
  @name
end

#pathPathname (readonly)

The full path to this Formula. e.g. /usr/local/Library/Taps/homebrew/homebrew-core/Formula/t/this-formula.rb

Returns:



118
119
120
# File 'formula.rb', line 118

def path
  @path
end

#revisionInteger (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.

Used for creating new Homebrew versions of software without new upstream versions.

Returns:

  • (Integer)

See Also:



166
167
168
# File 'formula.rb', line 166

def revision
  @revision
end

#source_modified_timeTime? (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.

most recent modified time for source files

Returns:



160
161
162
# File 'formula.rb', line 160

def source_modified_time
  @source_modified_time
end

#stableSoftwareSpec? (readonly)

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

The stable (and default) SoftwareSpec for this Formula. This contains all the attributes (e.g. URL, checksum) that apply to the stable version of this formula.

Returns:



133
134
135
# File 'formula.rb', line 133

def stable
  @stable
end

#tapTap? (readonly)

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

The Tap instance associated with this Formula. If it's nil, then this formula is loaded from a path or URL.

Returns:



125
126
127
# File 'formula.rb', line 125

def tap
  @tap
end

#testpathPathname? (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.

The current working directory during tests. Will only be non-nil inside test.

Returns:



181
182
183
# File 'formula.rb', line 181

def testpath
  @testpath
end

#version_schemeInteger (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.

Used to change version schemes for packages.

Returns:

  • (Integer)

See Also:



171
172
173
# File 'formula.rb', line 171

def version_scheme
  @version_scheme
end

Class Method Details

.[](name) ⇒ 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.



2200
2201
2202
# File 'formula.rb', line 2200

def self.[](name)
  Formulary.factory(name)
end

.alias_full_namesObject

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.

an array of all aliases as fully-qualified names



2190
2191
2192
# File 'formula.rb', line 2190

def self.alias_full_names
  @alias_full_names ||= core_aliases + tap_aliases
end

.aliasesObject

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.

an array of all aliases



2185
2186
2187
# File 'formula.rb', line 2185

def self.aliases
  @aliases ||= (core_aliases + tap_aliases.map { |name| name.split("/").last }).uniq.sort
end

.all(eval_all: false) ⇒ 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.

an array of all Formula this should only be used when users specify --all to a command



2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
# File 'formula.rb', line 2121

def self.all(eval_all: false)
  if !eval_all && !Homebrew::EnvConfig.eval_all?
    raise ArgumentError, "Formula#all without `--eval-all` or HOMEBREW_EVAL_ALL"
  end

  (core_names + tap_files).filter_map do |name_or_file|
    Formulary.factory(name_or_file)
  rescue FormulaUnavailableError, FormulaUnreadableError => e
    # Don't let one broken formula break commands. But do complain.
    onoe "Failed to import: #{name_or_file}"
    $stderr.puts e

    nil
  end
end

.bottle(&block) ⇒ void

This method returns an undefined value.

Adds a bottle SoftwareSpec. This provides a pre-built binary package built by the Homebrew maintainers for you. It will be installed automatically if there is a binary package for your platform and you haven't passed or previously used any options on this formula.

If you maintain your own repository, you can add your own bottle links. You can ignore this block entirely if submitting to Homebrew/homebrew-core. It'll be handled for you by the Brew Test Bot.

bottle do
  root_url "https://example.com" # Optional root to calculate bottle URLs.
  rebuild 1 # Marks the old bottle as outdated without bumping the version/revision of the formula.
  # Optionally specify the HOMEBREW_CELLAR in which the bottles were built.
  sha256 cellar: "/brew/Cellar", catalina:    "ef65c759c5097a36323fa9c77756468649e8d1980a3a4e05695c05e39568967c"
  sha256 cellar: :any,           mojave:      "28f4090610946a4eb207df102d841de23ced0d06ba31cb79e040d883906dcd4f"
  sha256                         high_sierra: "91dd0caca9bd3f38c439d5a7b6f68440c4274945615fae035ff0a369264b8a2f"
end

Homebrew maintainers aim to bottle all formulae.

Parameters:

See Also:



3619
3620
3621
# File 'formula.rb', line 3619

def bottle(&block)
  stable.bottle(&block)
end

.buildObject

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.



3623
3624
3625
# File 'formula.rb', line 3623

def build
  stable.build
end

.build_flagsObject

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.

Get the BUILD_FLAGS from the formula's namespace set in Formulary::load_formula.



3628
3629
3630
3631
3632
3633
3634
# File 'formula.rb', line 3628

def build_flags
  namespace = T.must(to_s.split("::")[0..-2]).join("::")
  return [] if namespace.empty?

  mod = const_get(namespace)
  mod.const_get(:BUILD_FLAGS)
end

.conflicts_with(*names) ⇒ Object

One or more formulae that conflict with this one and why.

Example

conflicts_with "imagemagick", because: "both install `convert` binaries"


3916
3917
3918
3919
# File 'formula.rb', line 3916

def conflicts_with(*names)
  opts = names.last.is_a?(Hash) ? names.pop : {}
  names.each { |name| conflicts << FormulaConflict.new(name, opts[:because]) }
end

.core_alias_filesObject

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.

an array of all alias files of core Formula



2170
2171
2172
# File 'formula.rb', line 2170

def self.core_alias_files
  CoreTap.instance.alias_files
end

.core_aliasesObject

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.

an array of all core aliases



2175
2176
2177
# File 'formula.rb', line 2175

def self.core_aliases
  CoreTap.instance.aliases
end

.core_namesObject

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.

an array of all core Formula names



2095
2096
2097
# File 'formula.rb', line 2095

def self.core_names
  CoreTap.instance.formula_names
end

.cxxstdlib_check(check_type) ⇒ Object

Pass :skip to this method to disable post-install stdlib checking.



3977
3978
3979
# File 'formula.rb', line 3977

def cxxstdlib_check(check_type)
  define_method(:skip_cxxstdlib_check?) { true } if check_type == :skip
end

.depends_on(dep) ⇒ Object

The dependencies for this formula. Use strings for the names of other formulae. Homebrew provides some :special Requirements for stuff that needs extra handling (often changing some ENV vars or deciding whether to use the system provided version).

Examples

:build means this dependency is only needed during build.

depends_on "cmake" => :build

:test means this dependency is only needed during testing.

depends_on "node" => :test

:recommended dependencies are built by default. But a --without-... option is generated to opt-out.

depends_on "readline" => :recommended

:optional dependencies are NOT built by default unless the auto-generated --with-... option is passed.

depends_on "glib" => :optional

If you need to specify that another formula has to be built with/out certain options (note, no -- needed before the option):

depends_on "zeromq" => "with-pgm"
depends_on "qt" => ["with-qtdbus", "developer"] # Multiple options.

Optional and enforce that "boost" is built using --with-c++11.

depends_on "boost" => [:optional, "with-c++11"]

If a dependency is only needed in certain cases:

depends_on "sqlite" if MacOS.version >= :catalina
depends_on xcode: :build # If the formula really needs full Xcode to compile.
depends_on macos: :mojave # Needs at least macOS Mojave (10.14) to run.

It is possible to only depend on something if build.with? or build.without? "another_formula":

depends_on "postgresql" if build.without? "sqlite"


3786
3787
3788
# File 'formula.rb', line 3786

def depends_on(dep)
  specs.each { |spec| spec.depends_on(dep) }
end

.deprecate!(date:, because:) ⇒ Object

Deprecates a Formula (on the given date) so a warning is shown on each installation. If the date has not yet passed the formula will not be deprecated.

Examples

deprecate! date: "2020-08-27", because: :unmaintained
deprecate! date: "2020-08-27", because: "has been replaced by foo"


4195
4196
4197
4198
4199
4200
4201
# File 'formula.rb', line 4195

def deprecate!(date:, because:)
  @deprecation_date = Date.parse(date)
  return if @deprecation_date > Date.today

  @deprecation_reason = because
  @deprecated = true
end

.deprecated?Boolean

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.

Whether this Formula is deprecated (i.e. warns on installation). Defaults to false.

Returns:

  • (Boolean)

See Also:



4207
4208
4209
# File 'formula.rb', line 4207

def deprecated?
  @deprecated == true
end

.disable!(date:, because:) ⇒ Object

Disables a Formula (on the given date) so it cannot be installed. If the date has not yet passed the formula will be deprecated instead of disabled.

Examples

disable! date: "2020-08-27", because: :does_not_build
disable! date: "2020-08-27", because: "has been replaced by foo"


4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
# File 'formula.rb', line 4242

def disable!(date:, because:)
  @disable_date = Date.parse(date)

  if @disable_date > Date.today
    @deprecation_reason = because
    @deprecated = true
    return
  end

  @disable_reason = because
  @disabled = true
end

.disabled?Boolean

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.

Whether this Formula is disabled (i.e. cannot be installed). Defaults to false.

Returns:

  • (Boolean)

See Also:



4260
4261
4262
# File 'formula.rb', line 4260

def disabled?
  @disabled == true
end

.fails_with(compiler, &block) ⇒ Object

Marks the Formula as failing with a particular compiler so it will fall back to others.

Examples

For Apple compilers, this should be in the format:

fails_with :clang do
  build 600
  cause "multiple configure and compile errors"
end

The block may be omitted and if present, the build may be omitted; if so, then the compiler will not be allowed for all versions.

major_version should be the major release number only, for instance '7' for the GCC 7 series (7.0, 7.1, etc.). If version or the block is omitted, then the compiler will not be allowed for all compilers in that series.

For example, if a bug is only triggered on GCC 7.1 but is not encountered on 7.2:

fails_with :gcc => '7' do
  version '7.1'
end


4012
4013
4014
# File 'formula.rb', line 4012

def fails_with(compiler, &block)
  specs.each { |spec| spec.fails_with(compiler, &block) }
end

.freezeObject

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.



3258
3259
3260
3261
3262
3263
3264
3265
# File 'formula.rb', line 3258

def freeze
  specs.each(&:freeze)
  @livecheck.freeze
  @conflicts.freeze
  @skip_clean_paths.freeze
  @link_overwrite_paths.freeze
  super
end

.full_namesObject

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.

an array of all Formula names, which the tap formulae have the fully-qualified name



2115
2116
2117
# File 'formula.rb', line 2115

def self.full_names
  @full_names ||= core_names + tap_names
end

.fuzzy_search(name) ⇒ 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 a list of approximately matching formula names, but not the complete match



2195
2196
2197
2198
# File 'formula.rb', line 2195

def self.fuzzy_search(name)
  @spell_checker ||= DidYouMean::SpellChecker.new(dictionary: Set.new(names + full_names).to_a)
  @spell_checker.correct(name)
end

.go_resource(name, &block) ⇒ Object

Deprecated.

Use Go modules instead.

Specify a Go resource.



3718
3719
3720
3721
# File 'formula.rb', line 3718

def go_resource(name, &block)
  odeprecated "`Formula.go_resource`", "Go modules"
  specs.each { |spec| spec.go_resource(name, &block) }
end

.inherited(child) ⇒ 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.

Initialise instance variables for each subclass. These need to be initialised before the class is frozen, and some DSL may never be called so it can't be done lazily.



3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
# File 'formula.rb', line 3230

def inherited(child)
  super
  child.instance_eval do
    # Ensure this is synced with `freeze`
    @stable = SoftwareSpec.new(flags: build_flags)
    @head = HeadSoftwareSpec.new(flags: build_flags)
    @livecheck = Livecheck.new(self)
    @conflicts = []
    @skip_clean_paths = Set.new
    @link_overwrite_paths = Set.new
    @loaded_from_api = false
    @network_access_allowed = SUPPORTED_NETWORK_ACCESS_PHASES.to_h do |phase|
      [phase, DEFAULT_NETWORK_ACCESS_ALLOWED]
    end
  end
end

.installedObject

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.

An array of all installed Formula



2155
2156
2157
2158
2159
2160
2161
# File 'formula.rb', line 2155

def self.installed
  Formula.cache[:installed] ||= racks.flat_map do |rack|
    Formulary.from_rack(rack)
  rescue
    []
  end.uniq(&:name)
end

.installed_formula_namesArray<String>

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.

An array of all currently installed formula names.

Returns:



2150
2151
2152
# File 'formula.rb', line 2150

def self.installed_formula_names
  racks.map { |rack| rack.basename.to_s }
end

.installed_with_alias_path(alias_path) ⇒ 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.



2163
2164
2165
2166
2167
# File 'formula.rb', line 2163

def self.installed_with_alias_path(alias_path)
  return [] if alias_path.nil?

  installed.select { |f| f.installed_alias_path == alias_path }
end

.keg_only(reason, explanation = "") ⇒ Object

Software that will not be symlinked into the brew --prefix and will only live in its Cellar. Other formulae can depend on it and Homebrew will add the necessary includes, libraries and other paths while building that other formula.

Keg-only formulae are not in your PATH and are not seen by compilers if you build your own software outside of Homebrew. This way, we don't shadow software provided by macOS.

Examples

keg_only :provided_by_macos
keg_only :versioned_formulae
keg_only "because I want it so"


3970
3971
3972
# File 'formula.rb', line 3970

def keg_only(reason, explanation = "")
  @keg_only_reason = KegOnlyReason.new(reason, explanation)
end

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.

Permit overwriting certain files while linking.

Examples

Sometimes we accidentally install files outside the prefix. Once we fix that, users will get a link conflict error. Overwrite those files with:

link_overwrite "bin/foo", "lib/bar"
link_overwrite "share/man/man1/baz-*"


4292
4293
4294
4295
# File 'formula.rb', line 4292

def link_overwrite(*paths)
  paths.flatten!
  link_overwrite_paths.merge(paths)
end

.livecheckable?Boolean

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.

Checks whether a livecheck specification is defined or not.

It returns true when a livecheck block is present in the Formula and false otherwise.

Returns:

  • (Boolean)


3446
3447
3448
# File 'formula.rb', line 3446

def livecheckable?
  @livecheckable == true
end

.loaded_from_api?Boolean

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:

  • (Boolean)


156
# File 'sorbet/rbi/parlour.rbi', line 156

def self.loaded_from_api?; end

.namesObject

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.

an array of all Formula names



2110
2111
2112
# File 'formula.rb', line 2110

def self.names
  @names ||= (core_names + tap_names.map { |name| name.split("/").last }).uniq.sort
end

.needs(*standards) ⇒ Object

Marks the Formula as needing a certain standard, so Homebrew will fall back to other compilers if the default compiler does not implement that standard.

We generally prefer to depends_on a desired compiler and to explicitly use that compiler in a formula's #install block, rather than implicitly finding a suitable compiler with needs.

See Also:



4027
4028
4029
# File 'formula.rb', line 4027

def needs(*standards)
  specs.each { |spec| spec.needs(*standards) }
end

.network_access_allowed?(phase) ⇒ Boolean

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.

Whether the specified phase should be forced offline.

Parameters:

Returns:

  • (Boolean)

Raises:

  • (ArgumentError)


3419
3420
3421
3422
3423
3424
# File 'formula.rb', line 3419

def network_access_allowed?(phase)
  raise ArgumentError, "Unknown phase: #{phase}" unless SUPPORTED_NETWORK_ACCESS_PHASES.include?(phase)

  env_var = Homebrew::EnvConfig.send(:"formula_#{phase}_network")
  env_var.nil? ? @network_access_allowed[phase] : env_var == "allow"
end

.on_macos(&block) ⇒ 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.

This method is included by OnSystem



8
# File 'formula.rbi', line 8

def self.on_macos(&block); end

.on_system_blocks_exist?Boolean

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:

  • (Boolean)


6
# File 'formula.rbi', line 6

def self.on_system_blocks_exist?; end

.patch(strip = :p1, src = nil, &block) ⇒ Object

External patches can be declared using resource-style blocks.

Examples

patch do
  url "https://example.com/example_patch.diff"
  sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
end

A strip level of -p1 is assumed. It can be overridden using a symbol argument:

patch :p0 do
  url "https://example.com/example_patch.diff"
  sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
end

Patches can be declared in stable and head blocks. This form is preferred over using conditionals.

stable do
  patch do
    url "https://example.com/example_patch.diff"
    sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
  end
end

Embedded (__END__) patches are declared like so:

patch :DATA
patch :p0, :DATA

Patches can also be embedded by passing a string. This makes it possible to provide multiple embedded patches while making only some of them conditional.

patch :p0, "..."

See Also:



3903
3904
3905
# File 'formula.rb', line 3903

def patch(strip = :p1, src = nil, &block)
  specs.each { |spec| spec.patch(strip, src, &block) }
end

.pour_bottle?(only_if: nil, &block) ⇒ Boolean

Defines whether the Formula's bottle can be used on the given Homebrew installation.

Examples

If the bottle requires the Xcode CLT to be installed a Formula would declare:

pour_bottle? do
  reason "The bottle needs the Xcode CLT to be installed."
  satisfy { MacOS::CLT.installed? }
end

If satisfy returns false then a bottle will not be used and instead the Formula will be built from source and reason will be printed.

Alternatively, a preset reason can be passed as a symbol:

pour_bottle? only_if: :clt_installed

Returns:

  • (Boolean)


4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
# File 'formula.rb', line 4142

def pour_bottle?(only_if: nil, &block)
  @pour_bottle_check = PourBottleCheck.new(self)
  @pour_bottle_only_if = only_if

  if only_if.present? && block.present?
    raise ArgumentError, "Do not pass both a preset condition and a block to `pour_bottle?`"
  end

  block ||= case only_if
  when :clt_installed
    lambda do |_|
      on_macos do
        T.bind(self, PourBottleCheck)
        reason(+<<~EOS)
          The bottle needs the Apple Command Line Tools to be installed.
            You can install them, if desired, with:
              xcode-select --install
        EOS
        satisfy { MacOS::CLT.installed? }
      end
    end
  when :default_prefix
    lambda do |_|
      T.bind(self, PourBottleCheck)
      reason(+<<~EOS)
        The bottle (and many others) needs to be installed into #{Homebrew::DEFAULT_PREFIX}.
      EOS
      satisfy { HOMEBREW_PREFIX.to_s == Homebrew::DEFAULT_PREFIX }
    end
  else
    raise ArgumentError, "Invalid preset `pour_bottle?` condition" if only_if.present?
  end

  @pour_bottle_check.instance_eval(&block)
end

.racksObject

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.

An array of all racks currently installed.



2138
2139
2140
2141
2142
2143
2144
2145
2146
# File 'formula.rb', line 2138

def self.racks
  Formula.cache[:racks] ||= if HOMEBREW_CELLAR.directory?
    HOMEBREW_CELLAR.subdirs.reject do |rack|
      rack.symlink? || rack.basename.to_s.start_with?(".") || rack.subdirs.empty?
    end
  else
    []
  end
end

.resource(name, klass = Resource, &block) ⇒ void

This method returns an undefined value.

Additional downloads can be defined as resources and accessed in the install method. Resources can also be defined inside a stable or head block. This mechanism replaces ad-hoc "subformula" classes.

Example

resource "additional_files" do
  url "https://example.com/additional-stuff.tar.gz"
  sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
end

Parameters:



3709
3710
3711
3712
3713
# File 'formula.rb', line 3709

def resource(name, klass = Resource, &block)
  specs.each do |spec|
    spec.resource(name, klass, &block) unless spec.resource_defined?(name)
  end
end

.service?Boolean

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.

Checks whether a service specification is defined or not.

It returns true when a service block is present in the Formula and false otherwise.

Returns:

  • (Boolean)


3455
3456
3457
# File 'formula.rb', line 3455

def service?
  @service_block.present?
end

.skip_clean(*paths) ⇒ Object

Skip cleaning paths in a formula.

Sometimes the formula cleaner breaks things.

Examples

Preserve cleaned paths with:

skip_clean "bin/foo", "lib/bar"

Keep .la files with:

skip_clean :la


3940
3941
3942
3943
3944
# File 'formula.rb', line 3940

def skip_clean(*paths)
  paths.flatten!
  # Specifying :all is deprecated and will become an error
  skip_clean_paths.merge(paths)
end

.spec_symsObject

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.



3502
3503
3504
# File 'formula.rb', line 3502

def spec_syms
  [:stable, :head].freeze
end

.specsObject

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.

A list of the stable and head SoftwareSpecs.



3507
3508
3509
3510
3511
# File 'formula.rb', line 3507

def specs
  spec_syms.map do |sym|
    send(sym)
  end.freeze
end

.tap_aliasesObject

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.

an array of all tap aliases



2180
2181
2182
# File 'formula.rb', line 2180

def self.tap_aliases
  @tap_aliases ||= Tap.reject(&:core_tap?).flat_map(&:aliases).sort
end

.tap_filesObject

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.

an array of all tap Formula files



2105
2106
2107
# File 'formula.rb', line 2105

def self.tap_files
  @tap_files ||= Tap.reject(&:core_tap?).flat_map(&:formula_files)
end

.tap_namesObject

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.

an array of all tap Formula names



2100
2101
2102
# File 'formula.rb', line 2100

def self.tap_names
  @tap_names ||= Tap.reject(&:core_tap?).flat_map(&:formula_names).sort
end

.test(&block) ⇒ Boolean

A test is required for new formulae and makes us happy.

The block will create, run in and delete a temporary directory.

We want tests that don't require any user input and test the basic functionality of the application. For example, foo build-foo input.foo is a good test and foo --version or foo --help are bad tests. However, a bad test is better than no test at all.

Examples

(testpath/"test.file").write <<~EOS
  writing some test file, if you need to
EOS
assert_equal "OK", shell_output("test_command test.file").strip

Need complete control over stdin, stdout?

require "open3"
Open3.popen3("#{bin}/example", "argument") do |stdin, stdout, _|
  stdin.write("some text")
  stdin.close
  assert_equal "result", stdout.read
end

The test will fail if it returns false, or if an exception is raised. Failed assertions and failed system commands will raise exceptions.

Returns:

  • (Boolean)

See Also:



4067
4068
4069
# File 'formula.rb', line 4067

def test(&block)
  define_method(:test, &block)
end

.uses_from_macos(dep, bounds = {}) ⇒ void

This method returns an undefined value.

Indicates use of dependencies provided by macOS. On macOS this is a no-op (as we use the provided system libraries) unless :since specifies a minimum macOS version. On Linux this will act as depends_on.

Parameters:



3802
3803
3804
# File 'formula.rb', line 3802

def uses_from_macos(dep, bounds = {})
  specs.each { |spec| spec.uses_from_macos(dep, bounds) }
end

Instance Method Details

#active_log_prefixString

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.

The prefix, if any, to use in filenames for logging current activity.

Returns:



1177
1178
1179
1180
1181
1182
1183
# File 'formula.rb', line 1177

def active_log_prefix
  if active_log_type
    "#{active_log_type}."
  else
    ""
  end
end

#add_global_deps_to_spec(spec) ⇒ 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.

Parameters:



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'extend/os/linux/formula.rb', line 30

def add_global_deps_to_spec(spec)
  return unless DevelopmentTools.needs_build_formulae?

  @global_deps ||= begin
    dependency_collector = spec.dependency_collector
    related_formula_names = Set.new([
      name,
      *aliases,
      *versioned_formulae_names,
    ])
    [
      dependency_collector.gcc_dep_if_needed(related_formula_names),
      dependency_collector.glibc_dep_if_needed(related_formula_names),
    ].compact.freeze
  end
  @global_deps.each { |dep| spec.dependency_collector.add(dep) }
end

#alias_changed?Boolean

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.

Has the alias used to install the formula changed, or are different formulae already installed with this alias?

Returns:

  • (Boolean)


1701
1702
1703
# File 'formula.rb', line 1701

def alias_changed?
  installed_alias_target_changed? || supersedes_an_installed_formula?
end

#aliasesArray<String>

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

All aliases for the formula.

Returns:



585
586
587
# File 'formula.rb', line 585

def aliases
  @aliases ||= tap&.alias_reverse_table&.dig(full_name)&.map { _1.split("/").last } || []
end

#allow_network_access!(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


72
# File 'sorbet/rbi/parlour.rbi', line 72

def allow_network_access!(*args, **options, &block); end

#any_installed_kegKeg?

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 a Keg for the opt_prefix or installed_prefix if they exist. If not, return nil.

Returns:



2263
2264
2265
2266
2267
2268
# File 'formula.rb', line 2263

def any_installed_keg
  Formula.cache[:any_installed_keg] ||= {}
  Formula.cache[:any_installed_keg][full_name] ||= if (installed_prefix = any_installed_prefix)
    Keg.new(installed_prefix)
  end
end

#any_installed_prefixPathname?

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Get the path of any installed prefix.

Returns:



2274
2275
2276
2277
2278
2279
2280
# File 'formula.rb', line 2274

def any_installed_prefix
  if optlinked? && opt_prefix.exist?
    opt_prefix
  elsif (latest_installed_prefix = installed_prefixes.last)
    latest_installed_prefix
  end
end

#any_installed_versionObject

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 PkgVersion for this formula if it is installed. If not, return nil.



2284
2285
2286
# File 'formula.rb', line 2284

def any_installed_version
  any_installed_keg&.version
end

#any_version_installed?Boolean

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.

If at least one version of Formula is installed.

Returns:

  • (Boolean)


639
640
641
# File 'formula.rb', line 639

def any_version_installed?
  installed_prefixes.any? { |keg| (keg/Tab::FILENAME).file? }
end

#bash_completionPathname

The directory where the formula's Bash completion files should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Returns:



1135
1136
1137
# File 'formula.rb', line 1135

def bash_completion
  prefix/"etc/bash_completion.d"
end

#binPathname

The directory where the formula's binaries should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Examples

Need to install into the #bin but the makefile doesn't mkdir -p prefix/bin?

bin.mkpath

No make install available?

bin.install "binary1"

Returns:



781
782
783
# File 'formula.rb', line 781

def bin
  prefix/"bin"
end

#bottleBottle?

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.

The Bottle object for the currently active SoftwareSpec.

Returns:



420
421
422
# File 'formula.rb', line 420

def bottle
  @bottle ||= Bottle.new(self, bottle_specification) if bottled?
end

#bottle_defined?(*args, **options, &block) ⇒ Boolean

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)


36
# File 'sorbet/rbi/parlour.rbi', line 36

def bottle_defined?(*args, **options, &block); end

#bottle_for_tag(tag = nil) ⇒ Bottle?

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.

The Bottle object for given tag.

Parameters:

Returns:



426
427
428
# File 'formula.rb', line 426

def bottle_for_tag(tag = nil)
  Bottle.new(self, bottle_specification, tag) if bottled?(tag)
end

#bottle_hash(compact_for_api: false) ⇒ 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 bottle information for a formula.



2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
# File 'formula.rb', line 2581

def bottle_hash(compact_for_api: false)
  hash = {}
  stable_spec = stable
  return hash unless stable_spec
  return hash unless bottle_defined?

  bottle_spec = stable_spec.bottle_specification

  hash["rebuild"] = bottle_spec.rebuild if !compact_for_api || !bottle_spec.rebuild.zero?
  hash["root_url"] = bottle_spec.root_url unless compact_for_api
  hash["files"] = {}

  bottle_spec.collector.each_tag do |tag|
    tag_spec = bottle_spec.collector.specification_for(tag, no_older_versions: true)
    os_cellar = tag_spec.cellar
    os_cellar = os_cellar.inspect if os_cellar.is_a?(Symbol)
    checksum = tag_spec.checksum.hexdigest

    file_hash = {}
    file_hash["cellar"] = os_cellar
    unless compact_for_api
      filename = Bottle::Filename.create(self, tag, bottle_spec.rebuild)
      path, = Utils::Bottles.path_resolved_basename(bottle_spec.root_url, name, checksum, filename)
      file_hash["url"] = "#{bottle_spec.root_url}/#{path}"
    end
    file_hash["sha256"] = checksum

    hash["files"][tag.to_sym] = file_hash
  end
  hash
end

#bottle_prefixPathname

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.

The directory used for as the prefix for #etc and #var files on installation so, despite not being in HOMEBREW_CELLAR, they are installed there after pouring a bottle.

Returns:



1165
1166
1167
# File 'formula.rb', line 1165

def bottle_prefix
  prefix/".bottle"
end

#bottle_specification(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


45
# File 'sorbet/rbi/parlour.rbi', line 45

def bottle_specification(*args, **options, &block); end

#bottle_tab_attributesHash

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:



3131
3132
3133
3134
3135
# File 'formula.rb', line 3131

def bottle_tab_attributes
  return {} unless bottled?

  T.must(bottle).tab_attributes
end

#bottle_tag?(*args, **options, &block) ⇒ Boolean

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)


39
# File 'sorbet/rbi/parlour.rbi', line 39

def bottle_tag?(*args, **options, &block); end

#bottled?(*args, **options, &block) ⇒ Boolean

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)


42
# File 'sorbet/rbi/parlour.rbi', line 42

def bottled?(*args, **options, &block); end

#brew(fetch: true, keep_tmp: false, debug_symbols: false, interactive: false) ⇒ 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.

Yields |self,staging| with current working directory set to the uncompressed tarball where staging is a Mktemp staging context.



1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
# File 'formula.rb', line 1569

def brew(fetch: true, keep_tmp: false, debug_symbols: false, interactive: false)
  @prefix_returns_versioned_prefix = true
  active_spec.fetch if fetch
  stage(interactive:, debug_symbols:) do |staging|
    staging.retain! if keep_tmp || debug_symbols

    prepare_patches
    fetch_patches if fetch

    begin
      yield self, staging
    rescue
      staging.retain! if interactive || debug?
      raise
    ensure
      %w[
        config.log
        CMakeCache.txt
        CMakeOutput.log
        CMakeError.log
        meson-log.txt
      ].each do |logfile|
        Dir["**/#{logfile}"].each do |logpath|
          destdir = logs/File.dirname(logpath)
          mkdir_p destdir
          cp logpath, destdir
        end
      end
    end
  end
ensure
  @prefix_returns_versioned_prefix = false
end

#cached_download(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


93
# File 'sorbet/rbi/parlour.rbi', line 93

def cached_download(*args, **options, &block); end

#caveatsString?

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.

Warn the user about any Homebrew-specific issues or quirks for this package. These should not contain setup instructions that would apply to installation through a different package manager on a different OS.

Example

def caveats
  <<~EOS
    Are optional. Something the user must be warned about?
  EOS
end
def caveats
  s = <<~EOS
    Print some important notice to the user when `brew info [formula]` is
    called or when brewing a formula.
    This is optional. You can use all the vars like #{version} here.
  EOS
  s += "Some issue only on older systems" if MacOS.version < :el_capitan
  s
end

Returns:



1446
1447
1448
# File 'formula.rb', line 1446

def caveats
  nil
end

#caveats_with_placeholdersObject

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.



2663
2664
2665
2666
# File 'formula.rb', line 2663

def caveats_with_placeholders
  caveats&.gsub(HOMEBREW_PREFIX, HOMEBREW_PREFIX_PLACEHOLDER)
         &.gsub(HOMEBREW_CELLAR, HOMEBREW_CELLAR_PLACEHOLDER)
end

#clear_cache(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


96
# File 'sorbet/rbi/parlour.rbi', line 96

def clear_cache(*args, **options, &block); end

#compiler_failures(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


111
# File 'sorbet/rbi/parlour.rbi', line 111

def compiler_failures(*args, **options, &block); end

#conflictsArray<FormulaConflict>

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

!attr[r] conflicts

Returns:



2241
# File 'formula.rb', line 2241

def conflicts = self.class.conflicts

#core_formula?Boolean

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.

True if this formula is provided by Homebrew itself

Returns:

  • (Boolean)


2206
2207
2208
# File 'formula.rb', line 2206

def core_formula?
  !!tap&.core_tap?
end

#current_installed_alias_targetObject

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.



1678
1679
1680
# File 'formula.rb', line 1678

def current_installed_alias_target
  Formulary.factory(T.must(installed_alias_name)) if installed_alias_path
end

#declared_deps(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


87
# File 'sorbet/rbi/parlour.rbi', line 87

def declared_deps(*args, **options, &block); end

#deny_network_access!(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


75
# File 'sorbet/rbi/parlour.rbi', line 75

def deny_network_access!(*args, **options, &block); end

#dependencies_hashObject

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.



2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
# File 'formula.rb', line 2668

def dependencies_hash
  # Create a hash of spec names (stable/head) to the list of dependencies under each
  dependencies = self.class.spec_syms.to_h do |sym|
    [sym, send(sym)&.declared_deps]
  end

  # Implicit dependencies are only needed when installing from source
  # since they are only used to download and unpack source files.
  # @see DependencyCollector
  dependencies.transform_values! { |deps| deps&.reject(&:implicit?) }

  hash = {}

  dependencies.each do |spec_sym, spec_deps|
    next if spec_deps.nil?

    dep_hash = if spec_sym == :stable
      hash
    else
      next if spec_deps == dependencies[:stable]

      hash["#{spec_sym}_dependencies"] ||= {}
    end

    dep_hash["build_dependencies"] = spec_deps.select(&:build?)
                                              .reject(&:uses_from_macos?)
                                              .map(&:name)
                                              .uniq
    dep_hash["dependencies"] = spec_deps.reject(&:optional?)
                                        .reject(&:recommended?)
                                        .reject(&:build?)
                                        .reject(&:test?)
                                        .reject(&:uses_from_macos?)
                                        .map(&:name)
                                        .uniq
    dep_hash["test_dependencies"] = spec_deps.select(&:test?)
                                             .reject(&:uses_from_macos?)
                                             .map(&:name)
                                             .uniq
    dep_hash["recommended_dependencies"] = spec_deps.select(&:recommended?)
                                                    .reject(&:uses_from_macos?)
                                                    .map(&:name)
                                                    .uniq
    dep_hash["optional_dependencies"] = spec_deps.select(&:optional?)
                                                 .reject(&:uses_from_macos?)
                                                 .map(&:name)
                                                 .uniq

    uses_from_macos_deps = spec_deps.select(&:uses_from_macos?).uniq
    dep_hash["uses_from_macos"] = uses_from_macos_deps.map do |dep|
      if dep.tags.length >= 2
        { dep.name => dep.tags }
      elsif dep.tags.present?
        { dep.name => dep.tags.first }
      else
        dep.name
      end
    end
    dep_hash["uses_from_macos_bounds"] = uses_from_macos_deps.map(&:bounds)
  end

  hash
end

#deprecated?Boolean

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.

Whether this Formula is deprecated (i.e. warns on installation). Defaults to false.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)

See Also:



1513
# File 'formula.rb', line 1513

delegate deprecated?: :"self.class"

#deprecated_flags(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


105
# File 'sorbet/rbi/parlour.rbi', line 105

def deprecated_flags(*args, **options, &block); end

#deprecated_options(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


102
# File 'sorbet/rbi/parlour.rbi', line 102

def deprecated_options(*args, **options, &block); end

#deprecation_dateT.untyped

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.

The date that this Formula was or becomes deprecated. Returns nil if no date is specified.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)

    Date

See Also:



1520
# File 'formula.rb', line 1520

delegate deprecation_date: :"self.class"

#deprecation_reasonT.untyped

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.

The reason this Formula is deprecated. Returns nil if no reason is specified or the formula is not deprecated.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



1527
# File 'formula.rb', line 1527

delegate deprecation_reason: :"self.class"

#deps(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


84
# File 'sorbet/rbi/parlour.rbi', line 84

def deps(*args, **options, &block); end

#descT.untyped

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.

The description of the software.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



433
# File 'formula.rb', line 433

delegate desc: :"self.class"

#deuniversalize_machos(*targets) ⇒ 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.

Replaces a universal binary with its native slice.

If called with no parameters, does this with all compatible universal binaries in a Formula's Keg.

Parameters:



27
# File 'extend/os/linux/formula.rb', line 27

def deuniversalize_machos(*targets); end

#disable_dateT.untyped

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.

The date that this Formula was or becomes disabled. Returns nil if no date is specified.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)

    Date

See Also:



1541
# File 'formula.rb', line 1541

delegate disable_date: :"self.class"

#disable_reasonT.untyped

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.

The reason this Formula is disabled. Returns nil if no reason is specified or the formula is not disabled.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



1548
# File 'formula.rb', line 1548

delegate disable_reason: :"self.class"

#disabled?Boolean

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.

Whether this Formula is disabled (i.e. cannot be installed). Defaults to false.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)

See Also:



1534
# File 'formula.rb', line 1534

delegate disabled?: :"self.class"

#docPathname

The directory where the formula's documentation should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Returns:



791
792
793
# File 'formula.rb', line 791

def doc
  share/"doc"/name
end

#downloader(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


48
# File 'sorbet/rbi/parlour.rbi', line 48

def downloader(*args, **options, &block); end

#eligible_kegs_for_cleanup(quiet: false) ⇒ 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.



3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
# File 'formula.rb', line 3049

def eligible_kegs_for_cleanup(quiet: false)
  eligible_for_cleanup = []
  if latest_version_installed?
    eligible_kegs = if head? && (head_prefix = latest_head_prefix)
      head, stable = installed_kegs.partition { |keg| keg.version.head? }

      # Remove newest head and stable kegs.
      head - [Keg.new(head_prefix)] + T.must(stable.sort_by(&:scheme_and_version).slice(0...-1))
    else
      installed_kegs.select do |keg|
        tab = keg.tab
        if version_scheme > tab.version_scheme
          true
        elsif version_scheme == tab.version_scheme
          pkg_version > keg.version
        else
          false
        end
      end
    end

    unless eligible_kegs.empty?
      eligible_kegs.each do |keg|
        if keg.linked?
          opoo "Skipping (old) #{keg} due to it being linked" unless quiet
        elsif pinned? && keg == Keg.new(@pin.path.resolved_path)
          opoo "Skipping (old) #{keg} due to it being pinned" unless quiet
        else
          eligible_for_cleanup << keg
        end
      end
    end
  elsif !installed_prefixes.empty? && !pinned?
    # If the cellar only has one version installed, don't complain
    # that we can't tell which one to keep. Don't complain at all if the
    # only installed version is a pinned formula.
    opoo "Skipping #{full_name}: most recent version #{pkg_version} not installed" unless quiet
  end
  eligible_for_cleanup
end

#elispPathname

The directory where Emacs Lisp files should be installed, with the formula name appended to avoid linking conflicts.

Example

To install an Emacs mode included with a software package:

elisp.install "contrib/emacs/example-mode.el"

Returns:



1047
1048
1049
# File 'formula.rb', line 1047

def elisp
  prefix/"share/emacs/site-lisp"/name
end

#env(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


153
# File 'sorbet/rbi/parlour.rbi', line 153

def env(*args, **options, &block); end

#etcPathname

The directory where the formula's configuration files should be installed. Anything using etc.install will not overwrite other files on e.g. upgrades but will write a new file named *.default. This directory is not inside the HOMEBREW_CELLAR so it persists across upgrades.

Returns:



1081
1082
1083
# File 'formula.rb', line 1081

def etc
  (HOMEBREW_PREFIX/"etc").extend(InstallRenamed)
end

#fetch(verify_download_integrity: true) ⇒ 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.



2754
2755
2756
# File 'formula.rb', line 2754

def fetch(verify_download_integrity: true)
  active_spec.fetch(verify_download_integrity:)
end

#fetch_bottle_tabvoid

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.



3124
3125
3126
3127
3128
# File 'formula.rb', line 3124

def fetch_bottle_tab
  return unless bottled?

  T.must(bottle).fetch_tab
end

#fetch_patchesObject

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.



3119
3120
3121
# File 'formula.rb', line 3119

def fetch_patches
  patchlist.select(&:external?).each(&:fetch)
end

#fish_completionPathname

The directory where the formula's fish completion files should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Returns:



1157
1158
1159
# File 'formula.rb', line 1157

def fish_completion
  share/"fish/vendor_completions.d"
end

#fish_functionPathname

The directory where the formula's fish function files should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Returns:



1124
1125
1126
# File 'formula.rb', line 1124

def fish_function
  share/"fish/vendor_functions.d"
end

#frameworksPathname

The directory where the formula's Frameworks should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only. This is not symlinked into HOMEBREW_PREFIX.

Returns:



1058
1059
1060
# File 'formula.rb', line 1058

def frameworks
  prefix/"Frameworks"
end

#full_installed_alias_nameObject

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.



356
357
358
# File 'formula.rb', line 356

def full_installed_alias_name
  full_name_with_optional_tap(installed_alias_name)
end

#full_installed_specified_nameObject

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.

The name (including tap) specified to install this formula.



387
388
389
# File 'formula.rb', line 387

def full_installed_specified_name
  full_installed_alias_name || full_name
end

#full_specified_nameObject

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.

The name (including tap) specified to find this formula.



377
378
379
# File 'formula.rb', line 377

def full_specified_name
  full_alias_name || full_name
end

#generate_completions_from_executable(*commands, base_name: name, shells: [:bash, :zsh, :fish], shell_parameter_format: nil) ⇒ 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.

Generate shell completions for a formula for bash, zsh and fish, using the formula's executable.

Examples

Using default values for optional arguments.

generate_completions_from_executable(bin/"foo", "completions")

# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions", "bash")
(zsh_completion/"_foo").write Utils.safe_popen_read({ "SHELL" => "zsh" }, bin/"foo", "completions", "zsh")
(fish_completion/"foo.fish").write Utils.safe_popen_read({ "SHELL" => "fish" }, bin/"foo",
                                                         "completions", "fish")

Selecting shells and using a different base_name.

generate_completions_from_executable(bin/"foo", "completions", shells: [:bash, :zsh], base_name: "bar")

# translates to
(bash_completion/"bar").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions", "bash")
(zsh_completion/"_bar").write Utils.safe_popen_read({ "SHELL" => "zsh" }, bin/"foo", "completions", "zsh")

Using predefined shell_parameter_format :flag.

generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: :flag, shells: [:bash])

# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions", "--bash")

Using predefined shell_parameter_format :arg.

generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: :arg, shells: [:bash])

# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo",
                                                    "completions", "--shell=bash")

Using predefined shell_parameter_format :none.

generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: :none, shells: [:bash])

# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions")

Using predefined shell_parameter_format :click.

generate_completions_from_executable(bin/"foo", shell_parameter_format: :click, shells: [:zsh])

# translates to
(zsh_completion/"_foo").write Utils.safe_popen_read({ "SHELL" => "zsh", "_FOO_COMPLETE" => "zsh_source" },
                                                    bin/"foo")

Using custom shell_parameter_format.

generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: "--selected-shell=",
                                     shells: [:bash])

# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo",
                                                    "completions", "--selected-shell=bash")

Parameters:

  • commands (Pathname, String)

    the path to the executable and any passed subcommand(s) to use for generating the completion scripts.

  • base_name (String) (defaults to: name)

    the base name of the generated completion script. Defaults to the formula name.

  • shells (Array<Symbol>) (defaults to: [:bash, :zsh, :fish])

    the shells to generate completion scripts for. Defaults to [:bash, :zsh, :fish].

  • shell_parameter_format (Symbol, String, nil) (defaults to: nil)

    specify how shells should each be passed to the executable. Takes either a String representing a prefix, or one of [:flag, :arg, :none, :click]. Defaults to plainly passing the shell.



2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
# File 'formula.rb', line 2052

def generate_completions_from_executable(*commands,
                                         base_name: name,
                                         shells: [:bash, :zsh, :fish],
                                         shell_parameter_format: nil)
  completion_script_path_map = {
    bash: bash_completion/base_name,
    zsh:  zsh_completion/"_#{base_name}",
    fish: fish_completion/"#{base_name}.fish",
  }

  shells.each do |shell|
    popen_read_env = { "SHELL" => shell.to_s }
    script_path = completion_script_path_map[shell]
    shell_parameter = if shell_parameter_format.nil?
      shell.to_s
    elsif shell_parameter_format == :flag
      "--#{shell}"
    elsif shell_parameter_format == :arg
      "--shell=#{shell}"
    elsif shell_parameter_format == :none
      nil
    elsif shell_parameter_format == :click
      prog_name = File.basename(commands.first.to_s).upcase.tr("-", "_")
      popen_read_env["_#{prog_name}_COMPLETE"] = "#{shell}_source"
      nil
    else
      "#{shell_parameter_format}#{shell}"
    end

    popen_read_args = %w[]
    popen_read_args << commands
    popen_read_args << shell_parameter if shell_parameter.present?
    popen_read_args.flatten!

    popen_read_options = {}
    popen_read_options[:err] = :err unless ENV["HOMEBREW_STDERR"]

    script_path.dirname.mkpath
    script_path.write Utils.safe_popen_read(popen_read_env, *popen_read_args, **popen_read_options)
  end
end

#head?Boolean

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.

Is the currently active SoftwareSpec a #head build?

Returns:

  • (Boolean)


399
400
401
# File 'formula.rb', line 399

def head?
  active_spec == head
end

#head_only?Boolean

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.

Is this formula HEAD-only?

Returns:

  • (Boolean)


405
406
407
# File 'formula.rb', line 405

def head_only?
  !!head && !stable
end

#head_version_outdated?(version, fetch_head: false) ⇒ Boolean

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:

  • (Boolean)


671
672
673
674
675
676
677
678
679
680
681
682
683
684
# File 'formula.rb', line 671

def head_version_outdated?(version, fetch_head: false)
  tab = Tab.for_keg(prefix(version))

  return true if tab.version_scheme < version_scheme
  return true if stable && tab.stable_version && tab.stable_version < T.must(stable).version
  return false unless fetch_head
  return false unless head&.downloader.is_a?(VCSDownloadStrategy)

  downloader = T.must(head).downloader

  with_context quiet: true do
    downloader.commit_outdated?(version.version.commit)
  end
end

#homepageT.untyped

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.

The homepage for the software.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



443
# File 'formula.rb', line 443

delegate homepage: :"self.class"

#includePathname

The directory where the formula's headers should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Example

No make install available?

include.install "example.h"

Returns:



809
810
811
# File 'formula.rb', line 809

def include
  prefix/"include"
end

#infoPathname

The directory where the formula's info files should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Returns:



819
820
821
# File 'formula.rb', line 819

def info
  share/"info"
end

#inreplace(paths, before = nil, after = nil, audit_result = true, &block) ⇒ void

This method returns an undefined value.

Sometimes we have to change a bit before we install. Mostly we prefer a patch, but if you need the prefix of this formula in the patch you have to resort to inreplace, because in the patch you don't have access to any variables defined by the formula, as only HOMEBREW_PREFIX is available in the embedded patch.

Examples

inreplace supports regular expressions:

inreplace "somefile.cfg", /look[for]what?/, "replace by #{bin}/tool"

inreplace supports blocks:

inreplace "Makefile" do |s|
  s.gsub! "/usr/local", HOMEBREW_PREFIX.to_s
end

Parameters:

See Also:



2859
2860
2861
2862
2863
2864
# File 'formula.rb', line 2859

def inreplace(paths, before = nil, after = nil, audit_result = true, &block) # rubocop:disable Style/OptionalBooleanParameter
  Utils::Inreplace.inreplace(paths, before, after, audit_result:, &block)
rescue Utils::Inreplace::Error => e
  onoe e.to_s
  raise BuildError.new(self, "inreplace", Array(paths), {})
end

#installObject

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 is overridden in Formula subclasses to provide the installation instructions. The sources (from url) are downloaded, hash-checked and then Homebrew changes into a temporary directory where the archive is unpacked or repository cloned.

Example

def install
  system "./configure", "--prefix=#{prefix}"
  system "make", "install"
end


2823
# File 'formula.rb', line 2823

def install; end

#install_etc_varvoid

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.



1380
1381
1382
1383
1384
1385
1386
1387
# File 'formula.rb', line 1380

def install_etc_var
  etc_var_dirs = [bottle_prefix/"etc", bottle_prefix/"var"]
  Find.find(*etc_var_dirs.select(&:directory?)) do |path|
    path = Pathname.new(path)
    path.extend(InstallRenamed)
    path.cp_path_sub(bottle_prefix, HOMEBREW_PREFIX)
  end
end

#installed_alias_nameString?

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:



352
353
354
# File 'formula.rb', line 352

def installed_alias_name
  installed_alias_path&.basename&.to_s
end

#installed_alias_pathPathname?

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.

The alias path that was used to install this formula, if it exists. Can differ from #alias_path, which is the alias used to find the formula, and is specified to this instance.

Returns:



339
340
341
342
343
344
345
346
347
348
349
# File 'formula.rb', line 339

def installed_alias_path
  build_tab = build
  path = build_tab.source["path"] if build_tab.is_a?(Tab)

  return unless path&.match?(%r{#{HOMEBREW_TAP_DIR_REGEX}/Aliases}o)

  path = Pathname(path)
  return unless path.symlink?

  path
end

#installed_alias_target_changed?Boolean

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.

Has the target of the alias used to install this formula changed? Returns false if the formula wasn't installed with an alias.

Returns:

  • (Boolean)


1685
1686
1687
1688
1689
1690
# File 'formula.rb', line 1685

def installed_alias_target_changed?
  target = current_installed_alias_target
  return false unless target

  target.name != name
end

#installed_kegsArray<Keg>

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.

All currently installed kegs.

Returns:



757
758
759
# File 'formula.rb', line 757

def installed_kegs
  installed_prefixes.map { |dir| Keg.new(dir) }
end

#installed_prefixesObject

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.

All currently installed prefix directories.



748
749
750
751
752
753
# File 'formula.rb', line 748

def installed_prefixes
  possible_names.map { |name| HOMEBREW_CELLAR/name }
                .select(&:directory?)
                .flat_map(&:subdirs)
                .sort_by(&:basename)
end

#installed_specified_nameObject

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.

The name specified to install this formula.



382
383
384
# File 'formula.rb', line 382

def installed_specified_name
  installed_alias_name || name
end

#internal_dependencies_hash(spec_symbol) ⇒ 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.

Raises:

  • (ArgumentError)


2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
# File 'formula.rb', line 2732

def internal_dependencies_hash(spec_symbol)
  raise ArgumentError, "Unsupported spec: #{spec_symbol}" unless [:stable, :head].include?(spec_symbol)
  return unless (spec = public_send(spec_symbol))

  spec.declared_deps.each_with_object({}) do |dep, dep_hash|
    # Implicit dependencies are only needed when installing from source
    # since they are only used to download and unpack source files.
    # @see DependencyCollector
    next if dep.implicit?

     = {}
    [:tags] = dep.tags if dep.tags.present?
    [:uses_from_macos] = dep.bounds.presence if dep.uses_from_macos?

    dep_hash[dep.name] = .presence
  end
end

#keg_only?Boolean

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Rarely, you don't want your library symlinked into the main prefix. See gettext.rb for an example.

Returns:

  • (Boolean)

See Also:



1456
1457
1458
1459
1460
# File 'formula.rb', line 1456

def keg_only?
  return false unless keg_only_reason

  keg_only_reason.applicable?
end

#keg_only_reason(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


117
# File 'sorbet/rbi/parlour.rbi', line 117

def keg_only_reason(*args, **options, &block); end

#kext_prefixPathname

The directory where the formula's kernel extensions should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only. This is not symlinked into HOMEBREW_PREFIX.

Returns:



1069
1070
1071
# File 'formula.rb', line 1069

def kext_prefix
  prefix/"Library/Extensions"
end

#latest_formulaObject

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.

If the alias has changed value, return the new formula. Otherwise, return self.



1707
1708
1709
# File 'formula.rb', line 1707

def latest_formula
  installed_alias_target_changed? ? current_installed_alias_target : self
end

#latest_head_prefixObject

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.



666
667
668
669
# File 'formula.rb', line 666

def latest_head_prefix
  head_version = latest_head_version
  prefix(head_version) if head_version
end

#latest_head_versionObject

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.



655
656
657
658
659
660
661
662
663
664
# File 'formula.rb', line 655

def latest_head_version
  head_versions = installed_prefixes.filter_map do |pn|
    pn_pkgversion = PkgVersion.parse(pn.basename.to_s)
    pn_pkgversion if pn_pkgversion.head?
  end

  head_versions.max_by do |pn_pkgversion|
    [Keg.new(prefix(pn_pkgversion)).tab.source_modified_time, pn_pkgversion.revision]
  end
end

#latest_installed_prefixObject

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.

The latest prefix for this formula. Checks for #head and then #stable's #prefix



687
688
689
690
691
692
693
694
695
# File 'formula.rb', line 687

def latest_installed_prefix
  if head && (head_version = latest_head_version) && !head_version_outdated?(head_version)
    latest_head_prefix
  elsif stable && (stable_prefix = prefix(PkgVersion.new(T.must(stable).version, revision))).directory?
    stable_prefix
  else
    prefix
  end
end

#latest_version_installed?Boolean

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.

If this Formula is installed. This is actually just a check for if the #latest_installed_prefix directory exists and is not empty.

Returns:

  • (Boolean)


633
634
635
# File 'formula.rb', line 633

def latest_version_installed?
  (dir = latest_installed_prefix).directory? && !dir.children.empty?
end

#launchd_service_pathPathname

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.

The generated launchd service file path.

Returns:



1245
1246
1247
# File 'formula.rb', line 1245

def launchd_service_path
  opt_prefix/"#{plist_name}.plist"
end

#libPathname

The directory where the formula's libraries should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Example

No make install available?

lib.install "example.dylib"

Returns:



837
838
839
# File 'formula.rb', line 837

def lib
  prefix/"lib"
end

#libexecPathname

The directory where the formula's binaries should be installed. This is not symlinked into HOMEBREW_PREFIX. It is commonly used to install files that we do not wish to be symlinked into HOMEBREW_PREFIX from one of the other directories and instead manually create symlinks or wrapper scripts into e.g. #bin.

Example

libexec.install "foo.jar"
bin.write_jar_script libexec/"foo.jar", "foo"

Returns:



856
857
858
# File 'formula.rb', line 856

def libexec
  prefix/"libexec"
end

#licenseT.untyped

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.

The SPDX ID of the software license.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



438
# File 'formula.rb', line 438

delegate license: :"self.class"

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:

  • (Boolean)

See Also:



1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
# File 'formula.rb', line 1474

def link_overwrite?(path)
  # Don't overwrite files not created by Homebrew.
  return false if path.stat.uid != HOMEBREW_BREW_FILE.stat.uid

  # Don't overwrite files belong to other keg except when that
  # keg's formula is deleted.
  begin
    keg = Keg.for(path)
  rescue NotAKegError, Errno::ENOENT
    # file doesn't belong to any keg.
  else
    tab_tap = keg.tab.tap
    # this keg doesn't below to any core/tap formula, most likely coming from a DIY install.
    return false if tab_tap.nil?

    begin
      f = Formulary.factory(keg.name)
    rescue FormulaUnavailableError
      # formula for this keg is deleted, so defer to allowlist
    rescue TapFormulaAmbiguityError
      return false # this keg belongs to another formula
    else
      # this keg belongs to another unrelated formula
      return false unless f.possible_names.include?(keg.name)
    end
  end
  to_check = path.relative_path_from(HOMEBREW_PREFIX).to_s
  self.class.link_overwrite_paths.any? do |p|
    p == to_check ||
      to_check.start_with?("#{p.chomp("/")}/") ||
      /^#{Regexp.escape(p).gsub('\*', ".*?")}$/.match?(to_check)
  end
end

#linked?Boolean

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Is the formula linked?

Returns:

  • (Boolean)


715
716
717
# File 'formula.rb', line 715

def linked?
  linked_keg.symlink?
end

#linked_kegObject

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

The link status symlink directory for this Formula. You probably want #opt_prefix instead.



647
648
649
650
651
652
653
# File 'formula.rb', line 647

def linked_keg
  linked_keg = possible_names.map { |name| HOMEBREW_LINKED_KEGS/name }
                             .find(&:directory?)
  return linked_keg if linked_keg.present?

  HOMEBREW_LINKED_KEGS/name
end

#linked_versionPkgVersion?

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.

PkgVersion of the linked keg for the formula.

Returns:



734
735
736
737
738
# File 'formula.rb', line 734

def linked_version
  return unless linked?

  Keg.for(linked_keg).version
end

#livecheckT.untyped

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.

The livecheck specification for the software.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



448
# File 'formula.rb', line 448

delegate livecheck: :"self.class"

#livecheckable?Boolean

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.

Is a livecheck specification defined for the software?

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)

See Also:



453
# File 'formula.rb', line 453

delegate livecheckable?: :"self.class"

#loaded_from_api?Boolean

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.

Whether this formula was loaded using the formulae.brew.sh API

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)

See Also:



477
# File 'formula.rb', line 477

delegate loaded_from_api?: :"self.class"

#loader_pathString

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:



22
23
24
# File 'extend/os/linux/formula.rb', line 22

def loader_path
  "$ORIGIN"
end

#lockObject

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.



1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
# File 'formula.rb', line 1603

def lock
  @lock = FormulaLock.new(name)
  @lock.lock

  oldnames.each do |oldname|
    next unless (oldname_rack = HOMEBREW_CELLAR/oldname).exist?
    next if oldname_rack.resolved_path != rack

    oldname_lock = FormulaLock.new(oldname)
    oldname_lock.lock
    @oldname_locks << oldname_lock
  end
end

#logsPathname

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.

The directory where the formula's installation or test logs will be written.

Returns:



1171
1172
1173
# File 'formula.rb', line 1171

def logs
  HOMEBREW_LOGS + name
end

#manPathname

The root directory where the formula's manual pages should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only. Often one of the more specific man functions should be used instead, e.g. #man1.

Returns:



868
869
870
# File 'formula.rb', line 868

def man
  share/"man"
end

#man1Pathname

The directory where the formula's man1 pages should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Example

No make install available?

man1.install "example.1"

Returns:



886
887
888
# File 'formula.rb', line 886

def man1
  man/"man1"
end

#man2Pathname

The directory where the formula's man2 pages should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Returns:



896
897
898
# File 'formula.rb', line 896

def man2
  man/"man2"
end

#man3Pathname

The directory where the formula's man3 pages should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Example

No make install available?

man3.install "man.3"

Returns:



914
915
916
# File 'formula.rb', line 914

def man3
  man/"man3"
end

#man4Pathname

The directory where the formula's man4 pages should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Returns:



924
925
926
# File 'formula.rb', line 924

def man4
  man/"man4"
end

#man5Pathname

The directory where the formula's man5 pages should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Returns:



934
935
936
# File 'formula.rb', line 934

def man5
  man/"man5"
end

#man6Pathname

The directory where the formula's man6 pages should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Returns:



944
945
946
# File 'formula.rb', line 944

def man6
  man/"man6"
end

#man7Pathname

The directory where the formula's man7 pages should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Returns:



954
955
956
# File 'formula.rb', line 954

def man7
  man/"man7"
end

#man8Pathname

The directory where the formula's man8 pages should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Returns:



964
965
966
# File 'formula.rb', line 964

def man8
  man/"man8"
end

#migration_needed?Boolean

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:

  • (Boolean)


1634
1635
1636
# File 'formula.rb', line 1634

def migration_needed?
  !oldnames_to_migrate.empty? && !rack.exist?
end

#missing_dependencies(hide: nil) ⇒ 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 a list of formulae depended on by this formula that aren't installed.



2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
# File 'formula.rb', line 2345

def missing_dependencies(hide: nil)
  hide ||= []
  runtime_formula_dependencies.select do |f|
    hide.include?(f.name) || f.installed_prefixes.empty?
  end
# If we're still getting unavailable formulae at this stage the best we can
# do is just return no results.
rescue FormulaUnavailableError
  []
end

#mkdir(name, &block) ⇒ 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.

A version of FileUtils.mkdir that also changes to that folder in a block.



3100
3101
3102
3103
3104
3105
# File 'formula.rb', line 3100

def mkdir(name, &block)
  result = FileUtils.mkdir_p(name)
  return result unless block

  FileUtils.chdir(name, &block)
end

#mktemp(prefix = name, opts = {}, &block) ⇒ 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.

Create a temporary directory then yield. When the block returns, recursively delete the temporary directory. Passing opts[:retain] or calling do |staging| ... staging.retain! in the block will skip the deletion and retain the temporary directory's contents.



3094
3095
3096
# File 'formula.rb', line 3094

def mktemp(prefix = name, opts = {}, &block)
  Mktemp.new(prefix, opts).run(&block)
end

#network_access_allowed?(*args, **options, &block) ⇒ Boolean

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)


78
# File 'sorbet/rbi/parlour.rbi', line 78

def network_access_allowed?(*args, **options, &block); end

#new_formula_available?Boolean

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:

  • (Boolean)


1674
1675
1676
# File 'formula.rb', line 1674

def new_formula_available?
  installed_alias_target_changed? && !latest_formula.latest_version_installed?
end

#old_installed_formulaeObject

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.



1711
1712
1713
1714
1715
1716
1717
1718
# File 'formula.rb', line 1711

def old_installed_formulae
  # If this formula isn't the current target of the alias,
  # it doesn't make sense to say that other formulae are older versions of it
  # because we don't know which came first.
  return [] if alias_path.nil? || installed_alias_target_changed?

  self.class.installed_with_alias_path(alias_path).reject { |f| f.name == name }
end

#oldnamesArray<String>

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Old names for the formula.

Returns:



572
573
574
575
576
577
578
579
# File 'formula.rb', line 572

def oldnames
  @oldnames ||= if (tap = self.tap)
    Tap.tap_migration_oldnames(tap, name) +
      tap.formula_reverse_renames.fetch(name, [])
  else
    []
  end
end

#oldnames_to_migrateArray<String>

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:



1623
1624
1625
1626
1627
1628
1629
1630
1631
# File 'formula.rb', line 1623

def oldnames_to_migrate
  oldnames.select do |oldname|
    old_rack = HOMEBREW_CELLAR/oldname
    next false unless old_rack.directory?
    next false if old_rack.subdirs.empty?

    tap == Tab.for_keg(old_rack.subdirs.min).tap
  end
end

#on_system_blocks_exist?Boolean

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:

  • (Boolean)


2750
2751
2752
# File 'formula.rb', line 2750

def on_system_blocks_exist?
  self.class.on_system_blocks_exist? || @on_system_blocks_exist
end

#opt_binPathname

Same as #bin, but relative to #opt_prefix instead of #prefix.

Returns:



1289
1290
1291
# File 'formula.rb', line 1289

def opt_bin
  opt_prefix/"bin"
end

#opt_elispPathname

Same as #elisp, but relative to #opt_prefix instead of #prefix.

Returns:



1345
1346
1347
# File 'formula.rb', line 1345

def opt_elisp
  opt_prefix/"share/emacs/site-lisp"/name
end

#opt_frameworksPathname

Same as #frameworks, but relative to #opt_prefix instead of #prefix.

Returns:



1353
1354
1355
# File 'formula.rb', line 1353

def opt_frameworks
  opt_prefix/"Frameworks"
end

#opt_includePathname

Same as #include, but relative to #opt_prefix instead of #prefix.

Returns:



1297
1298
1299
# File 'formula.rb', line 1297

def opt_include
  opt_prefix/"include"
end

#opt_libPathname

Same as #lib, but relative to #opt_prefix instead of #prefix.

Returns:



1305
1306
1307
# File 'formula.rb', line 1305

def opt_lib
  opt_prefix/"lib"
end

#opt_libexecPathname

Same as #libexec, but relative to #opt_prefix instead of #prefix.

Returns:



1313
1314
1315
# File 'formula.rb', line 1313

def opt_libexec
  opt_prefix/"libexec"
end

#opt_pkgsharePathname

Same as #pkgshare, but relative to #opt_prefix instead of #prefix.

Returns:



1337
1338
1339
# File 'formula.rb', line 1337

def opt_pkgshare
  opt_prefix/"share"/name
end

#opt_prefixPathname

A stable path for this formula, when installed. Contains the formula name but no version number. Only the active version will be linked here if multiple versions are installed.

This is the preferred way to refer to a formula in plists or from another formula, as the path is stable even when the software is updated.

Example

args << "--with-readline=#{Formula["readline"].opt_prefix}" if build.with? "readline"

Returns:



1281
1282
1283
# File 'formula.rb', line 1281

def opt_prefix
  HOMEBREW_PREFIX/"opt"/name
end

#opt_sbinPathname

Same as #sbin, but relative to #opt_prefix instead of #prefix.

Returns:



1321
1322
1323
# File 'formula.rb', line 1321

def opt_sbin
  opt_prefix/"sbin"
end

#opt_sharePathname

Same as #share, but relative to #opt_prefix instead of #prefix.

Returns:



1329
1330
1331
# File 'formula.rb', line 1329

def opt_share
  opt_prefix/"share"
end

#option_defined?Boolean

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.

If a named option is defined for the currently active SoftwareSpec.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)


624
# File 'formula.rb', line 624

delegate option_defined?: :active_spec

#options(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


99
# File 'sorbet/rbi/parlour.rbi', line 99

def options(*args, **options, &block); end

#optlinked?Boolean

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.

Is the formula linked to opt?

Returns:

  • (Boolean)


721
722
723
# File 'formula.rb', line 721

def optlinked?
  opt_prefix.symlink?
end

#outdated?(fetch_head: false) ⇒ Boolean

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Check whether the installed formula is outdated.

Parameters:

  • fetch_head (Boolean) (defaults to: false)

Returns:

  • (Boolean)


1724
1725
1726
1727
1728
# File 'formula.rb', line 1724

def outdated?(fetch_head: false)
  !outdated_kegs(fetch_head:).empty?
rescue Migrator::MigrationNeededError
  true
end

#outdated_kegs(fetch_head: false) ⇒ 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.



1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
# File 'formula.rb', line 1638

def outdated_kegs(fetch_head: false)
  raise Migrator::MigrationNeededError.new(oldnames_to_migrate.first, name) if migration_needed?

  cache_key = "#{full_name}-#{fetch_head}"
  Formula.cache[:outdated_kegs] ||= {}
  Formula.cache[:outdated_kegs][cache_key] ||= begin
    all_kegs = []
    current_version = T.let(false, T::Boolean)

    installed_kegs.each do |keg|
      all_kegs << keg
      version = keg.version
      next if version.head?

      next if version_scheme > keg.version_scheme && pkg_version != version
      next if version_scheme == keg.version_scheme && pkg_version > version

      # don't consider this keg current if there's a newer formula available
      next if follow_installed_alias? && new_formula_available?

      # this keg is the current version of the formula, so it's not outdated
      current_version = true
      break
    end

    if current_version ||
       ((head_version = latest_head_version) && !head_version_outdated?(head_version, fetch_head:))
      []
    else
      all_kegs += old_installed_formulae.flat_map(&:installed_kegs)
      all_kegs.sort_by(&:scheme_and_version)
    end
  end
end

#patchObject

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.



1560
1561
1562
1563
1564
1565
# File 'formula.rb', line 1560

def patch
  return if patchlist.empty?

  ohai "Patching"
  patchlist.each(&:apply)
end

#pin(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


147
# File 'sorbet/rbi/parlour.rbi', line 147

def pin(*args, **options, &block); end

#pinnable?(*args, **options, &block) ⇒ Boolean

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)


138
# File 'sorbet/rbi/parlour.rbi', line 138

def pinnable?(*args, **options, &block); end

#pinned?(*args, **options, &block) ⇒ Boolean

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)


141
# File 'sorbet/rbi/parlour.rbi', line 141

def pinned?(*args, **options, &block); end

#pinned_version(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


144
# File 'sorbet/rbi/parlour.rbi', line 144

def pinned_version(*args, **options, &block); end

#pkg_versionPkgVersion

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.

The PkgVersion for this formula with version and #revision information.

Returns:



500
501
502
# File 'formula.rb', line 500

def pkg_version
  PkgVersion.new(version, revision)
end

#pkgetcPathname

A subdirectory of etc with the formula name suffixed. e.g. $HOMEBREW_PREFIX/etc/openssl@1.1 Anything using pkgetc.install will not overwrite other files on e.g. upgrades but will write a new file named *.default.

Returns:



1092
1093
1094
# File 'formula.rb', line 1092

def pkgetc
  (HOMEBREW_PREFIX/"etc"/name).extend(InstallRenamed)
end

#pkgsharePathname

The directory where the formula's shared files should be installed, with the name of the formula appended to avoid linking conflicts. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Example

No make install available?

pkgshare.install "examples"

Returns:



1030
1031
1032
# File 'formula.rb', line 1030

def pkgshare
  prefix/"share"/name
end

#plistObject

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.

Deprecated.

Use Homebrew::Service instead.

This method can be overridden to provide a plist.

Example

def plist; <<~EOS
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
  <dict>
    <key>Label</key>
      <string>#{plist_name}</string>
    <key>ProgramArguments</key>
    <array>
      <string>#{opt_bin}/example</string>
      <string>--do-this</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/dev/null</string>
    <key>StandardOutPath</key>
    <string>/dev/null</string>
  </dict>
  </plist>
  EOS
end

See Also:



1226
1227
1228
1229
# File 'formula.rb', line 1226

def plist
  odeprecated "`Formula#plist`", "`Homebrew::Service`"
  nil
end

#plist_nameString

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.

The generated launchd #plist service name.

Returns:



1233
1234
1235
# File 'formula.rb', line 1233

def plist_name
  service.plist_name
end

#possible_namesObject

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.



1759
1760
1761
# File 'formula.rb', line 1759

def possible_names
  [name, *oldnames, *aliases].compact
end

#post_installvoid

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.

Can be overridden to run commands on both source and bottle installation.



1372
# File 'formula.rb', line 1372

def post_install; end

#post_install_defined?Boolean

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:

  • (Boolean)


1375
1376
1377
# File 'formula.rb', line 1375

def post_install_defined?
  method(:post_install).owner != Formula
end

#pour_bottle?Boolean

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.

Indicates that this formula supports bottles. (Not necessarily that one should be used in the current installation run.) Can be overridden to selectively disable bottles from formulae. Defaults to true so overridden version does not have to check if bottles are supported. Replaced by pour_bottle?'s satisfy method if it is specified.

Returns:

  • (Boolean)


1364
1365
1366
# File 'formula.rb', line 1364

def pour_bottle?
  true
end

#pour_bottle_check_unsatisfied_reason(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


114
# File 'sorbet/rbi/parlour.rbi', line 114

def pour_bottle_check_unsatisfied_reason(*args, **options, &block); end

#prefix(version = pkg_version) ⇒ 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.

The directory in the cellar that the formula is installed to. This directory points to #opt_prefix if it exists and if #prefix is not called from within the same formula's #install or #post_install methods. Otherwise, return the full path to the formula's versioned cellar.



701
702
703
704
705
706
707
708
709
# File 'formula.rb', line 701

def prefix(version = pkg_version)
  versioned_prefix = versioned_prefix(version)
  if !@prefix_returns_versioned_prefix && version == pkg_version &&
     versioned_prefix.directory? && Keg.new(versioned_prefix).optlinked?
    opt_prefix
  else
    versioned_prefix
  end
end

#prefix_linked?(version = pkg_version) ⇒ Boolean

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.

If a formula's linked keg points to the prefix.

Returns:

  • (Boolean)


726
727
728
729
730
# File 'formula.rb', line 726

def prefix_linked?(version = pkg_version)
  return false unless linked?

  linked_keg.resolved_path == versioned_prefix(version)
end

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.



2225
2226
2227
2228
2229
2230
# File 'formula.rb', line 2225

def print_tap_action(options = {})
  return unless tap?

  verb = options[:verb] || "Installing"
  ohai "#{verb} #{name} from #{tap}"
end

#rackPathname

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.

The parent of the prefix; the named directory in the cellar containing all installed versions of this software.

Returns:



743
744
745
# File 'formula.rb', line 743

def rack
  HOMEBREW_CELLAR/name
end

#recursive_dependencies(&block) ⇒ Object

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns a list of Dependency objects in an installable order, which means if a depends on b then b will be ordered before a in this list



2247
2248
2249
2250
# File 'formula.rb', line 2247

def recursive_dependencies(&block)
  cache_key = "Formula#recursive_dependencies" unless block
  Dependency.expand(self, cache_key:, &block)
end

#recursive_requirements(&block) ⇒ Object

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

The full set of Requirements for this formula's dependency tree.



2255
2256
2257
2258
# File 'formula.rb', line 2255

def recursive_requirements(&block)
  cache_key = "Formula#recursive_requirements" unless block
  Requirement.expand(self, cache_key:, &block)
end

#require_universal_deps?Boolean

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:

  • (Boolean)


1556
1557
1558
# File 'formula.rb', line 1556

def require_universal_deps?
  false
end

#requirements(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


90
# File 'sorbet/rbi/parlour.rbi', line 90

def requirements(*args, **options, &block); end

#resource(name, klass = Resource, &block) ⇒ Resource?

TODO:

This should not actually take a block. All resources should be defined at the top-level using resource instead (see https://github.com/Homebrew/brew/issues/17203#issuecomment-2093654431).

A named Resource for the currently active SoftwareSpec. Additional downloads can be defined as #resources. Resource#stage will create a temporary directory and yield to a block.

Example

resource("additional_files").stage { bin.install "my/extra/tool" }

Parameters:

Returns:



566
# File 'formula.rb', line 566

def resource(name, klass = Resource, &block) = active_spec.resource(name, klass, &block)

#resourcesObject

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.

The Resources for the currently active SoftwareSpec.



591
# File 'formula.rb', line 591

def_delegator :"active_spec.resources", :values, :resources

#rpath(source: bin, target: lib) ⇒ String

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.

Executable/Library RPATH according to platform conventions.

Optionally specify a source or target depending on the location of the file containing the RPATH command and where its target is located.

Example

rpath #=> "@loader_path/../lib"
rpath(target: frameworks) #=> "@loader_path/../Frameworks"
rpath(source: libexec/"bin") #=> "@loader_path/../../lib"

Parameters:

Returns:



1901
1902
1903
1904
1905
1906
1907
# File 'formula.rb', line 1901

def rpath(source: bin, target: lib)
  unless target.to_s.start_with?(HOMEBREW_PREFIX)
    raise "rpath `target` should only be used for paths inside HOMEBREW_PREFIX!"
  end

  "#{loader_path}/#{target.relative_path_from(source)}"
end

#ruby_source_checksumChecksum?

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:



2362
2363
2364
# File 'formula.rb', line 2362

def ruby_source_checksum
  Checksum.new(Digest::SHA256.file(path).hexdigest) if path.exist?
end

#ruby_source_pathString?

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:



2357
2358
2359
# File 'formula.rb', line 2357

def ruby_source_path
  path.relative_path_from(T.must(tap).path).to_s if tap && path.exist?
end

#run_post_installvoid

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.



1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
# File 'formula.rb', line 1390

def run_post_install
  @prefix_returns_versioned_prefix = true
  build = self.build

  begin
    self.build = Tab.for_formula(self)

    new_env = {
      TMPDIR:        HOMEBREW_TEMP,
      TEMP:          HOMEBREW_TEMP,
      TMP:           HOMEBREW_TEMP,
      _JAVA_OPTIONS: "-Djava.io.tmpdir=#{HOMEBREW_TEMP}",
      HOMEBREW_PATH: nil,
      PATH:          PATH.new(ORIGINAL_PATHS),
    }

    with_env(new_env) do
      ENV.clear_sensitive_environment!
      ENV.activate_extensions!

      with_logging("post_install") do
        post_install
      end
    end
  ensure
    self.build = build
    @prefix_returns_versioned_prefix = false
  end
end

#run_test(keep_tmp: false) ⇒ 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.



2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
# File 'formula.rb', line 2762

def run_test(keep_tmp: false)
  @prefix_returns_versioned_prefix = true

  test_env = {
    TMPDIR:        HOMEBREW_TEMP,
    TEMP:          HOMEBREW_TEMP,
    TMP:           HOMEBREW_TEMP,
    TERM:          "dumb",
    PATH:          PATH.new(ENV.fetch("PATH"), HOMEBREW_PREFIX/"bin"),
    HOMEBREW_PATH: nil,
  }.merge(common_stage_test_env)
  test_env[:_JAVA_OPTIONS] += " -Djava.io.tmpdir=#{HOMEBREW_TEMP}"

  ENV.clear_sensitive_environment!
  Utils::Git.set_name_email!

  mktemp("#{name}-test") do |staging|
    staging.retain! if keep_tmp
    @testpath = staging.tmpdir
    test_env[:HOME] = @testpath
    setup_home @testpath
    begin
      with_logging("test") do
        with_env(test_env) do
          test
        end
      end
    rescue Exception # rubocop:disable Lint/RescueException
      staging.retain! if debug?
      raise
    end
  end
ensure
  @prefix_returns_versioned_prefix = false
  @testpath = nil
end

#runtime_dependencies(read_from_tab: true, undeclared: true) ⇒ Object

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns a list of Dependency objects that are required at runtime.



2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
# File 'formula.rb', line 2291

def runtime_dependencies(read_from_tab: true, undeclared: true)
  deps = if read_from_tab && undeclared &&
            (tab_deps = any_installed_keg&.runtime_dependencies)
    tab_deps.filter_map do |d|
      full_name = d["full_name"]
      next unless full_name

      Dependency.new full_name
    end
  end
  begin
    deps ||= declared_runtime_dependencies unless undeclared
    deps ||= (declared_runtime_dependencies | undeclared_runtime_dependencies)
  rescue FormulaUnavailableError
    onoe "Could not get runtime dependencies from #{path}!"
    deps ||= []
  end
  deps
end

#runtime_formula_dependencies(read_from_tab: true, undeclared: true) ⇒ 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 a list of Formula objects that are required at runtime.



2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
# File 'formula.rb', line 2312

def runtime_formula_dependencies(read_from_tab: true, undeclared: true)
  cache_key = "#{full_name}-#{read_from_tab}-#{undeclared}"

  Formula.cache[:runtime_formula_dependencies] ||= {}
  Formula.cache[:runtime_formula_dependencies][cache_key] ||= runtime_dependencies(
    read_from_tab:,
    undeclared:,
  ).filter_map do |d|
    d.to_formula
  rescue FormulaUnavailableError
    nil
  end
end

#runtime_installed_formula_dependentsObject

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.



2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
# File 'formula.rb', line 2326

def runtime_installed_formula_dependents
  # `any_installed_keg` and `runtime_dependencies` `select`s ensure
  # that we don't end up with something `Formula#runtime_dependencies` can't
  # read from a `Tab`.
  Formula.cache[:runtime_installed_formula_dependents] ||= {}
  Formula.cache[:runtime_installed_formula_dependents][full_name] ||= Formula.installed
                                                                             .select(&:any_installed_keg)
                                                                             .select(&:runtime_dependencies)
                                                                             .select do |f|
    f.runtime_formula_dependencies.any? do |dep|
      full_name == dep.full_name
    rescue
      name == dep.name
    end
  end
end

#sbinPathname

The directory where the formula's sbin binaries should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only. Generally we try to migrate these to #bin instead.

Returns:



975
976
977
# File 'formula.rb', line 975

def sbin
  prefix/"sbin"
end

#serialized_requirementsObject

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.



2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
# File 'formula.rb', line 2638

def serialized_requirements
  requirements = self.class.spec_syms.to_h do |sym|
    [sym, send(sym)&.requirements]
  end

  merge_spec_dependables(requirements).map do |data|
    req = data[:dependable]
    req_name = req.name.dup
    req_name.prepend("maximum_") if req.respond_to?(:comparator) && req.comparator == "<="
    req_version = if req.respond_to?(:version)
      req.version
    elsif req.respond_to?(:arch)
      req.arch
    end
    {
      "name"     => req_name,
      "cask"     => req.cask,
      "download" => req.download,
      "version"  => req_version,
      "contexts" => req.tags,
      "specs"    => data[:specs],
    }
  end
end

#serviceObject

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.

The service specification of the software.



1262
1263
1264
# File 'formula.rb', line 1262

def service
  @service ||= Homebrew::Service.new(self, &self.class.service)
end

#service?Boolean

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.

Is a service specification defined for the software?

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (Boolean)

See Also:



458
# File 'formula.rb', line 458

delegate service?: :"self.class"

#service_nameString

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.

The generated service name.

Returns:



1239
1240
1241
# File 'formula.rb', line 1239

def service_name
  service.service_name
end

#sharePathname

The directory where the formula's shared files should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only.

Examples

Need a custom directory?

(share/"concept").mkpath

Installing something into another custom directory?

(share/"concept2").install "ducks.txt"

Install ./example_code/simple/ones to share/demos:

(share/"demos").install "example_code/simple/ones"

Install ./example_code/simple/ones to share/demos/examples:

(share/"demos").install "example_code/simple/ones" => "examples"

Returns:



1011
1012
1013
# File 'formula.rb', line 1011

def share
  prefix/"share"
end

#shared_library(name, version = nil) ⇒ String

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.

Shared library names according to platform conventions.

Optionally specify a version to restrict the shared library to a specific version. The special string "*" matches any version.

If name is specified as "*", match any shared library of any version.

Example

shared_library("foo")      #=> foo.dylib
shared_library("foo", 1)   #=> foo.1.dylib
shared_library("foo", "*") #=> foo.2.dylib, foo.1.dylib, foo.dylib
shared_library("*")        #=> foo.dylib, bar.dylib

Parameters:

  • name (String)
  • version (String, Integer, nil) (defaults to: nil)

Returns:



12
13
14
15
16
17
18
19
# File 'extend/os/linux/formula.rb', line 12

def shared_library(name, version = nil)
  suffix = if version == "*" || (name == "*" && version.blank?)
    "{,.*}"
  elsif version.present?
    ".#{version}"
  end
  "#{name}.so#{suffix}"
end

#skip_clean?(path) ⇒ Boolean

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.

Parameters:

Returns:

  • (Boolean)

See Also:



1466
1467
1468
1469
1470
1471
# File 'formula.rb', line 1466

def skip_clean?(path)
  return true if path.extname == ".la" && self.class.skip_clean_paths.include?(:la)

  to_check = path.relative_path_from(prefix).to_s
  self.class.skip_clean_paths.include? to_check
end

#skip_cxxstdlib_check?Boolean

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:

  • (Boolean)


1551
1552
1553
# File 'formula.rb', line 1551

def skip_cxxstdlib_check?
  false
end

#specified_nameObject

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.

The name specified to find this formula.



372
373
374
# File 'formula.rb', line 372

def specified_name
  alias_name || name
end

#specified_pathObject

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.

The path that was specified to find this formula.



361
362
363
364
365
366
367
368
369
# File 'formula.rb', line 361

def specified_path
  return alias_path if alias_path&.exist?

  return @unresolved_path if @unresolved_path.exist?

  return local_bottle_path if local_bottle_path.presence&.exist?

  alias_path || @unresolved_path
end

#stable?Boolean

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.

Is the currently active SoftwareSpec a #stable build?

Returns:

  • (Boolean)


393
394
395
# File 'formula.rb', line 393

def stable?
  active_spec == stable
end

#std_cabal_v2_argsArray<String>

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.

Standard parameters for cabal-v2 builds.

Returns:



1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
# File 'formula.rb', line 1831

def std_cabal_v2_args
  env = T.cast(ENV, T.any(Stdenv, Superenv))

  # cabal-install's dependency-resolution backtracking strategy can
  # easily need more than the default 2,000 maximum number of
  # "backjumps," since Hackage is a fast-moving, rolling-release
  # target. The highest known needed value by a formula was 43,478
  # for git-annex, so 100,000 should be enough to avoid most
  # gratuitous backjumps build failures.
  ["--jobs=#{env.make_jobs}", "--max-backjumps=100000", "--install-method=copy", "--installdir=#{bin}"]
end

#std_cargo_args(root: prefix, path: ".") ⇒ Array<String>

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.

Standard parameters for cargo builds.

Parameters:

Returns:



1788
1789
1790
# File 'formula.rb', line 1788

def std_cargo_args(root: prefix, path: ".")
  ["--locked", "--root=#{root}", "--path=#{path}"]
end

#std_cmake_args(install_prefix: prefix, install_libdir: "lib", find_framework: "LAST") ⇒ Array<String> Also known as: generic_std_cmake_args

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.

Standard parameters for CMake builds.

Setting CMAKE_FIND_FRAMEWORK to "LAST" tells CMake to search for our libraries before trying to utilize Frameworks, many of which will be from 3rd party installs.

Parameters:

Returns:



20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'extend/os/mac/formula.rb', line 20

def std_cmake_args(install_prefix: prefix, install_libdir: "lib", find_framework: "LAST")
  args = generic_std_cmake_args(install_prefix:, install_libdir:,
                                find_framework:)

  # Avoid false positives for clock_gettime support on 10.11.
  # CMake cache entries for other weak symbols may be added here as needed.
  args << "-DHAVE_CLOCK_GETTIME:INTERNAL=0" if MacOS.version == "10.11" && MacOS::Xcode.version >= "8.0"

  # Ensure CMake is using the same SDK we are using.
  args << "-DCMAKE_OSX_SYSROOT=#{MacOS.sdk_for_formula(self).path}" if MacOS.sdk_root_needed?

  args
end

#std_configure_args(prefix: self.prefix, libdir: "lib") ⇒ Array<String>

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.

Standard parameters for configure builds.

Parameters:

Returns:



1779
1780
1781
1782
# File 'formula.rb', line 1779

def std_configure_args(prefix: self.prefix, libdir: "lib")
  libdir = Pathname(libdir).expand_path(prefix)
  ["--disable-debug", "--disable-dependency-tracking", "--prefix=#{prefix}", "--libdir=#{libdir}"]
end

#std_go_args(output: bin/name, ldflags: nil) ⇒ Array<String>

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.

Standard parameters for Go builds.

Parameters:

Returns:



1823
1824
1825
1826
1827
# File 'formula.rb', line 1823

def std_go_args(output: bin/name, ldflags: nil)
  args = ["-trimpath", "-o=#{output}"]
  args += ["-ldflags=#{Array(ldflags).join(" ")}"] if ldflags
  args
end

#std_meson_argsArray<String>

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.

Standard parameters for meson builds.

Returns:



1845
1846
1847
# File 'formula.rb', line 1845

def std_meson_args
  ["--prefix=#{prefix}", "--libdir=#{lib}", "--buildtype=release", "--wrap-mode=nofallback"]
end

#std_pip_args(prefix: self.prefix, build_isolation: false) ⇒ Array<String>

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.

Standard parameters for pip builds.

Parameters:

  • prefix (String, Pathname, false) (defaults to: self.prefix)
  • build_isolation (Boolean) (defaults to: false)

Returns:



1854
1855
1856
1857
1858
1859
# File 'formula.rb', line 1854

def std_pip_args(prefix: self.prefix, build_isolation: false)
  args = ["--verbose", "--no-deps", "--no-binary=:all:", "--ignore-installed", "--no-compile"]
  args << "--prefix=#{prefix}" if prefix
  args << "--no-build-isolation" unless build_isolation
  args
end

#supersedes_an_installed_formula?Boolean

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.

Is this formula the target of an alias used to install an old formula?

Returns:

  • (Boolean)


1694
1695
1696
# File 'formula.rb', line 1694

def supersedes_an_installed_formula?
  old_installed_formulae.any?
end

#synced_with_other_formulae?Boolean

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.

Whether this Formula is version-synced with other formulae.

Returns:

  • (Boolean)


541
542
543
544
545
# File 'formula.rb', line 541

def synced_with_other_formulae?
  return false if @tap.nil?

  @tap.synced_versions_formulae.any? { |synced_formulae| synced_formulae.include?(name) }
end

#system(cmd, *args) ⇒ 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.

To call out to the system, we use the system method and we prefer you give the args separately as in the line below, otherwise a subshell has to be opened first.

Examples

system "./bootstrap.sh", "--arg1", "--prefix=#{prefix}"

For CMake and other build systems we have some necessary defaults in e.g. #std_cmake_args:

system "cmake", ".", *std_cmake_args

If the arguments given to configure (or make or cmake) are depending on options defined above, we usually make a list first and then use the args << if <condition> to append each:

args = ["--with-option1", "--with-option2"]
args << "--without-gcc" if ENV.compiler == :clang

Most software still uses configure and make. Check with ./configure --help for what our options are.

system "./configure", "--disable-debug", "--disable-dependency-tracking",
                      "--disable-silent-rules", "--prefix=#{prefix}",
                      *args # our custom arg list (needs `*` to unpack)

If there is a "make install" available, please use it!

system "make", "install"

Parameters:



2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
# File 'formula.rb', line 2944

def system(cmd, *args)
  verbose_using_dots = Homebrew::EnvConfig.verbose_using_dots?

  # remove "boring" arguments so that the important ones are more likely to
  # be shown considering that we trim long ohai lines to the terminal width
  pretty_args = args.dup
  unless verbose?
    case cmd
    when "./configure"
      pretty_args -= std_configure_args
    when "cabal"
      pretty_args -= std_cabal_v2_args
    when "cargo"
      pretty_args -= std_cargo_args
    when "cmake"
      pretty_args -= std_cmake_args
    when "go"
      pretty_args -= std_go_args
    when "meson"
      pretty_args -= std_meson_args
    when %r{(^|/)(pip|python)(?:[23](?:\.\d{1,2})?)?$}
      pretty_args -= std_pip_args
    end
  end
  pretty_args.each_index do |i|
    pretty_args[i] = "import setuptools..." if pretty_args[i].to_s.start_with? "import setuptools"
  end
  ohai "#{cmd} #{pretty_args * " "}".strip

  @exec_count ||= 0
  @exec_count += 1
  logfn = format("#{logs}/#{active_log_prefix}%02<exec_count>d.%<cmd_base>s",
                 exec_count: @exec_count,
                 cmd_base:   File.basename(cmd).split.first)
  logs.mkpath

  File.open(logfn, "w") do |log|
    log.puts Time.now, "", cmd, args, ""
    log.flush

    if verbose?
      rd, wr = IO.pipe
      begin
        pid = fork do
          rd.close
          log.close
          exec_cmd(cmd, args, wr, logfn)
        end
        wr.close

        if verbose_using_dots
          last_dot = Time.at(0)
          while (buf = rd.gets)
            log.puts buf
            # make sure dots printed with interval of at least 1 min.
            next if (Time.now - last_dot) <= 60

            print "."
            $stdout.flush
            last_dot = Time.now
          end
          puts
        else
          while (buf = rd.gets)
            log.puts buf
            puts buf
          end
        end
      ensure
        rd.close
      end
    else
      pid = fork do
        exec_cmd(cmd, args, log, logfn)
      end
    end

    Process.wait(T.must(pid))

    $stdout.flush

    unless $CHILD_STATUS.success?
      log_lines = Homebrew::EnvConfig.fail_log_lines

      log.flush
      if !verbose? || verbose_using_dots
        puts "Last #{log_lines} lines from #{logfn}:"
        Kernel.system "/usr/bin/tail", "-n", log_lines.to_s, logfn
      end
      log.puts

      require "system_config"
      require "build_environment"

      env = ENV.to_hash

      SystemConfig.dump_verbose_config(log)
      log.puts
      BuildEnvironment.dump env, log

      raise BuildError.new(self, cmd, args, env)
    end
  end
end

#systemd_service_pathPathname

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.

The generated systemd service file path.

Returns:



1251
1252
1253
# File 'formula.rb', line 1251

def systemd_service_path
  opt_prefix/"#{service_name}.service"
end

#systemd_timer_pathPathname

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.

The generated systemd timer file path.

Returns:



1257
1258
1259
# File 'formula.rb', line 1257

def systemd_timer_path
  opt_prefix/"#{service_name}.timer"
end

#tap?Boolean

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.

True if this formula is provided by external Tap

Returns:

  • (Boolean)


2212
2213
2214
2215
2216
# File 'formula.rb', line 2212

def tap?
  return false unless tap

  !T.must(tap).core_tap?
end

#tap_git_headObject

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.



2232
2233
2234
# File 'formula.rb', line 2232

def tap_git_head
  tap&.git_head
end

#testObject

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.



2804
# File 'formula.rb', line 2804

def test; end

#test_defined?Boolean

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:

  • (Boolean)


2800
2801
2802
# File 'formula.rb', line 2800

def test_defined?
  false
end

#test_fixtures(file) ⇒ 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.



2806
2807
2808
# File 'formula.rb', line 2806

def test_fixtures(file)
  HOMEBREW_LIBRARY_PATH/"test/support/fixtures"/file
end

#timeTime

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.

Creates a new Time object for use in the formula as the build time.

Returns:

See Also:



1918
1919
1920
1921
1922
1923
1924
# File 'formula.rb', line 1918

def time
  if ENV["SOURCE_DATE_EPOCH"].present?
    Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc
  else
    Time.now.utc
  end
end

#to_hashObject

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.



2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
# File 'formula.rb', line 2381

def to_hash
  hsh = {
    "name"                     => name,
    "full_name"                => full_name,
    "tap"                      => tap&.name,
    "oldnames"                 => oldnames,
    "aliases"                  => aliases.sort,
    "versioned_formulae"       => versioned_formulae.map(&:name),
    "desc"                     => desc,
    "license"                  => SPDX.license_expression_to_string(license),
    "homepage"                 => homepage,
    "versions"                 => {
      "stable" => stable&.version&.to_s,
      "head"   => head&.version&.to_s,
      "bottle" => bottle_defined?,
    },
    "urls"                     => urls_hash,
    "revision"                 => revision,
    "version_scheme"           => version_scheme,
    "bottle"                   => {},
    "pour_bottle_only_if"      => self.class.pour_bottle_only_if&.to_s,
    "keg_only"                 => keg_only?,
    "keg_only_reason"          => keg_only_reason&.to_hash,
    "options"                  => [],
    "build_dependencies"       => [],
    "dependencies"             => [],
    "test_dependencies"        => [],
    "recommended_dependencies" => [],
    "optional_dependencies"    => [],
    "uses_from_macos"          => [],
    "uses_from_macos_bounds"   => [],
    "requirements"             => serialized_requirements,
    "conflicts_with"           => conflicts.map(&:name),
    "conflicts_with_reasons"   => conflicts.map(&:reason),
    "link_overwrite"           => self.class.link_overwrite_paths.to_a,
    "caveats"                  => caveats_with_placeholders,
    "installed"                => T.let([], T::Array[T::Hash[String, T.untyped]]),
    "linked_keg"               => linked_version&.to_s,
    "pinned"                   => pinned?,
    "outdated"                 => outdated?,
    "deprecated"               => deprecated?,
    "deprecation_date"         => deprecation_date,
    "deprecation_reason"       => deprecation_reason,
    "disabled"                 => disabled?,
    "disable_date"             => disable_date,
    "disable_reason"           => disable_reason,
    "post_install_defined"     => post_install_defined?,
    "service"                  => (service.to_hash if service?),
    "tap_git_head"             => tap_git_head,
    "ruby_source_path"         => ruby_source_path,
    "ruby_source_checksum"     => {},
  }

  hsh["bottle"]["stable"] = bottle_hash if stable && bottle_defined?

  hsh["options"] = options.map do |opt|
    { "option" => opt.flag, "description" => opt.description }
  end

  hsh.merge!(dependencies_hash)

  hsh["installed"] = installed_kegs.sort_by(&:scheme_and_version).map do |keg|
    tab = keg.tab
    {
      "version"                 => keg.version.to_s,
      "used_options"            => tab.used_options.as_flags,
      "built_as_bottle"         => tab.built_as_bottle,
      "poured_from_bottle"      => tab.poured_from_bottle,
      "time"                    => tab.time,
      "runtime_dependencies"    => tab.runtime_dependencies,
      "installed_as_dependency" => tab.installed_as_dependency,
      "installed_on_request"    => tab.installed_on_request,
    }
  end

  if (source_checksum = ruby_source_checksum)
    hsh["ruby_source_checksum"] = {
      "sha256" => source_checksum.hexdigest,
    }
  end

  hsh
end

#to_hash_with_variations(hash_method: :to_hash) ⇒ 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.



2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
# File 'formula.rb', line 2527

def to_hash_with_variations(hash_method: :to_hash)
  if loaded_from_api? && hash_method == :to_internal_api_hash
    raise ArgumentError, "API Hash must be generated from Ruby source files"
  end

  namespace_prefix = case hash_method
  when :to_hash
    "Variations"
  when :to_internal_api_hash
    "APIVariations"
  else
    raise ArgumentError, "Unknown hash method #{hash_method.inspect}"
  end

  hash = public_send(hash_method)

  # Take from API, merging in local install status.
  if loaded_from_api? && !Homebrew::EnvConfig.no_install_from_api?
    json_formula = Homebrew::API::Formula.all_formulae.fetch(name).dup
    return json_formula.merge(
      hash.slice("name", "installed", "linked_keg", "pinned", "outdated"),
    )
  end

  variations = {}

  if path.exist? && on_system_blocks_exist?
    formula_contents = path.read
    OnSystem::ALL_OS_ARCH_COMBINATIONS.each do |os, arch|
      bottle_tag = Utils::Bottles::Tag.new(system: os, arch:)
      next unless bottle_tag.valid_combination?

      Homebrew::SimulateSystem.with(os:, arch:) do
        variations_namespace = Formulary.class_s("#{namespace_prefix}#{bottle_tag.to_sym.capitalize}")
        variations_formula_class = Formulary.load_formula(name, path, formula_contents, variations_namespace,
                                                          flags: self.class.build_flags, ignore_errors: true)
        variations_formula = variations_formula_class.new(name, path, :stable,
                                                          alias_path:, force_bottle:)

        variations_formula.public_send(hash_method).each do |key, value|
          next if value.to_s == hash[key].to_s

          variations[bottle_tag.to_sym] ||= {}
          variations[bottle_tag.to_sym][key] = value
        end
      end
    end
  end

  hash["variations"] = variations if hash_method != :to_internal_api_hash || variations.present?
  hash
end

#to_internal_api_hashObject

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.



2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
# File 'formula.rb', line 2465

def to_internal_api_hash
  api_hash = {
    "desc"                 => desc,
    "license"              => SPDX.license_expression_to_string(license),
    "homepage"             => homepage,
    "urls"                 => urls_hash.transform_values(&:compact),
    "post_install_defined" => post_install_defined?,
    "ruby_source_path"     => ruby_source_path,
    "ruby_source_sha256"   => ruby_source_checksum&.hexdigest,
  }

  # Exclude default values.
  api_hash["revision"] = revision unless revision.zero?
  api_hash["version_scheme"] = version_scheme unless version_scheme.zero?

  # Optional values.
  api_hash["keg_only_reason"] = keg_only_reason.to_hash if keg_only_reason
  api_hash["pour_bottle_only_if"] = self.class.pour_bottle_only_if.to_s if self.class.pour_bottle_only_if
  api_hash["link_overwrite"] = self.class.link_overwrite_paths.to_a if self.class.link_overwrite_paths.present?
  api_hash["caveats"] = caveats_with_placeholders if caveats
  api_hash["service"] = service.to_hash if service?

  if stable
    api_hash["version"] = stable&.version&.to_s
    api_hash["bottle"] = bottle_hash(compact_for_api: true) if bottle_defined?
  end

  if (versioned_formulae_list = versioned_formulae.presence)
    # Could we just use `versioned_formulae_names` here instead?
    api_hash["versioned_formulae"] = versioned_formulae_list.map(&:name)
  end

  if (dependencies = internal_dependencies_hash(:stable).presence)
    api_hash["dependencies"] = dependencies
  end

  if (head_dependencies = internal_dependencies_hash(:head).presence)
    api_hash["head_dependencies"] = head_dependencies
  end

  if (requirements_array = serialized_requirements.presence)
    api_hash["requirements"] = requirements_array
  end

  if conflicts.present?
    api_hash["conflicts_with"] = conflicts.map(&:name)
    api_hash["conflicts_with_reasons"] = conflicts.map(&:reason)
  end

  if deprecation_date
    api_hash["deprecation_date"] = deprecation_date
    api_hash["deprecation_reason"] = deprecation_reason
  end

  if disable_date
    api_hash["disable_date"] = disable_date
    api_hash["disable_reason"] = disable_reason
  end

  api_hash
end

#unlockObject

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.



1617
1618
1619
1620
# File 'formula.rb', line 1617

def unlock
  @lock&.unlock
  @oldname_locks.each(&:unlock)
end

#unpin(*args, **options, &block) ⇒ T.untyped

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.

Parameters:

  • args (T.untyped)
  • options (T.untyped)
  • block (T.untyped)

Returns:

  • (T.untyped)


150
# File 'sorbet/rbi/parlour.rbi', line 150

def unpin(*args, **options, &block); end

#update_head_versionvoid

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.



480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
# File 'formula.rb', line 480

def update_head_version
  return unless head?

  head_spec = T.must(head)
  return unless head_spec.downloader.is_a?(VCSDownloadStrategy)
  return unless head_spec.downloader.cached_location.exist?

  path = if ENV["HOMEBREW_ENV"]
    ENV.fetch("PATH")
  else
    PATH.new(ORIGINAL_PATHS)
  end

  with_env(PATH: path) do
    head_spec.version.update_commit(head_spec.downloader.last_commit<