Class: Formula Private

Inherits:
Object show all
Extended by:
APIHashable, BuildEnvironment::DSL, Cachable, Forwardable, OnSystem::MacOSAndLinux, T::Generic, T::Helpers, Utils::Output::Mixin
Includes:
Context, FileUtils, Homebrew::Livecheck::Constants, OS::Linux::Formula, OS::Mac::Formula, OnSystem::MacOSAndLinux, Utils::Output::Mixin, Utils::Shebang, Utils::Shell
Defined in:
formula.rb,
sorbet/rbi/dsl/formula.rbi,
sorbet/rbi/shims/rspec.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.

Some helper blocks are inferred as Formula instances or class contexts.

Direct Known Subclasses

PortableFormula

Defined Under Namespace

Classes: FormulaConflict

Constant Summary collapse

Cache =

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

type_template { { fixed: T::Hash[Symbol, T.untyped] } }

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, on_arch_conditional, on_macos, on_system_conditional

Methods included from BuildEnvironment::DSL

inherited

Methods included from Cachable

cache

Methods included from APIHashable

deep_remove_placeholders, generated_hash!, generating_hash!, generating_hash?

Methods included from Utils::Output::Mixin

issue_reporting_message, odebug, odeprecated, odie, odisabled, ofail, oh1, oh1_title, ohai, ohai_title, onoe, opoo, opoo_outside_github_actions, opoo_without_github_actions_annotation, pretty_deprecated, pretty_disabled, pretty_duration, pretty_install_status, pretty_installed, pretty_outdated, pretty_uninstalled, pretty_upgradable

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, shell_with_prompt

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)


265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
# File 'formula.rb', line 265

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 = T.let(path.resolved_path, Pathname)
  @alias_path = alias_path
  @alias_name = T.let((File.basename(alias_path) if alias_path), T.nilable(String))
  @revision = T.let(self.class.revision || 0, Integer)
  @version_scheme = T.let(self.class.version_scheme || 0, Integer)
  @compatibility_version = T.let(self.class.compatibility_version, T.nilable(Integer))
  @head = T.let(nil, T.nilable(SoftwareSpec))
  @stable = T.let(nil, T.nilable(SoftwareSpec))

  @autobump = T.let(true, T::Boolean)
  @no_autobump_message = T.let(nil, T.nilable(T.any(String, Symbol)))

  @force_bottle = force_bottle

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

  @pypi_packages_info = T.let(self.class.pypi_packages_info || PypiPackages.new, PypiPackages)

  @full_name = T.let(T.must(full_name_with_optional_tap(name)), String)
  @full_alias_name = T.let(full_name_with_optional_tap(@alias_name), T.nilable(String))

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

  @active_spec = T.let(determine_active_spec(spec), SoftwareSpec)
  @active_spec_sym = T.let(head? ? :head : :stable, Symbol)
  validate_attributes!
  @build = T.let(active_spec.build, T.any(BuildOptions, Tab))
  @pin = T.let(FormulaPin.new(self), FormulaPin)
  @follow_installed_alias = T.let(true, T::Boolean)
  @prefix_returns_versioned_prefix = T.let(false, T.nilable(T::Boolean))
  @oldname_locks = T.let([], T::Array[FormulaLock])
  @on_system_blocks_exist = T.let(false, T::Boolean)
  @fully_loaded_formula = T.let(nil, T.nilable(Formula))
end

Class Attribute Details

.api_sourceHash{String => T.untyped}? (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.

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

Returns:



3844
3845
3846
# File 'formula.rb', line 3844

def api_source
  @api_source
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:



4078
4079
4080
# File 'formula.rb', line 4078

def conflicts
  @conflicts
end

.deprecate_argsHash{Symbol => String, Symbol, nil}? (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 arguments that were passed to deprecate!.

Returns:

See Also:



5048
5049
5050
# File 'formula.rb', line 5048

def deprecate_args
  @deprecate_args
end

.deprecation_dateDate? (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 of deprecation of a Formula.

Returns:

  • (Date, nil)

    if no date is specified.

See Also:



5019
5020
5021
# File 'formula.rb', line 5019

def deprecation_date
  @deprecation_date
end

.deprecation_reasonString, ... (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:

  • (String, Symbol, nil)

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

See Also:



5026
5027
5028
# File 'formula.rb', line 5026

def deprecation_reason
  @deprecation_reason
end

.deprecation_replacement_caskString? (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 replacement cask for a deprecated Formula.

Returns:

  • (String, nil)

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

See Also:



5040
5041
5042
# File 'formula.rb', line 5040

def deprecation_replacement_cask
  @deprecation_replacement_cask
end

.deprecation_replacement_formulaString? (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 replacement formula for a deprecated Formula.

Returns:

  • (String, nil)

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

See Also:



5033
5034
5035
# File 'formula.rb', line 5033

def deprecation_replacement_formula
  @deprecation_replacement_formula
end

.disable_argsHash{Symbol => String, Symbol, nil}? (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 arguments that were passed to disable!.

Returns:

See Also:



5162
5163
5164
# File 'formula.rb', line 5162

def disable_args
  @disable_args
end

.disable_dateDate? (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, nil)

See Also:



5133
5134
5135
# File 'formula.rb', line 5133

def disable_date
  @disable_date
end

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



5140
5141
5142
# File 'formula.rb', line 5140

def disable_reason
  @disable_reason
end

.disable_replacement_caskString? (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 replacement cask for a disabled Formula. Returns nil if no reason was provided or the formula is not disabled.

Returns:

See Also:



5154
5155
5156
# File 'formula.rb', line 5154

def disable_replacement_cask
  @disable_replacement_cask
end

.disable_replacement_formulaString? (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 replacement formula for a disabled Formula. Returns nil if no reason was provided or the formula is not disabled.

Returns:

See Also:



5147
5148
5149
# File 'formula.rb', line 5147

def disable_replacement_formula
  @disable_replacement_formula
end

.keg_only_reasonKegOnlyReason? (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.

Returns:



3853
3854
3855
# File 'formula.rb', line 3853

def keg_only_reason
  @keg_only_reason
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.

Returns:



4084
4085
4086
# File 'formula.rb', line 4084

def link_overwrite_paths
  @link_overwrite_paths
end

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

Message that explains why the formula was excluded from the autobump list. Returns nil if no message is specified.

Returns:

See Also:



4848
4849
4850
# File 'formula.rb', line 4848

def no_autobump_message
  @no_autobump_message
end

.pour_bottle_check_unsatisfied_reasonString?

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.

Returns:



4092
4093
4094
# File 'formula.rb', line 4092

def pour_bottle_check_unsatisfied_reason
  @pour_bottle_check_unsatisfied_reason
end

.pour_bottle_only_ifSymbol? (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:



4087
4088
4089
# File 'formula.rb', line 4087

def pour_bottle_only_if
  @pour_bottle_only_if
end

.pypi_packages_infoPypiPackages? (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:



3856
3857
3858
# File 'formula.rb', line 3856

def pypi_packages_info
  @pypi_packages_info
end

.skip_clean_pathsSet<String, 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.

Returns:



4081
4082
4083
# File 'formula.rb', line 4081

def skip_clean_paths
  @skip_clean_paths
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:



235
236
237
# File 'formula.rb', line 235

def active_log_type
  @active_log_type
end

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

Raises:



319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
# File 'formula.rb', line 319

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


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

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:



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

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:



120
121
122
# File 'formula.rb', line 120

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 is the result of state that we're trying to eliminate.

Returns:



242
243
244
# File 'formula.rb', line 242

def build
  @build
end

#buildpathPathname? (readonly)

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

Returns:



218
219
220
# File 'formula.rb', line 218

def buildpath
  @buildpath
end

#compatibility_versionInteger? (readonly)

Used to indicate API/ABI compatibility for dependencies.

Returns:

See Also:

  • compatibility_version=


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

def compatibility_version
  @compatibility_version
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)


253
254
255
# File 'formula.rb', line 253

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)


259
260
261
# File 'formula.rb', line 259

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:



139
140
141
# File 'formula.rb', line 139

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:



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

def full_name
  @full_name
end

#headSoftwareSpec? (readonly)

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:



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

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:



230
231
232
# File 'formula.rb', line 230

def local_bottle_path
  @local_bottle_path
end

#nameString (readonly)

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

Returns:



115
116
117
# File 'formula.rb', line 115

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:



146
147
148
# File 'formula.rb', line 146

def path
  @path
end

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

Parameters:

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

Returns:

  • (Boolean)


2061
# File 'formula.rb', line 2061

delegate pinned?: :@pin

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

Information about PyPI mappings for this Formula is stored as PypiPackages object.

Returns:



247
248
249
# File 'formula.rb', line 247

def pypi_packages_info
  @pypi_packages_info
end

#revisionInteger (readonly)

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

Returns:

See Also:

  • revision=


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

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.

The most recent modified time for source files.

Returns:



189
190
191
# File 'formula.rb', line 189

def source_modified_time
  @source_modified_time
end

#stableSoftwareSpec? (readonly)

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:



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

def stable
  @stable
end

#tapTap? (readonly)

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

Returns:



153
154
155
# File 'formula.rb', line 153

def tap
  @tap
end

#testpathPathname? (readonly)

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

Returns:



225
226
227
# File 'formula.rb', line 225

def testpath
  @testpath
end

#version_schemeInteger (readonly)

Used to change version schemes for packages.

Returns:

See Also:

  • version_scheme=


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

def version_scheme
  @version_scheme
end

Class Method Details

.[](name) ⇒ Formula

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:



2662
2663
2664
# File 'formula.rb', line 2662

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

.alias_full_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 aliases as fully-qualified names.

Returns:



2649
2650
2651
# File 'formula.rb', line 2649

def self.alias_full_names
  @alias_full_names ||= T.let(core_aliases + tap_aliases, T.nilable(T::Array[String]))
end

.aliasesArray<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 aliases.

Returns:



2641
2642
2643
2644
2645
# File 'formula.rb', line 2641

def self.aliases
  @aliases ||= T.let((core_aliases + tap_aliases.map do |name|
    Utils.name_from_full_name(name)
  end).uniq.sort, T.nilable(T::Array[String]))
end

.all(eval_all: false) ⇒ Array<Formula>

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 each known Formula. Can only be used when users set HOMEBREW_REQUIRE_TAP_TRUST=1 or HOMEBREW_NO_REQUIRE_TAP_TRUST=1.

Parameters:

  • eval_all (Boolean) (defaults to: false)

Returns:



2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
# File 'formula.rb', line 2566

def self.all(eval_all: false)
  if !eval_all && !Homebrew::EnvConfig.tap_trust_configured?
    raise ArgumentError,
          "Formula#all cannot be used without `HOMEBREW_REQUIRE_TAP_TRUST=1` or " \
          "`HOMEBREW_NO_REQUIRE_TAP_TRUST=1`"
  end

  trusted_tap_files = Homebrew::Trust.trusted_formula_files(tap_files)

  (core_names + trusted_tap_files).filter_map do |name_or_file|
    Formulary.factory(name_or_file)
  rescue FormulaUnavailableError, FormulaUnreadableError, FormulaSpecificationError => 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

.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:



3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
# File 'formula.rb', line 3954

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

.autobump?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 in the autobump list?

Returns:

  • (Boolean)


4839
4840
4841
# File 'formula.rb', line 4839

def autobump?
  @autobump != false # @autobump may be `nil`
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", tahoe:    "ef65c759c5097a36323fa9c77756468649e8d1980a3a4e05695c05e39568967c"
  sha256 cellar: :any,           sequoia:  "28f4090610946a4eb207df102d841de23ced0d06ba31cb79e040d883906dcd4f"
  sha256                         sonoma:   "91dd0caca9bd3f38c439d5a7b6f68440c4274945615fae035ff0a369264b8a2f"
end

Homebrew maintainers aim to bottle all formulae.

Parameters:

See Also:



4260
# File 'formula.rb', line 4260

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

.buildBuildOptions

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:



4263
# File 'formula.rb', line 4263

def build = stable.build

.build_flagsArray<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.

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

Returns:



4267
4268
4269
4270
4271
4272
4273
# File 'formula.rb', line 4267

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

.compatibility_version(val = T.unsafe(nil)) ⇒ Integer?

Used to indicate API/ABI compatibility for dependencies. If a formula has a compatibility_version of 1, then it need not be upgraded when installing or upgrading dependencies as long as dependencies are known to work with versions of the formula that have compatibility_version 1. nil if unset.

Example

compatibility_version 1

Parameters:

  • val (Integer) (defaults to: T.unsafe(nil))

Returns:



4146
4147
4148
# File 'formula.rb', line 4146

def compatibility_version(val = T.unsafe(nil))
  val.nil? ? @compatibility_version : @compatibility_version = T.let(val, T.nilable(Integer))
end

.conflicts_with(*names) ⇒ void

This method returns an undefined value.

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

Example

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

Parameters:

  • names (T.untyped)


4600
4601
4602
4603
# File 'formula.rb', line 4600

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

.core_alias_filesArray<Pathname>

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 Formulae.

Returns:



2623
2624
2625
# File 'formula.rb', line 2623

def self.core_alias_files
  CoreTap.instance.alias_files
end

.core_aliasesArray<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 core aliases.

Returns:



2629
2630
2631
# File 'formula.rb', line 2629

def self.core_aliases
  CoreTap.instance.aliases
end

.core_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 core Formula names.

Returns:



2533
2534
2535
# File 'formula.rb', line 2533

def self.core_names
  CoreTap.instance.formula_names
end

.cxxstdlib_check(check_type) ⇒ void

This method returns an undefined value.

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

Parameters:



4692
4693
4694
4695
# File 'formula.rb', line 4692

def cxxstdlib_check(check_type)
  odisabled "`cxxstdlib_check :skip`"
  define_method(:skip_cxxstdlib_check?) { true } if check_type == :skip
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:



3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
# File 'formula.rb', line 3986

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

.depends_on(dep) ⇒ void

This method returns an undefined value.

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 xcode: :build # If the formula really needs full Xcode to compile.
depends_on macos: :sequoia # Needs at least macOS Sequoia (15) to run.
on_tahoe :or_newer do
  depends_on "sqlite"
end

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

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

Parameters:



4469
4470
4471
4472
# File 'formula.rb', line 4469

def depends_on(dep)
  set_in_block = instance_variable_get(:@called_in_on_system_block) == true
  specs.each { |spec| spec.depends_on(dep, set_in_block:) }
end

.deprecate!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil) ⇒ void

TODO:

replace legacy replacement with replacement_formula or replacement_cask

This method returns an undefined value.

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"
deprecate! date: "2020-08-27", because: "has been replaced by foo", replacement_formula: "foo"
deprecate! date: "2020-08-27", because: "has been replaced by foo", replacement_cask: "foo"

Parameters:

  • date (String)
  • because (String, Symbol, nil)
  • replacement (String, nil) (defaults to: nil)
  • replacement_formula (String, nil) (defaults to: nil)
  • replacement_cask (String, nil) (defaults to: nil)

See Also:



4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
# File 'formula.rb', line 4974

def deprecate!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil)
  if [replacement, replacement_formula, replacement_cask].filter_map(&:presence).length > 1
    raise ArgumentError, "more than one of replacement, replacement_formula and/or replacement_cask specified!"
  end

  if replacement
    odeprecated(
      "deprecate!(:replacement)",
      "deprecate!(:replacement_formula) or deprecate!(:replacement_cask)",
    )
  end

  @deprecate_args = T.let(
    { date:, because:, replacement_formula:, replacement_cask: },
    T.nilable(T::Hash[Symbol, T.nilable(T.any(String, Symbol))]),
  )

  @deprecation_date = T.let(Date.parse(date), T.nilable(Date))
  @deprecated = T.let(T.must(@deprecation_date) <= Date.today, T.nilable(T::Boolean))
  if @deprecated
    @deprecation_reason = T.let(because, T.nilable(T.any(String, Symbol)))
    @deprecation_replacement_formula = T.let(replacement_formula.presence || replacement, T.nilable(String))
    @deprecation_replacement_cask = T.let(replacement_cask.presence || replacement, T.nilable(String))
  else
    # Reset these to handle disable! before deprecate!
    @deprecation_reason = nil
    @deprecation_replacement_formula = nil
    @deprecation_replacement_cask = nil
  end
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:



5010
5011
5012
# File 'formula.rb', line 5010

def deprecated?
  @deprecated == true
end

.deprecated_option(hash) ⇒ void

This method returns an undefined value.

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"

Parameters:



4529
4530
4531
# File 'formula.rb', line 4529

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

.desc(val = T.unsafe(nil)) ⇒ String?

A one-line description of the software. Used by users to get an overview of the software and Homebrew maintainers. Shows when running brew info.

Example

desc "Example formula"

Parameters:

  • val (String) (defaults to: T.unsafe(nil))

Returns:



3870
3871
3872
# File 'formula.rb', line 3870

def desc(val = T.unsafe(nil))
  val.nil? ? @desc : @desc = T.let(val, T.nilable(String))
end

.disable!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil) ⇒ void

TODO:

replace legacy replacement with replacement_formula or replacement_cask

This method returns an undefined value.

Disables a Formula (on the given date) so it cannot be installed. If the date has not yet passed and there is no deprecate! date, then the formula will be deprecated.

Examples

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

Parameters:

  • date (String)
  • because (String, Symbol, nil)
  • replacement (String, nil) (defaults to: nil)
  • replacement_formula (String, nil) (defaults to: nil)
  • replacement_cask (String, nil) (defaults to: nil)

See Also:



5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
# File 'formula.rb', line 5084

def disable!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil)
  if [replacement, replacement_formula, replacement_cask].filter_map(&:presence).length > 1
    raise ArgumentError, "more than one of replacement, replacement_formula and/or replacement_cask specified!"
  end

  if replacement
    odeprecated(
      "disable!(:replacement)",
      "disable!(:replacement_formula) or disable!(:replacement_cask)",
    )
  end

  @disable_args = T.let(
    { date:, because:, replacement_formula:, replacement_cask: },
    T.nilable(T::Hash[Symbol, T.nilable(T.any(String, Symbol))]),
  )

  @disable_date = T.let(Date.parse(date), T.nilable(Date))

  if T.must(@disable_date) > Date.today
    return if @deprecation_date.present?

    @deprecation_reason = T.let(because, T.nilable(T.any(String, Symbol)))
    @deprecation_replacement_formula = T.let(replacement_formula.presence || replacement, T.nilable(String))
    @deprecation_replacement_cask = T.let(replacement_cask.presence || replacement, T.nilable(String))
    @deprecated = T.let(true, T.nilable(T::Boolean))
    return
  end

  @disable_reason = T.let(because, T.nilable(T.any(String, Symbol)))
  @disable_replacement_formula = T.let(replacement_formula.presence || replacement, T.nilable(String))
  @disable_replacement_cask = T.let(replacement_cask.presence || replacement, T.nilable(String))
  @disabled = T.let(true, T.nilable(T::Boolean))
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:



5124
5125
5126
# File 'formula.rb', line 5124

def disabled?
  @disabled == true
end

.fails_with(compiler, &block) ⇒ void

This method returns an undefined value.

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

Parameters:



4729
4730
4731
# File 'formula.rb', line 4729

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

.freezeT.self_type

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:

  • (T.self_type)


3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
# File 'formula.rb', line 3820

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

.full_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 Formula names, which the tap formulae have as the fully-qualified name.

Returns:



2559
2560
2561
# File 'formula.rb', line 2559

def self.full_names
  @full_names ||= T.let(core_names + tap_names, T.nilable(T::Array[String]))
end

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

Returns a list of approximately matching formula names, but not the complete match.

Parameters:

Returns:



2655
2656
2657
2658
2659
# File 'formula.rb', line 2655

def self.fuzzy_search(name)
  @spell_checker ||= T.let(DidYouMean::SpellChecker.new(dictionary: Set.new(names + full_names).to_a),
                           T.nilable(DidYouMean::SpellChecker))
  T.cast(@spell_checker.correct(name), T::Array[String])
end

.head(val = nil, specs = {}, &block) ⇒ T.untyped

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. Git repositories must always specify branch:.

Example

head "https://we.prefer.https.over.git.example.com/.git", branch: "main"
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

Parameters:

  • val (String, nil) (defaults to: nil)
  • specs (Hash{Symbol => T.untyped}) (defaults to: {})
  • block (T.proc.void, nil)

Returns:

  • (T.untyped)


4328
4329
4330
4331
4332
4333
4334
4335
4336
# File 'formula.rb', line 4328

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

.homepage(val = T.unsafe(nil)) ⇒ String?

The homepage for the software. Used by users to get more information about the software and Homebrew maintainers as a point of contact for e.g. submitting patches. Can be opened with running brew home.

Example

homepage "https://www.example.com"

Parameters:

  • val (String) (defaults to: T.unsafe(nil))

Returns:



4055
4056
4057
# File 'formula.rb', line 4055

def homepage(val = T.unsafe(nil))
  val.nil? ? @homepage : @homepage = T.let(val, T.nilable(String))
end

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

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.

Parameters:



3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
# File 'formula.rb', line 3795

def inherited(child)
  super
  child.instance_eval do
    # Ensure this is synced with `freeze`
    @stable = T.let(SoftwareSpec.new(flags: build_flags), T.nilable(SoftwareSpec))
    @head = T.let(HeadSoftwareSpec.new(flags: build_flags), T.nilable(HeadSoftwareSpec))
    @livecheck = T.let(Livecheck.new(self), T.nilable(Livecheck))
    @conflicts = T.let([], T.nilable(T::Array[FormulaConflict]))
    @skip_clean_paths = T.let(Set.new, T.nilable(T::Set[T.any(String, Symbol)]))
    @link_overwrite_paths = T.let(Set.new, T.nilable(T::Set[String]))
    @post_install_steps = T.let([], T.nilable(Homebrew::InstallSteps::Steps))
    @post_install_steps_defined = T.let(false, T.nilable(T::Boolean))
    @loaded_from_api = T.let(false, T.nilable(T::Boolean))
    @loaded_from_internal_api = T.let(false, T.nilable(T::Boolean))
    @api_source = T.let(nil, T.nilable(T::Hash[String, T.untyped]))
    @on_system_blocks_exist = T.let(false, T.nilable(T::Boolean))
    @network_access_allowed = T.let(SUPPORTED_NETWORK_ACCESS_PHASES.to_h do |phase|
      [phase, DEFAULT_NETWORK_ACCESS_ALLOWED]
    end, T.nilable(T::Hash[Symbol, T::Boolean]))
    @preserve_rpath = T.let(false, T.nilable(T::Boolean))
    @pypi_packages_info = T.let(nil, T.nilable(PypiPackages))
  end
end

.installedArray<Formula>

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 Formulae.

Returns:



2606
2607
2608
2609
2610
2611
2612
# File 'formula.rb', line 2606

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:



2600
2601
2602
# File 'formula.rb', line 2600

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

.installed_with_alias_path(alias_path) ⇒ Array<Formula>

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:



2615
2616
2617
2618
2619
# File 'formula.rb', line 2615

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 = "") ⇒ void

This method returns an undefined value.

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"

Parameters:



4684
4685
4686
# File 'formula.rb', line 4684

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

.license(args = nil) ⇒ SPDX::LicenseExpression?

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 formula 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" },
]

Parameters:

Returns:

See Also:



3927
3928
3929
3930
3931
3932
3933
# File 'formula.rb', line 3927

def license(args = nil)
  if args.nil?
    @licenses
  else
    @licenses = T.let(args, T.nilable(SPDX::LicenseExpression))
  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.

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-*"

Parameters:

Returns:



5179
5180
5181
5182
# File 'formula.rb', line 5179

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

.livecheck(&block) ⇒ T.untyped

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

Parameters:

  • block (T.proc.bind(Livecheck).returns(T.untyped), nil)

Returns:

  • (T.untyped)


4808
4809
4810
4811
4812
4813
# File 'formula.rb', line 4808

def livecheck(&block)
  return @livecheck unless block

  @livecheck_defined = T.let(true, T.nilable(T::Boolean))
  @livecheck.instance_eval(&block)
end

.livecheck_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.

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)


4064
4065
4066
# File 'formula.rb', line 4064

def livecheck_defined?
  @livecheck_defined == 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.

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

Returns:

  • (Boolean)


3836
# File 'formula.rb', line 3836

def loaded_from_api? = !!@loaded_from_api

.loaded_from_internal_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 internal formulae.brew.sh API.

Returns:

  • (Boolean)


3840
# File 'formula.rb', line 3840

def loaded_from_internal_api? = !!@loaded_from_internal_api

.mirror(val) ⇒ void

This method returns an undefined value.

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

Parameters:



4217
# File 'formula.rb', line 4217

def mirror(val) = stable.mirror(val)

.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 Formula names.

Returns:



2551
2552
2553
2554
2555
# File 'formula.rb', line 2551

def self.names
  @names ||= T.let((core_names + tap_names.map do |name|
    Utils.name_from_full_name(name)
  end).uniq.sort, T.nilable(T::Array[String]))
end

.needs(*_standards) ⇒ void

This method returns an undefined value.

Used to mark the Formula as needing a certain standard, so Homebrew would fall back to other compilers if the default compiler did not implement that standard.

This is now a no-op as we prefer to depends_on a desired compiler and explicitly use that compiler in a formula's #install block, rather than implicitly finding a suitable compiler with needs.

Parameters:

See Also:



4745
4746
4747
# File 'formula.rb', line 4745

def needs(*_standards)
  odisabled "`needs :openmp`", '`depends_on "gcc"`'
end

.network_access_allowedHash{Symbol => 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:



3832
# File 'formula.rb', line 3832

def network_access_allowed = T.must(@network_access_allowed)

.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)


4001
4002
4003
4004
4005
4006
# File 'formula.rb', line 4001

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

.no_autobump!(because:) ⇒ void

This method returns an undefined value.

Exclude the formula from the autobump list.

Parameters:



4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
# File 'formula.rb', line 4819

def no_autobump!(because:)
  caller_path = caller_locations(1, 1)&.first&.path
  if caller_path
    tap = Tap.from_path(caller_path)
    raise ArgumentError, "no_autobump! can only be used in official Homebrew taps." if tap && !tap.official?
  end

  if because.is_a?(Symbol) && !NO_AUTOBUMP_REASONS_LIST.key?(because)
    raise ArgumentError, "'because' argument should use valid symbol or a string!"
  end

  odeprecated "no_autobump! because: :requires_manual_review" if because == :requires_manual_review

  @no_autobump_defined = T.let(true, T.nilable(T::Boolean))
  @no_autobump_message = T.let(because, T.nilable(T.any(String, Symbol)))
  @autobump = T.let(false, T.nilable(T::Boolean))
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.

Whether this formula contains OS/arch-specific blocks (e.g. on_macos, on_arm, on_monterey :or_older, on_system :linux, macos: :big_sur_or_newer).

Returns:

  • (Boolean)


3849
# File 'formula.rb', line 3849

def on_system_blocks_exist? = !!@on_system_blocks_exist

.option(name, description = "") ⇒ void

This method returns an undefined value.

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.

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'"

Parameters:



4508
4509
4510
4511
4512
4513
4514
4515
# File 'formula.rb', line 4508

def option(name, description = "")
  case name
  when Symbol
    odisabled "`option :#{name}`"
  else
    specs.each { |spec| spec.option(name, description) }
  end
end

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

This method returns an undefined value.

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, "..."

Parameters:

See Also:



4586
4587
4588
# File 'formula.rb', line 4586

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

.post_install_steps(*steps, &block) ⇒ Homebrew::InstallSteps::Steps

Declarative steps to run after bottle installation.

Example

post_install_steps do
  mkdir "log/foo", base: :var
end

Parameters:

  • steps (T.untyped)
  • block (T.proc.void, nil)

Returns:



4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
# File 'formula.rb', line 4023

def post_install_steps(*steps, &block)
  current_steps = @post_install_steps || []
  return current_steps if steps.empty? && block.nil?

  @post_install_steps_defined = T.let(true, T.nilable(T::Boolean))
  current_steps.concat(
    if block
      Homebrew::InstallSteps::DSL.build(
        default_base:        :var,
        default_source_base: :prefix,
        default_target_base: :prefix,
        &block
      )
    else
      Homebrew::InstallSteps::DSL.normalise_steps(steps)
    end,
  )
end

.post_install_steps_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)


4009
# File 'formula.rb', line 4009

def post_install_steps_defined? = @post_install_steps_defined == true

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

This method returns an undefined value.

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

Parameters:

  • only_if (Symbol, nil) (defaults to: nil)
  • block (T.proc.params(arg0: T.untyped).returns(T.any(T::Boolean, Symbol)), nil)


4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
# File 'formula.rb', line 4902

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

  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 Xcode Command Line Tools to be installed at /Library/Developer/CommandLineTools.
          Development tools provided by Xcode.app are not sufficient.

          You can install the Xcode Command Line Tools, 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(&T.unsafe(block))
end

.preserve_rpath(value: true) ⇒ Boolean

Preserve @rpath install names when fixing dynamic linkage on macOS.

By default, Homebrew rewrites library install names (including those starting with @rpath) to use absolute paths. This can break tools like macdeployqt that expect @rpath-based install names to remain unchanged.

Call this method to skip rewriting install names that start with @rpath.

Example

preserve_rpath

Parameters:

  • value (Boolean) (defaults to: true)

Returns:

  • (Boolean)


4647
4648
4649
# File 'formula.rb', line 4647

def preserve_rpath(value: true)
  @preserve_rpath = value
end

.preserve_rpath?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 if @rpath install names should be preserved.

Returns:

  • (Boolean)


4655
4656
4657
# File 'formula.rb', line 4655

def preserve_rpath?
  @preserve_rpath == true
end

.pypi_packages(package_name: nil, extra_packages: nil, exclude_packages: nil, dependencies: 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.

Adds information about PyPI formula mapping as PypiPackages object. It provides a way to specify package name in PyPI repository, define extra packages, or remove them (e.g. if formula installs them as a dependency).

Examples of usage:

# It will use information about the PyPI package `foo` to update resources
pypi_packages package_name: "foo"

Add "extra" packages and remove unneeded ones
depends_on "numpy"

pypi_packages extra_packages: "setuptools", exclude_packages: "numpy"

# Special case: empty `package_name` allows to skip resource updates for non-extra packages
pypi_packages package_name: "", extra_packages: "setuptools"

Parameters:



4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
# File 'formula.rb', line 4363

def pypi_packages(
  package_name: nil,
  extra_packages: nil,
  exclude_packages: nil,
  dependencies: nil
)
  if [package_name, extra_packages, exclude_packages, dependencies].all?(&:nil?)
    raise ArgumentError, "must provide at least one argument"
  end

  # Sadly `v1, v2, v3 = [v1, v2, v3].map { |x| Array(x) }` does not work
  # for typechecker
  extra_packages = Array(extra_packages)
  exclude_packages = Array(exclude_packages)
  dependencies = Array(dependencies)

  @pypi_packages_info = PypiPackages.new(package_name:, extra_packages:, exclude_packages:, dependencies:)
end

.racksArray<Pathname>

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.

Returns:



2588
2589
2590
2591
2592
2593
2594
2595
2596
# File 'formula.rb', line 2588

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:



4397
4398
4399
4400
4401
# File 'formula.rb', line 4397

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

.revision(val = T.unsafe(nil)) ⇒ Integer?

Used for creating new Homebrew versions of software without new upstream versions. For example, if we bump the major version of a library that this Formula depends_on then we may need to update the revision of this Formula to install a new version linked against the new library version. 0 if unset.

Example

revision 1

Parameters:

  • val (Integer) (defaults to: T.unsafe(nil))

Returns:



4108
4109
4110
# File 'formula.rb', line 4108

def revision(val = T.unsafe(nil))
  val.nil? ? @revision : @revision = T.let(val, T.nilable(Integer))
end

.service(&block) ⇒ T.proc.returns(T.untyped)?

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

Parameters:

  • block (T.proc.returns(T.untyped), nil)

Returns:

  • (T.proc.returns(T.untyped), nil)


4865
4866
4867
4868
4869
# File 'formula.rb', line 4865

def service(&block)
  return @service_block unless block

  @service_block = T.let(block, T.nilable(T.proc.returns(T.untyped)))
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)


4073
4074
4075
# File 'formula.rb', line 4073

def service?
  @service_block.present?
end

.sha256(val) ⇒ void

This method returns an undefined value.

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"

Parameters:



4233
# File 'formula.rb', line 4233

def sha256(val) = stable.sha256(val)

.skip_clean(*paths) ⇒ Set<String, Symbol>

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

Parameters:

Returns:



4625
4626
4627
4628
4629
# File 'formula.rb', line 4625

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

.spec_symsArray<Symbol>

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:



4151
# File 'formula.rb', line 4151

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

.specsArray<SoftwareSpec>

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.

Returns:



4155
4156
4157
4158
4159
# File 'formula.rb', line 4155

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

.stable(&block) ⇒ T.untyped

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

Parameters:

  • block (T.proc.void, nil)

Returns:

  • (T.untyped)


4293
4294
4295
4296
4297
# File 'formula.rb', line 4293

def stable(&block)
  return T.must(@stable) unless block

  T.must(@stable).instance_eval(&block)
end

.tap_aliasesArray<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 tap aliases.

Returns:



2635
2636
2637
# File 'formula.rb', line 2635

def self.tap_aliases
  @tap_aliases ||= T.let(Tap.reject(&:core_tap?).flat_map(&:aliases).sort, T.nilable(T::Array[String]))
end

.tap_filesArray<Pathname>

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.

Returns:



2545
2546
2547
# File 'formula.rb', line 2545

def self.tap_files
  @tap_files ||= T.let(Tap.reject(&:core_tap?).flat_map(&:formula_files), T.nilable(T::Array[Pathname]))
end

.tap_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 tap Formula names.

Returns:



2539
2540
2541
# File 'formula.rb', line 2539

def self.tap_names
  @tap_names ||= T.let(Tap.reject(&:core_tap?).flat_map(&:formula_names).sort, T.nilable(T::Array[String]))
end

.test(&block) ⇒ BasicObject

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.

Parameters:

  • block (T.proc.returns(BasicObject))

Returns:

  • (BasicObject)

See Also:



4788
# File 'formula.rb', line 4788

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

.url(val = T.unsafe(nil), specs = {}) ⇒ String

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)
  • :homebrew_curl (use brewed curl)
  • :nounzip (without extracting)
  • :post (download via an HTTP POST request)

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"

Parameters:

  • val (String) (defaults to: T.unsafe(nil))
  • specs (Hash{Symbol => T.anything}) (defaults to: {})

Returns:



4186
# File 'formula.rb', line 4186

def url(val = T.unsafe(nil), specs = {}) = stable.url(val, specs)

.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:



4486
4487
4488
# File 'formula.rb', line 4486

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

.version(val = nil) ⇒ Version?

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"

Parameters:

  • val (String, nil) (defaults to: nil)

Returns:



4200
# File 'formula.rb', line 4200

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

.version_scheme(val = T.unsafe(nil)) ⇒ Integer?

Used for creating new Homebrew version schemes. For example, if we want to change version scheme from one to another, then we may need to update version_scheme of this Formula to be able to use new version scheme, e.g. to move from 20151020 scheme to 1.0.0 we need to increment version_scheme. Without this, the prior scheme will always equate to a higher version. 0 if unset.

Example

version_scheme 1

Parameters:

  • val (Integer) (defaults to: T.unsafe(nil))

Returns:



4128
4129
4130
# File 'formula.rb', line 4128

def version_scheme(val = T.unsafe(nil))
  val.nil? ? @version_scheme : @version_scheme = T.let(val, T.nilable(Integer))
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:



1463
1464
1465
1466
1467
1468
1469
# File 'formula.rb', line 1463

def active_log_prefix
  if active_log_type
    "#{active_log_type}."
  else
    ""
  end
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)


2026
2027
2028
# File 'formula.rb', line 2026

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:



898
899
900
901
902
903
904
905
906
# File 'formula.rb', line 898

def aliases
  @aliases ||= T.let(
    if (tap = self.tap)
      tap.alias_reverse_table.fetch(full_name, []).map { Utils.name_from_full_name(it) }
    else
      []
    end, T.nilable(T::Array[String])
  )
end

#allow_network_access!(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


10
# File 'sorbet/rbi/dsl/formula.rbi', line 10

def allow_network_access!(*args, &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:



2771
2772
2773
2774
2775
2776
# File 'formula.rb', line 2771

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:



2782
2783
2784
2785
2786
2787
2788
# File 'formula.rb', line 2782

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_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.

Returns the PkgVersion for this formula if it is installed. If not, return nil.

Returns:



2793
2794
2795
# File 'formula.rb', line 2793

def any_installed_version
  any_installed_keg&.version
end

#any_version_installed?Boolean

If at least one version of Formula is installed.

Returns:

  • (Boolean)


960
961
962
# File 'formula.rb', line 960

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

#api_sourceT.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 API source data used to load this formula. Returns nil if the formula was not loaded from the API.

Parameters:

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

Returns:

  • (T.untyped)

See Also:



639
# File 'formula.rb', line 639

delegate api_source: :"self.class"

#autobump?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 in the autobump list?

Parameters:

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

Returns:

  • (Boolean)

See Also:



602
# File 'formula.rb', line 602

delegate autobump?: :"self.class"

#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:



1422
# File 'formula.rb', line 1422

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

#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:



1120
# File 'formula.rb', line 1120

def bin = prefix/"bin"

#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:



554
555
556
# File 'formula.rb', line 554

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

#bottle_defined?(*args, &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)
  • block (T.untyped)

Returns:

  • (Boolean)


19
# File 'sorbet/rbi/dsl/formula.rbi', line 19

def bottle_defined?(*args, &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:



560
561
562
# File 'formula.rb', line 560

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

#bottle_hashHash{String => 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.

Returns the bottle information for a formula.

Returns:



3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
# File 'formula.rb', line 3066

def bottle_hash
  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
  hash["root_url"] = bottle_spec.root_url
  hash["files"] = {}

  bottle_spec.collector.each_tag do |tag|
    tag_spec = bottle_spec.collector.specification_for(tag, no_older_versions: true)
    odie "Specification for tag #{tag} is nil" if tag_spec.nil?

    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
    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}"
    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:



1455
# File 'formula.rb', line 1455

def bottle_prefix = prefix/".bottle"

#bottle_specification(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


22
# File 'sorbet/rbi/dsl/formula.rbi', line 22

def bottle_specification(*args, &block); end

#bottle_tab_attributesHash{String => 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.

Returns:



3688
3689
3690
3691
3692
# File 'formula.rb', line 3688

def bottle_tab_attributes
  return {} unless bottled?

  T.must(bottle).tab_attributes
end

#bottle_tag?(*args, &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)
  • block (T.untyped)

Returns:

  • (Boolean)


25
# File 'sorbet/rbi/dsl/formula.rbi', line 25

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

#bottled?(*args, &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)
  • block (T.untyped)

Returns:

  • (Boolean)


28
# File 'sorbet/rbi/dsl/formula.rbi', line 28

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

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

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

Parameters:

  • fetch (Boolean) (defaults to: true)
  • keep_tmp (Boolean) (defaults to: false)
  • debug_symbols (Boolean) (defaults to: false)
  • interactive (Boolean) (defaults to: false)
  • _blk (T.proc.params(arg0: Formula, arg1: Mktemp).void)


1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
# File 'formula.rb', line 1889

def brew(fetch: true, keep_tmp: false, debug_symbols: false, interactive: false, &_blk)
  @prefix_returns_versioned_prefix = T.let(true, T.nilable(T::Boolean))
  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
        CMakeConfigureLog.yaml
        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 = T.let(false, T.nilable(T::Boolean))
end

#cached_download(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


31
# File 'sorbet/rbi/dsl/formula.rbi', line 31

def cached_download(*args, &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 < :monterey
  s
end

Returns:



1709
# File 'formula.rb', line 1709

def caveats = nil

#caveats_with_placeholdersString?

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:



3170
3171
3172
3173
# File 'formula.rb', line 3170

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

#clear_cache(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


34
# File 'sorbet/rbi/dsl/formula.rbi', line 34

def clear_cache(*args, &block); end

#compiler_failures(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


37
# File 'sorbet/rbi/dsl/formula.rbi', line 37

def compiler_failures(*args, &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.

Returns a list of FormulaConflict objects indicating any formulae that conflict with this one and why.

Returns:



2721
# File 'formula.rb', line 2721

def conflicts = T.must(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)


2668
2669
2670
# File 'formula.rb', line 2668

def core_formula?
  !!tap&.core_tap?
end

#current_installed_alias_targetFormula?

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:



2005
2006
2007
# File 'formula.rb', line 2005

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

#declared_deps(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


40
# File 'sorbet/rbi/dsl/formula.rbi', line 40

def declared_deps(*args, &block); end

#deny_network_access!(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


43
# File 'sorbet/rbi/dsl/formula.rbi', line 43

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

#dependencies_hashHash{String => 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.

Returns:



3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
# File 'formula.rb', line 3176

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

#deprecate_argsT.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 arguments that were used to deprecate this Formula. Returns nil if deprecate! was not called.

Parameters:

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

Returns:

  • (T.untyped)


1808
# File 'formula.rb', line 1808

delegate deprecate_args: :"self.class"

#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)
  • block (T.untyped)

Returns:

  • (Boolean)

See Also:



1773
# File 'formula.rb', line 1773

delegate deprecated?: :"self.class"

#deprecated_flags(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


52
# File 'sorbet/rbi/dsl/formula.rbi', line 52

def deprecated_flags(*args, &block); end

#deprecated_options(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


55
# File 'sorbet/rbi/dsl/formula.rbi', line 55

def deprecated_options(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)

    Date

See Also:



1780
# File 'formula.rb', line 1780

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)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



1787
# File 'formula.rb', line 1787

delegate deprecation_reason: :"self.class"

#deprecation_replacement_caskT.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 replacement cask for this deprecated Formula. Returns nil if no replacement is specified or the formula is not deprecated.

Parameters:

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

Returns:

  • (T.untyped)

See Also:



1801
# File 'formula.rb', line 1801

delegate deprecation_replacement_cask: :"self.class"

#deprecation_replacement_formulaT.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 replacement formula for this deprecated Formula. Returns nil if no replacement is specified or the formula is not deprecated.

Parameters:

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

Returns:

  • (T.untyped)

See Also:



1794
# File 'formula.rb', line 1794

delegate deprecation_replacement_formula: :"self.class"

#deps(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


70
# File 'sorbet/rbi/dsl/formula.rbi', line 70

def deps(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



567
# File 'formula.rb', line 567

delegate desc: :"self.class"

#deuniversalize_machos(*targets) ⇒ void

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.

Raises an error if no universal binaries are found to deuniversalize.

Parameters:



2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
# File 'formula.rb', line 2328

def deuniversalize_machos(*targets)
  if targets.none?
    targets = any_installed_keg&.mach_o_files&.select do |file|
      file.arch == :universal && file.archs.include?(Hardware::CPU.arch)
    end
  end

  raise "No universal binaries found to deuniversalize" if targets.blank?

  targets.compact.each do |target|
    target = MachOPathname.wrap(target)
    extract_macho_slice_from(target, Hardware::CPU.arch)
  end
end

#disable_argsT.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 arguments that were used to disable this Formula. Returns nil if disable! was not called.

Parameters:

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

Returns:

  • (T.untyped)


1850
# File 'formula.rb', line 1850

delegate disable_args: :"self.class"

#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)
  • block (T.untyped)

Returns:

  • (T.untyped)

    Date

See Also:



1822
# File 'formula.rb', line 1822

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)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



1829
# File 'formula.rb', line 1829

delegate disable_reason: :"self.class"

#disable_replacement_caskT.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 replacement cask for this disabled Formula. Returns nil if no replacement is specified or the formula is not disabled.

Parameters:

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

Returns:

  • (T.untyped)

See Also:



1843
# File 'formula.rb', line 1843

delegate disable_replacement_cask: :"self.class"

#disable_replacement_formulaT.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 replacement formula for this disabled Formula. Returns nil if no replacement is specified or the formula is not disabled.

Parameters:

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

Returns:

  • (T.untyped)

See Also:



1836
# File 'formula.rb', line 1836

delegate disable_replacement_formula: :"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)
  • block (T.untyped)

Returns:

  • (Boolean)

See Also:



1815
# File 'formula.rb', line 1815

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:



1128
# File 'formula.rb', line 1128

def doc = share/"doc"/name

#downloader(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


94
# File 'sorbet/rbi/dsl/formula.rbi', line 94

def downloader(*args, &block); end

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

Parameters:

  • quiet (Boolean) (defaults to: false)

Returns:



3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
# File 'formula.rb', line 3585

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
        elsif (keepme_refs = keg.keepme_refs.presence)
          opoo "Skipping #{keg} as it is needed by #{keepme_refs.join(", ")}" unless quiet
        else
          eligible_for_cleanup << keg
        end
      end
    end
  elsif !installed_prefixes.empty? && !pinned?
    # If the rack 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:



1350
# File 'formula.rb', line 1350

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

#enqueue_resources_and_patches(download_queue:) ⇒ 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:



3667
3668
3669
3670
3671
3672
3673
# File 'formula.rb', line 3667

def enqueue_resources_and_patches(download_queue:)
  resources.each do |resource|
    download_queue.enqueue(resource)
    resource.patches.select(&:external?).each { |patch| download_queue.enqueue(patch.resource) }
  end
  patchlist.select(&:external?).each { |patch| download_queue.enqueue(patch.resource) }
end

#ensure_installed!(reason: "", latest: false, output_to_stderr: true, quiet: false, executable: nil, version_args: ["--version"]) ⇒ T.self_type, Pathname

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.

Ensure the given formula is installed. This is useful for installing a utility formula (e.g. shellcheck for brew style). When executable is provided, a matching system executable in ORIGINAL_PATHS can satisfy the request without installing the formula. When latest is true, the system executable's version is checked with version_args first. Returns the executable path if executable is provided, otherwise the formula.

Parameters:

  • reason (String) (defaults to: "")
  • latest (Boolean) (defaults to: false)
  • output_to_stderr (Boolean) (defaults to: true)
  • quiet (Boolean) (defaults to: false)
  • executable (String, nil) (defaults to: nil)
  • version_args (Array<String>) (defaults to: ["--version"])

Returns:



363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
# File 'formula.rb', line 363

def ensure_installed!(reason: "", latest: false, output_to_stderr: true, quiet: false, executable: nil,
                      version_args: ["--version"])
  if output_to_stderr || quiet
    file = if quiet
      File::NULL
    else
      $stderr
    end
    # Call this method itself with redirected stdout
    redirect_stdout(file) do
      return ensure_installed!(latest:, reason:, output_to_stderr: false, executable:, version_args:)
    end
  end

  if executable && (system_executable = which(executable, ORIGINAL_PATHS))
    return system_executable unless latest

    require "system_command"
    result = SystemCommand.run(system_executable, args: version_args, print_stderr: false)
    return system_executable if result.success? && result.stdout[/\d+(?:\.\d+)+/] == version.to_s
  end

  reason = " for #{reason}" if reason.present?

  unless any_version_installed?
    ohai "Installing `#{name}`#{reason}..."
    safe_system HOMEBREW_BREW_FILE, "install", "--formula", full_name
  end

  if latest && !latest_version_installed?
    ohai "Upgrading `#{name}`#{reason}..."
    safe_system HOMEBREW_BREW_FILE, "upgrade", "--formula", full_name
  end

  executable ? opt_bin/executable : self
end

#env(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


97
# File 'sorbet/rbi/dsl/formula.rbi', line 97

def env(*args, &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:



1378
# File 'formula.rb', line 1378

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

#fetch_bottle_tab(quiet: 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.

This method returns an undefined value.

Parameters:

  • quiet (Boolean) (defaults to: false)


3681
3682
3683
3684
3685
# File 'formula.rb', line 3681

def fetch_bottle_tab(quiet: false)
  return unless bottled?

  T.must(bottle).fetch_tab(quiet: quiet)
end

#fetch_patchesvoid

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.



3676
3677
3678
# File 'formula.rb', line 3676

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:



1440
# File 'formula.rb', line 1440

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

#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:



1413
# File 'formula.rb', line 1413

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

#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:



1359
# File 'formula.rb', line 1359

def frameworks = prefix/"Frameworks"

#full_formulaeArray<Formula>

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 sibling -full or non--full Formula objects for any Formula.

Returns:



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

def full_formulae
  full_formulae_names.filter_map do |formula_name|
    Formula[formula_name]
  rescue FormulaUnavailableError
    nil
  end.sort_by(&:version).reverse
end

#full_formulae_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.

Returns the sibling -full or non--full formula names for any Formula.

Returns:



734
735
736
737
738
739
740
741
742
# File 'formula.rb', line 734

def full_formulae_names
  sibling_name = if name.end_with?("-full")
    name.delete_suffix("-full")
  else
    "#{name}-full"
  end

  formula_names_for_glob("#{sibling_name}.rb")
end

#full_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:



471
# File 'formula.rb', line 471

def full_installed_alias_name = full_name_with_optional_tap(installed_alias_name)

#full_installed_specified_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 name (including tap) specified to install this formula.

Returns:



521
522
523
# File 'formula.rb', line 521

def full_installed_specified_name
  full_installed_alias_name || full_name
end

#full_specified_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 name (including tap) specified to find this formula.

Returns:



509
510
511
# File 'formula.rb', line 509

def full_specified_name
  full_alias_name || full_name
end

#generate_completions_from_executable(*commands, base_name: nil, shell_parameter_format: nil, shells: Utils::ShellCompletion.default_completion_shells(shell_parameter_format)) ⇒ void

This method returns an undefined value.

Generate shell completions for a formula for bash, zsh, fish, and optionally pwsh 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")

If your executable can generate completions for PowerShell, you must pass ":pwsh" explicitly along with any other supported shells. This will pass "powershell" as the completion argument.

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

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

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 :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 :clap.

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

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

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 predefined shell_parameter_format :cobra.

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

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

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 :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 :typer.

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

# translates to
(zsh_completion/"_foo").write Utils.safe_popen_read(
  { "SHELL" => "zsh", "_TYPER_COMPLETE_TEST_DISABLE_SHELL_DETECTION" => "1" },
  bin/"foo", "--show-completion", "zsh"
)

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, nil) (defaults to: nil)

    the base name of the generated completion script. Defaults to the name of the executable if installed within formula's bin or sbin. Otherwise falls back to the formula name.

  • 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 [:arg, :clap, :click, :cobra, :flag, :none, :typer]. Defaults to plainly passing the shell.

  • shells (Array<Symbol>) (defaults to: Utils::ShellCompletion.default_completion_shells(shell_parameter_format))

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



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
2526
2527
2528
2529
# File 'formula.rb', line 2500

def generate_completions_from_executable(*commands,
                                         base_name: nil,
                                         shell_parameter_format: nil,
                                         shells: Utils::ShellCompletion.default_completion_shells(shell_parameter_format))
  executable = commands.first.to_s
  base_name ||= File.basename(executable) if executable.start_with?(bin.to_s, sbin.to_s)
  base_name ||= name

  completion_script_path_map = {
    bash: bash_completion/base_name,
    zsh:  zsh_completion/"_#{base_name}",
    fish: fish_completion/"#{base_name}.fish",
    pwsh: pwsh_completion/"_#{base_name}.ps1",
  }

  shells.each do |shell|
    popen_read_env = { "SHELL" => shell.to_s }
    script_path = completion_script_path_map[shell]

    shell_parameter = Utils::ShellCompletion.completion_shell_parameter(
      shell_parameter_format,
      shell,
      executable,
      popen_read_env,
    )

    script_path.dirname.mkpath
    script_path.write Utils::ShellCompletion.generate_completion_output(commands, shell_parameter, popen_read_env)
  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)


533
534
535
# File 'formula.rb', line 533

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)


539
540
541
# File 'formula.rb', line 539

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.

Parameters:

  • version (PkgVersion)
  • fetch_head (Boolean) (defaults to: false)

Returns:

  • (Boolean)


996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
# File 'formula.rb', line 996

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

  return true if tab.version_scheme < version_scheme

  tab_stable_version = tab.stable_version
  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)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



577
# File 'formula.rb', line 577

delegate homepage: :"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.

Parameters:

Returns:

  • (Boolean)


831
832
833
834
835
836
837
838
839
840
841
842
843
844
# File 'formula.rb', line 831

def implied_link_overwrite?(keg_name, overwrite_formulae)
  return false if overwrite_formulae.empty?
  return false if keg_name.nil?

  case keg_name
  when :missing
    # File doesn't belong to any keg, so implied overwrites do not apply.
    false
  else
    overwrite_formulae.any? do |formula|
      formula.possible_names.include?(keg_name)
    end
  end
end

#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:



1144
# File 'formula.rb', line 1144

def include = prefix/"include"

#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:



1152
# File 'formula.rb', line 1152

def info = share/"info"

#inreplace(paths, before = nil, after = nil, audit_result: true, global: 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:



3381
3382
3383
3384
3385
3386
# File 'formula.rb', line 3381

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

#installvoid

This method returns an undefined value.

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


3344
# File 'formula.rb', line 3344

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.



1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
# File 'formula.rb', line 1619

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)
    # Bottle installs and test-bot cleanup both restore `.bottle` files
    # through `InstallRenamed`, matching formula-level `etc.install` handling.
    path.extend(InstallRenamed)
    path.cp_path_sub(bottle_prefix, HOMEBREW_PREFIX)
    path
  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:



468
# File 'formula.rb', line 468

def installed_alias_name = installed_alias_path&.basename&.to_s

#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:



455
456
457
458
459
460
461
462
463
464
465
# File 'formula.rb', line 455

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)


2012
2013
2014
2015
2016
2017
# File 'formula.rb', line 2012

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:



1096
1097
1098
# File 'formula.rb', line 1096

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

#installed_prefixesArray<Pathname>

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.

Returns:



1087
1088
1089
1090
1091
1092
# File 'formula.rb', line 1087

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

#installed_runtime_formula_dependencies(read_from_tab: true, undeclared: true) ⇒ Array<Formula>

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 installed Formula objects that are required at runtime.

Parameters:

  • read_from_tab (Boolean) (defaults to: true)
  • undeclared (Boolean) (defaults to: true)

Returns:



2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
# File 'formula.rb', line 2844

def installed_runtime_formula_dependencies(read_from_tab: true, undeclared: true)
  cache_key = "#{full_name}-#{read_from_tab}-#{undeclared}"

  Formula.cache[:installed_runtime_formula_dependencies] ||= {}
  Formula.cache[:installed_runtime_formula_dependencies][cache_key] ||= runtime_dependencies(
    read_from_tab:,
    undeclared:,
  ).filter_map do |d|
    d.to_installed_formula
  rescue FormulaUnavailableError
    nil
  end
end

#installed_specified_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 name specified to install this formula.

Returns:



515
516
517
# File 'formula.rb', line 515

def installed_specified_name
  installed_alias_name || name
end

#internal_dependencies_hash(spec_symbol) ⇒ Hash{String => 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:

Returns:

Raises:

  • (ArgumentError)


3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
# File 'formula.rb', line 3241

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:



1717
1718
1719
1720
1721
# File 'formula.rb', line 1717

def keg_only?
  return false unless keg_only_reason

  keg_only_reason.applicable?
end

#keg_only_reason(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


103
# File 'sorbet/rbi/dsl/formula.rbi', line 103

def keg_only_reason(*args, &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:



1368
# File 'formula.rb', line 1368

def kext_prefix = prefix/"Library/Extensions"

#latest_formulaFormula

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 the latest version of the current formula.

Returns:



2033
2034
2035
# File 'formula.rb', line 2033

def latest_formula
  installed_alias_target_changed? ? T.must(current_installed_alias_target) : self
end

#latest_head_pkg_version(fetch_head: false) ⇒ PkgVersion

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:

  • fetch_head (Boolean) (defaults to: false)

Returns:



1014
1015
1016
1017
1018
1019
1020
1021
1022
# File 'formula.rb', line 1014

def latest_head_pkg_version(fetch_head: false)
  return pkg_version unless (latest_version = latest_head_version)
  return latest_version unless head_version_outdated?(latest_version, fetch_head:)

  downloader = T.must(head).downloader
  with_context quiet: true do
    PkgVersion.new(Version.new("HEAD-#{downloader.last_commit}"), revision)
  end
end

#latest_head_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.

Returns:



990
991
992
993
# File 'formula.rb', line 990

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

#latest_head_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.

Returns:



978
979
980
981
982
983
984
985
986
987
# File 'formula.rb', line 978

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_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 latest prefix for this formula. Checks for #head and then #stable's #prefix.

Returns:



1026
1027
1028
1029
1030
1031
1032
1033
1034
# File 'formula.rb', line 1026

def latest_installed_prefix
  if head && (head_version = latest_head_version) && !head_version_outdated?(head_version)
    T.must(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)


952
953
954
# File 'formula.rb', line 952

def latest_version_installed?
  (dir = latest_installed_prefix).directory? && !dir.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:



1496
# File 'formula.rb', line 1496

def launchd_service_path = (any_installed_prefix || opt_prefix)/"#{plist_name}.plist"

#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:



1168
# File 'formula.rb', line 1168

def lib = prefix/"lib"

#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:



1185
# File 'formula.rb', line 1185

def libexec = prefix/"libexec"

#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)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



572
# File 'formula.rb', line 572

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.

Explicit link_overwrite paths may also be implied for related formula families.

Parameters:

Returns:

  • (Boolean)

See Also:



1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
# File 'formula.rb', line 1737

def link_overwrite?(path)
  # Don't overwrite files that belong to another keg except when that
  # keg's formula is deleted.
  case keg_name = link_overwrite_keg_name(path)
  when String
    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
      # Ensure `keg_name` maps cleanly to the resolved formula via `possible_names`.
      return false unless f.possible_names.include?(keg_name)
    end
  when :missing
    # File doesn't belong to any keg, so defer to overwrite checks below.
  else
    return false
  end

  to_check = path.relative_path_from(HOMEBREW_PREFIX).to_s
  return true if T.must(self.class.link_overwrite_paths).any? do |p|
    p.to_s == to_check ||
    to_check.start_with?("#{p.to_s.chomp("/")}/") ||
    /^#{Regexp.escape(p.to_s).gsub('\*', ".*?")}$/.match?(to_check)
  end

  implied_link_overwrite?(keg_name, link_overwrite_formulae)
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.

Returns sibling Formulae whose prefix links should be replaced when this Formula is linked.

Returns:



805
806
807
808
809
810
811
# File 'formula.rb', line 805

def link_overwrite_formulae
  link_overwrite_formulae_names.filter_map do |formula_name|
    Formula[formula_name]
  rescue FormulaUnavailableError
    nil
  end.uniq(&:full_name)
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.

Returns sibling Formula names whose prefix links should be replaced when this Formula is linked.

Returns:



777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
# File 'formula.rb', line 777

def link_overwrite_formulae_names
  formula_names = T.let(Set.new, T::Set[String])
  pending_formula_names = T.let([name], T::Array[String])

  pending_formula_names.each do |current_name|
    current_formula = begin
      if current_name == name
        self
      else
        Formula[current_name]
      end
    rescue FormulaUnavailableError
      next
    end

    current_formula.link_overwrite_related_formula_names.each do |related_formula_name|
      next if related_formula_name == name
      next unless formula_names.add?(related_formula_name)

      pending_formula_names << related_formula_name
    end
  end

  formula_names.to_a.sort
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.

Parameters:

Returns:



814
815
816
817
818
819
820
821
822
823
824
825
826
# File 'formula.rb', line 814

def link_overwrite_keg_name(path)
  # Don't overwrite files not created by Homebrew.
  return if path.stat.uid != HOMEBREW_ORIGINAL_BREW_FILE.stat.uid

  keg = Keg.for(path)
  # This keg doesn't belong to any current core/tap formula, most likely coming from a DIY install.
  return if keg.tab.tap.nil?

  keg.name
rescue NotAKegError, Errno::ENOENT
  # File doesn't belong to any keg.
  :missing
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.

Returns:



755
756
757
758
759
760
761
762
763
764
765
766
767
768
# File 'formula.rb', line 755

def link_overwrite_reason
  installed_overwrite_formulae = link_overwrite_formulae.select(&:any_version_installed?)
  return if installed_overwrite_formulae.empty?

  reason_formulae = installed_overwrite_formulae.select(&:linked?)
  status = if reason_formulae.empty?
    reason_formulae = installed_overwrite_formulae
    "installed"
  else
    "linked"
  end

  "#{reason_formulae.map(&:full_name).to_sentence} #{reason_formulae.one? ? "is" : "are"} already #{status}"
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.

Returns:



771
772
773
# File 'formula.rb', line 771

def link_overwrite_related_formula_names
  [*versioned_formulae_names, *full_formulae_names, unversioned_formula_name].compact
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)


1058
# File 'formula.rb', line 1058

def linked? = linked_keg.exist?

#linked_kegPathname

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.

Returns:



969
970
971
972
973
974
975
# File 'formula.rb', line 969

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:



1074
1075
1076
1077
1078
# File 'formula.rb', line 1074

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)
  • block (T.untyped)

Returns:

  • (T.untyped)

See Also:



582
# File 'formula.rb', line 582

delegate livecheck: :"self.class"

#livecheck_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.

Is a livecheck specification defined for the software?

Parameters:

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

Returns:

  • (Boolean)

See Also:



587
# File 'formula.rb', line 587

delegate livecheck_defined?: :"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.

This is a legacy alias for #livecheck_defined?.

Parameters:

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

Returns:

  • (Boolean)

See Also:



592
# File 'formula.rb', line 592

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)
  • block (T.untyped)

Returns:

  • (Boolean)

See Also:



628
# File 'formula.rb', line 628

delegate loaded_from_api?: :"self.class"

#loaded_from_internal_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 internal formulae.brew.sh API.

Parameters:

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

Returns:

  • (Boolean)

See Also:



633
# File 'formula.rb', line 633

delegate loaded_from_internal_api?: :"self.class"

#loader_pathString

Linker variable for the directory containing the program or shared object.

Returns:



2305
# File 'formula.rb', line 2305

def loader_path = "@loader_path"

#lockArray<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:



1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
# File 'formula.rb', line 1923

def lock
  @lock = T.let(FormulaLock.new(name), T.nilable(FormulaLock))
  T.must(@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:



1459
# File 'formula.rb', line 1459

def logs = HOMEBREW_LOGS + name

#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:



1195
# File 'formula.rb', line 1195

def man = share/"man"

#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:



1211
# File 'formula.rb', line 1211

def man1 = man/"man1"

#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:



1219
# File 'formula.rb', line 1219

def man2 = man/"man2"

#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:



1235
# File 'formula.rb', line 1235

def man3 = man/"man3"

#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:



1243
# File 'formula.rb', line 1243

def man4 = man/"man4"

#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:



1251
# File 'formula.rb', line 1251

def man5 = man/"man5"

#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:



1259
# File 'formula.rb', line 1259

def man6 = man/"man6"

#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:



1267
# File 'formula.rb', line 1267

def man7 = man/"man7"

#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:



1275
# File 'formula.rb', line 1275

def man8 = man/"man8"

#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)


1955
1956
1957
# File 'formula.rb', line 1955

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

#missing_dependencies(hide: []) ⇒ Array<Dependency>

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. Only trusts tab data for dependency information; when the tab has no runtime dependency data (nil or empty), returns empty rather than falling back to formula definitions. This prevents stale or missing tab data from incorrectly blocking uninstalls.

Parameters:

Returns:



2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
# File 'formula.rb', line 2883

def missing_dependencies(hide: [])
  tab_deps = any_installed_keg&.runtime_dependencies
  return [] if tab_deps.blank?

  tab_deps.filter_map do |d|
    full_name = d["full_name"]
    next if full_name.blank?

    # Use base name to check the cellar directly, avoiding Formulary.resolve.
    # A dep is "missing" if it's in the hide list (pretend uninstalled) or
    # genuinely not installed in the cellar.
    base_name = Utils.name_from_full_name(full_name)
    next if hide.exclude?(base_name) && (HOMEBREW_CELLAR/base_name).directory?

    Dependency.new(full_name)
  end
end

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

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

Parameters:

Returns:

  • (T.untyped)


3647
3648
3649
3650
3651
3652
# File 'formula.rb', line 3647

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

  FileUtils.chdir(name, &block)
end

#mktemp(prefix = name, retain: false, retain_in_cache: false, &block) ⇒ T.type_parameter(:U)

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.

Parameters:

  • prefix (String) (defaults to: name)
  • retain (Boolean) (defaults to: false)
  • retain_in_cache (Boolean) (defaults to: false)
  • block (T.proc.params(arg0: Mktemp).returns(T.type_parameter(:U)))

Returns:

  • (T.type_parameter(:U))


3640
3641
3642
# File 'formula.rb', line 3640

def mktemp(prefix = name, retain: false, retain_in_cache: false, &block)
  Mktemp.new(prefix, retain:, retain_in_cache:).run(&block)
end

#network_access_allowed?(*args, &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)
  • block (T.untyped)

Returns:

  • (Boolean)


124
# File 'sorbet/rbi/dsl/formula.rbi', line 124

def network_access_allowed?(*args, &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)


2000
2001
2002
# File 'formula.rb', line 2000

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

#no_autobump!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.

Exclude the formula from the autobump list.

Parameters:

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

Returns:

  • (T.untyped)

See Also:



597
# File 'formula.rb', line 597

delegate no_autobump!: :"self.class"

#no_autobump_message(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


130
# File 'sorbet/rbi/dsl/formula.rbi', line 130

def no_autobump_message(*args, &block); end

#old_installed_formulaeArray<Formula>

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:



2038
2039
2040
2041
2042
2043
2044
2045
# File 'formula.rb', line 2038

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:



884
885
886
887
888
889
890
891
892
# File 'formula.rb', line 884

def oldnames
  @oldnames ||= T.let(
    if (tap = self.tap)
      Tap.tap_migration_oldnames(tap, name) + tap.formula_reverse_renames.fetch(name, [])
    else
      []
    end, T.nilable(T::Array[String])
  )
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:



1944
1945
1946
1947
1948
1949
1950
1951
1952
# File 'formula.rb', line 1944

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, nil)


3260
3261
3262
# File 'formula.rb', line 3260

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:



1535
# File 'formula.rb', line 1535

def opt_bin = opt_prefix/"bin"

#opt_elispPathname

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

Returns:



1577
# File 'formula.rb', line 1577

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

#opt_frameworksPathname

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

Returns:



1583
# File 'formula.rb', line 1583

def opt_frameworks = opt_prefix/"Frameworks"

#opt_includePathname

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

Returns:



1541
# File 'formula.rb', line 1541

def opt_include = opt_prefix/"include"

#opt_libPathname

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

Returns:



1547
# File 'formula.rb', line 1547

def opt_lib = opt_prefix/"lib"

#opt_libexecPathname

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

Returns:



1553
# File 'formula.rb', line 1553

def opt_libexec = opt_prefix/"libexec"

#opt_pkgsharePathname

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

Returns:



1571
# File 'formula.rb', line 1571

def opt_pkgshare = opt_prefix/"share"/name

#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:



1529
# File 'formula.rb', line 1529

def opt_prefix = HOMEBREW_PREFIX/"opt"/name

#opt_sbinPathname

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

Returns:



1559
# File 'formula.rb', line 1559

def opt_sbin = opt_prefix/"sbin"

#opt_sharePathname

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

Returns:



1565
# File 'formula.rb', line 1565

def opt_share = opt_prefix/"share"

#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)
  • block (T.untyped)

Returns:

  • (Boolean)


943
# File 'formula.rb', line 943

delegate option_defined?: :active_spec

#options(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


136
# File 'sorbet/rbi/dsl/formula.rbi', line 136

def options(*args, &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)


1062
# File 'formula.rb', line 1062

def optlinked? = opt_prefix.symlink?

#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)


2051
2052
2053
2054
2055
# File 'formula.rb', line 2051

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

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

Parameters:

  • fetch_head (Boolean) (defaults to: false)

Returns:

Raises:



1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
# File 'formula.rb', line 1960

def outdated_kegs(fetch_head: false)
  raise Migrator::MigrationNeededError.new(oldnames_to_migrate.fetch(0), 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)
    latest = latest_formula

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

      next if latest.version_scheme > keg.version_scheme && latest.pkg_version != version
      next if latest.version_scheme == keg.version_scheme && latest.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, but only consider it current
      # if it's actually linked - an unlinked current version means we're outdated
      next if !keg.optlinked? && !keg.linked? && !pinned?

      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

#patchvoid

This method returns an undefined value.

Applies all patches in the #patchlist to the source tree.



1862
1863
1864
1865
1866
1867
# File 'formula.rb', line 1862

def patch
  return if patchlist.empty?

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

#patchlist(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


139
# File 'sorbet/rbi/dsl/formula.rbi', line 139

def patchlist(*args, &block); end

#pin(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


142
# File 'sorbet/rbi/dsl/formula.rbi', line 142

def pin(*args, &block); end

#pinnable?(*args, &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)
  • block (T.untyped)

Returns:

  • (Boolean)


145
# File 'sorbet/rbi/dsl/formula.rbi', line 145

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

#pinned_version(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


151
# File 'sorbet/rbi/dsl/formula.rbi', line 151

def pinned_version(*args, &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:



667
# File 'formula.rb', line 667

def pkg_version = PkgVersion.new(version, revision)

#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:



1387
# File 'formula.rb', line 1387

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

#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:



1335
# File 'formula.rb', line 1335

def pkgshare = prefix/"share"/name

#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:



1488
# File 'formula.rb', line 1488

def plist_name = service.plist_name

#possible_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.

Returns:



2082
2083
2084
# File 'formula.rb', line 2082

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.



1598
# File 'formula.rb', line 1598

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)


1601
1602
1603
# File 'formula.rb', line 1601

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

#post_install_stepsT.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 post-install steps.

Parameters:

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

Returns:

  • (T.untyped)

See Also:



644
# File 'formula.rb', line 644

delegate post_install_steps: :"self.class"

#post_install_steps_conflict?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)


1609
1610
1611
# File 'formula.rb', line 1609

def post_install_steps_conflict?
  post_install_steps_defined? && post_install_defined?
end

#post_install_steps_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)


1606
# File 'formula.rb', line 1606

def post_install_steps_defined? = self.class.post_install_steps_defined?

#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)


1592
# File 'formula.rb', line 1592

def pour_bottle? = true

#pour_bottle_check_unsatisfied_reason(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


157
# File 'sorbet/rbi/dsl/formula.rbi', line 157

def pour_bottle_check_unsatisfied_reason(*args, &block); end

#prefix(version = pkg_version) ⇒ Pathname

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 keg (versioned Cellar path).

Parameters:

Returns:



1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
# File 'formula.rb', line 1043

def prefix(version = pkg_version)
  versioned_prefix = versioned_prefix(version)
  version = PkgVersion.parse(version) if version.is_a?(String)
  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.

Parameters:

Returns:

  • (Boolean)


1066
1067
1068
1069
1070
# File 'formula.rb', line 1066

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

  linked_keg.resolved_path == versioned_prefix(version)
end

#preserve_rpath?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)


401
# File 'formula.rb', line 401

def preserve_rpath? = self.class.preserve_rpath?

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:



2700
2701
2702
2703
2704
2705
# File 'formula.rb', line 2700

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

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

#pwsh_completionPathname

The directory where the formula's PowerShell 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:



1449
# File 'formula.rb', line 1449

def pwsh_completion = share/"pwsh/completions"

#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:



1083
# File 'formula.rb', line 1083

def rack = HOMEBREW_CELLAR/name

#recursive_dependencies(&block) ⇒ Array<Dependency>

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.

Parameters:

Returns:



2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
# File 'formula.rb', line 2738

def recursive_dependencies(&block)
  cache_key = "Formula#recursive_dependencies"
  if block
    cache_key += "-#{full_name}"
    cache_timestamp = Time.now
  end
  Dependency.expand(self, cache_key:, cache_timestamp:, &block)
ensure
  Dependency.delete_timestamped_cache_entry(cache_key, cache_timestamp) if block
end

#recursive_requirements(&block) ⇒ Requirements

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.

Parameters:

Returns:



2763
2764
2765
2766
# File 'formula.rb', line 2763

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

#requirements(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


160
# File 'sorbet/rbi/dsl/formula.rbi', line 160

def requirements(*args, &block); end

#resource(name = T.unsafe(nil), klass = T.unsafe(nil), &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:

  • name (String) (defaults to: T.unsafe(nil))
  • klass (T.class_of(Resource)) (defaults to: T.unsafe(nil))
  • block (T.proc.bind(Resource).void, nil)

Returns:



872
873
874
875
876
877
878
# File 'formula.rb', line 872

def resource(name = T.unsafe(nil), klass = T.unsafe(nil), &block)
  if klass.nil?
    active_spec.resource(*name, &block)
  else
    active_spec.resource(name, klass, &block)
  end
end

#resourcesT.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 Resources for the currently active SoftwareSpec.

Parameters:

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

Returns:

  • (T.untyped)


910
# File 'formula.rb', line 910

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

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

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:



2293
2294
2295
2296
2297
2298
2299
# File 'formula.rb', line 2293

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:



2907
2908
2909
# File 'formula.rb', line 2907

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:



2902
2903
2904
# File 'formula.rb', line 2902

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.



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
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
# File 'formula.rb', line 1647

def run_post_install
  @prefix_returns_versioned_prefix = T.let(true, T.nilable(T::Boolean))
  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),
    }

    Dir.mktmpdir("#{name}-postinstall-") do |home|
      postinstall_home = Pathname(home)
      new_env[:HOME] = postinstall_home.to_s
      setup_home postinstall_home

      with_env(new_env) do
        ENV.clear_sensitive_environment!
        ENV.activate_extensions!

        with_logging("post_install") do
          post_install
        end
      end
    end
  ensure
    self.build = build
    @prefix_returns_versioned_prefix = T.let(false, T.nilable(T::Boolean))
  end
end

#run_post_install_stepsvoid

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.



1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
# File 'formula.rb', line 1632

def run_post_install_steps
  return if post_install_steps.empty?

  @prefix_returns_versioned_prefix = T.let(true, T.nilable(T::Boolean))

  begin
    with_logging("post_install_steps") do
      Homebrew::InstallSteps::Runner.new(context: self).run(post_install_steps)
    end
  ensure
    @prefix_returns_versioned_prefix = T.let(false, T.nilable(T::Boolean))
  end
end

#run_test(keep_tmp: false) ⇒ BasicObject

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:

  • keep_tmp (Boolean) (defaults to: false)

Returns:

  • (BasicObject)


3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
# File 'formula.rb', line 3268

def run_test(keep_tmp: false)
  @prefix_returns_versioned_prefix = T.let(true, T.nilable(T::Boolean))

  test_env = {
    TMPDIR:        HOMEBREW_TEMP,
    TEMP:          HOMEBREW_TEMP,
    TMP:           HOMEBREW_TEMP,
    TERM:          "dumb",
    PATH:          PATH.new(ENV.fetch("PATH"), HOMEBREW_PREFIX/"bin"),
    HOMEBREW_TERM: ENV.fetch("TERM", nil),
    HOMEBREW_PATH: nil,
  }

  ENV.clear_sensitive_environment!
  Utils::Git.set_name_email!

  mktemp("#{name}-test") do |staging|
    staging.retain! if keep_tmp
    @testpath = T.let(staging.tmpdir, T.nilable(Pathname))
    test_env[:HOME] = @testpath
    test_env.merge!(common_stage_test_env(T.must(@testpath)))
    test_env[:_JAVA_OPTIONS] += " -Djava.io.tmpdir=#{HOMEBREW_TEMP}"
    setup_home T.must(@testpath)
    begin
      with_logging("test") do
        with_env(test_env) do
          test
        end
      end
    # Handle all possible exceptions running formula tests.
    rescue Exception # rubocop:disable Lint/RescueException
      staging.retain! if debug?
      raise
    end
  end
ensure
  @prefix_returns_versioned_prefix = T.let(false, T.nilable(T::Boolean))
  @testpath = T.let(nil, T.nilable(Pathname))
end

#runtime_dependencies(read_from_tab: true, undeclared: true) ⇒ Array<Dependency>

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.

Parameters:

  • read_from_tab (Boolean) (defaults to: true)
  • undeclared (Boolean) (defaults to: true)

Returns:



2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
# File 'formula.rb', line 2801

def runtime_dependencies(read_from_tab: true, undeclared: true)
  cache_key = "#{full_name}-#{read_from_tab}-#{undeclared}"

  Formula.cache[:runtime_dependencies] ||= {}
  Formula.cache[:runtime_dependencies][cache_key] ||= begin
    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
end

#runtime_formula_dependencies(read_from_tab: true, undeclared: true) ⇒ Array<Formula>

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.

Parameters:

  • read_from_tab (Boolean) (defaults to: true)
  • undeclared (Boolean) (defaults to: true)

Returns:



2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
# File 'formula.rb', line 2828

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_dependentsArray<Formula>

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:



2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
# File 'formula.rb', line 2859

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.installed_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:



1284
# File 'formula.rb', line 1284

def sbin = prefix/"sbin"

#selective_patch(is_data: 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.

This method returns an undefined value.

Parameters:

  • is_data (Boolean) (defaults to: false)


1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
# File 'formula.rb', line 1870

def selective_patch(is_data: false)
  patches = patchlist.select { |p| p.is_a?(DATAPatch) == is_data }
  return if patches.empty?

  patchtype = if is_data
    "DATA"
  else
    "non-DATA"
  end
  ohai "Applying #{patchtype} patches"
  patches.each(&:apply)
end

#serialized_patchesArray<Hash{String => 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.

Returns:



3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
# File 'formula.rb', line 3125

def serialized_patches
  patchlist.map do |p|
    h = { "strip" => p.strip.to_s }
    if p.external?
      external = T.cast(p, ExternalPatch)
      h["url"] = external.url
      h["sha256"] = external.resource.checksum&.hexdigest
      h["apply"] = external.resource.patch_files.map(&:to_s) if external.resource.patch_files.any?
      h["directory"] = external.resource.directory.to_s if external.resource.directory.present?
    elsif p.is_a?(LocalPatch)
      h["file"] = p.file.to_s
    else
      h["data"] = true
    end
    h
  end
end

#serialized_requirementsArray<Hash{String => 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.

Returns:



3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
# File 'formula.rb', line 3144

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

#serviceHomebrew::Service

The service specification for the software.

Returns:



1510
1511
1512
# File 'formula.rb', line 1510

def service
  @service ||= T.let(Homebrew::Service.new(self, &self.class.service), T.nilable(Homebrew::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)
  • block (T.untyped)

Returns:

  • (Boolean)

See Also:



609
# File 'formula.rb', line 609

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:



1492
# File 'formula.rb', line 1492

def service_name = service.service_name

#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:



1318
# File 'formula.rb', line 1318

def share = prefix/"share"

#shared_library(name, version = nil) ⇒ String

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:

Returns:



2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
# File 'formula.rb', line 2267

def shared_library(name, version = nil)
  return "*.dylib" if name == "*" && (version.blank? || version == "*")

  infix = if version == "*"
    "{,.*}"
  elsif version.present?
    ".#{version}"
  end
  "#{name}#{infix}.dylib"
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:



1727
1728
1729
1730
1731
1732
# File 'formula.rb', line 1727

def skip_clean?(path)
  return true if path.extname == ".la" && T.must(self.class.skip_clean_paths).include?(:la)

  to_check = path.relative_path_from(prefix).to_s
  T.must(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)


1853
1854
1855
1856
# File 'formula.rb', line 1853

def skip_cxxstdlib_check?
  odisabled "`Formula#skip_cxxstdlib_check?`"
  false
end

#specified_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 name specified to find this formula.

Returns:



503
504
505
# File 'formula.rb', line 503

def specified_name
  alias_name || name
end

#specified_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 path that was specified to find this formula.

Returns:



489
490
491
492
493
494
495
496
497
498
499
# File 'formula.rb', line 489

def specified_path
  return Homebrew::API::Internal.cached_packages_json_file_path if loaded_from_internal_api?
  return Homebrew::API::Formula.cached_json_file_path if loaded_from_api?
  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)


527
528
529
# File 'formula.rb', line 527

def stable?
  active_spec == stable
end

#std_cabal_v2_argsArray<String>

Standard parameters for Cabal-v2 builds.

Returns:



2101
2102
2103
2104
2105
2106
2107
2108
2109
# File 'formula.rb', line 2101

def std_cabal_v2_args
  # 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: ".", features: nil) ⇒ Array<String>

Standard parameters for Cargo builds.

Parameters:

Returns:



2121
2122
2123
2124
2125
# File 'formula.rb', line 2121

def std_cargo_args(root: prefix, path: ".", features: nil)
  args = ["--jobs", ENV.make_jobs.to_s, "--locked", "--root=#{root}", "--path=#{path}"]
  args += ["--features=#{Array(features).join(",")}"] if features
  args
end

#std_cmake_args(install_prefix: prefix, install_libdir: "lib", find_framework: "LAST") ⇒ Array<String>

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:



2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
# File 'formula.rb', line 2141

def std_cmake_args(install_prefix: prefix, install_libdir: "lib", find_framework: "LAST")
  %W[
    -DCMAKE_INSTALL_PREFIX=#{install_prefix}
    -DCMAKE_INSTALL_LIBDIR=#{install_libdir}
    -DCMAKE_BUILD_TYPE=Release
    -DCMAKE_FIND_FRAMEWORK=#{find_framework}
    -DCMAKE_VERBOSE_MAKEFILE=ON
    -DCMAKE_PROJECT_TOP_LEVEL_INCLUDES=#{HOMEBREW_LIBRARY_PATH}/cmake/trap_fetchcontent_provider.cmake
    -Wno-dev
    -DBUILD_TESTING=OFF
  ]
end

#std_configure_args(prefix: self.prefix, libdir: "lib") ⇒ Array<String>

Standard parameters for configure builds.

Parameters:

Returns:



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

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, gcflags: nil, tags: nil) ⇒ Array<String>

Standard parameters for Go builds.

Parameters:

Returns:



2179
2180
2181
2182
2183
2184
2185
# File 'formula.rb', line 2179

def std_go_args(output: bin/name, ldflags: nil, gcflags: nil, tags: nil)
  args = ["-trimpath", "-o=#{output}"]
  args += ["-tags=#{Array(tags).join(" ")}"] if tags
  args += ["-ldflags=#{Array(ldflags).join(" ")}"] if ldflags
  args += ["-gcflags=#{Array(gcflags).join(" ")}"] if gcflags
  args
end

#std_meson_argsArray<String>

Standard parameters for Meson builds.

Returns:



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

def std_meson_args
  ["--prefix=#{prefix}", "--libdir=#{lib}", "--buildtype=release", "--wrap-mode=nofallback"]
end

#std_npm_args(prefix: libexec, ignore_scripts: true) ⇒ Array<String>

Standard parameters for npm builds.

Parameters:

  • prefix (String, Pathname, false) (defaults to: libexec)

    installation prefix (default: libexec)

  • ignore_scripts (Boolean) (defaults to: true)

    whether to add --ignore-scripts flag (default: true)

Returns:



2201
2202
2203
2204
2205
2206
2207
# File 'formula.rb', line 2201

def std_npm_args(prefix: libexec, ignore_scripts: true)
  require "language/node"

  return Language::Node.std_npm_install_args(Pathname(prefix), ignore_scripts:) if prefix

  Language::Node.local_npm_install_args(ignore_scripts:)
end

#std_pip_args(prefix: self.prefix, build_isolation: false) ⇒ Array<String>

Standard parameters for pip builds.

Parameters:

  • prefix (false, String, Pathname) (defaults to: self.prefix)
  • build_isolation (Boolean) (defaults to: false)

Returns:



2216
2217
2218
2219
2220
2221
2222
2223
2224
# File 'formula.rb', line 2216

def std_pip_args(prefix: self.prefix, build_isolation: false)
  args = ["--verbose", "--no-deps", "--no-binary=:all:", "--ignore-installed", "--no-compile"]
  # Delay packages published in the last day so builds are less likely to
  # install a freshly compromised PyPI release.
  args << "--uploaded-prior-to=#{(Time.now.utc - (24 * 60 * 60)).iso8601(0)}"
  args << "--prefix=#{prefix}" if prefix
  args << "--no-build-isolation" unless build_isolation
  args
end

#std_zig_args(prefix: self.prefix, release_mode: :fast) ⇒ Array<String>

Standard parameters for Zig builds.

release_mode can be set to either :safe, :fast or :small, with :fast being the default value.

Parameters:

Returns:

Raises:

  • (ArgumentError)


2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
# File 'formula.rb', line 2236

def std_zig_args(prefix: self.prefix, release_mode: :fast)
  raise ArgumentError, "Invalid Zig release mode: #{release_mode}" if [:safe, :fast, :small].exclude?(release_mode)

  release_mode_downcased = release_mode.to_s.downcase
  release_mode_capitalized = release_mode.to_s.capitalize
  [
    "--prefix", prefix.to_s,
    "--release=#{release_mode_downcased}",
    "-Doptimize=Release#{release_mode_capitalized}",
    "--summary", "all"
  ]
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)


2021
# File 'formula.rb', line 2021

def supersedes_an_installed_formula? = old_installed_formulae.any?

#supports_linux?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)


2693
2694
2695
2696
2697
# File 'formula.rb', line 2693

def supports_linux?
  return true if active_spec.depends_on_linux_set_top_level?

  !active_spec.depends_on_macos_set_top_level?
end

#supports_macos?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)


2688
2689
2690
# File 'formula.rb', line 2688

def supports_macos?
  !active_spec.depends_on_linux_set_top_level?
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)


847
848
849
850
851
# File 'formula.rb', line 847

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 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:



3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
# File 'formula.rb', line 3477

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 "zig"
      pretty_args -= std_zig_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 ||= T.let(0, T.nilable(Integer))
  @exec_count += 1
  log_filename = format("#{logs}/#{active_log_prefix}%02<exec_count>d.%<cmd_base>s.log",
                        exec_count: @exec_count,
                        cmd_base:   File.basename(cmd).split.first)
  logs.mkpath

  File.open(log_filename, "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, log_filename)
        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, log_filename)
      end
    end

    Process.wait(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 #{log_filename}:"
        Kernel.system "/usr/bin/tail", "-n", log_lines.to_s, log_filename
      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:



1500
# File 'formula.rb', line 1500

def systemd_service_path = (any_installed_prefix || opt_prefix)/"#{service_name}.service"

#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:



1504
# File 'formula.rb', line 1504

def systemd_timer_path = (any_installed_prefix || opt_prefix)/"#{service_name}.timer"

#tap!Tap

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:



474
475
476
# File 'formula.rb', line 474

def tap!
  tap || raise("Formula tap is nil")
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 an external Tap.

Returns:

  • (Boolean)


2674
2675
2676
2677
2678
# File 'formula.rb', line 2674

def tap?
  return false unless tap

  !T.must(tap).core_tap?
end

#tap_git_headString?

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:



2708
2709
2710
2711
2712
# File 'formula.rb', line 2708

def tap_git_head
  tap&.git_head
rescue TapUnavailableError
  nil
end

#tap_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.

Returns:



479
480
481
482
483
484
485
# File 'formula.rb', line 479

def tap_path
  return path unless (t = tap)
  return Formulary.core_path(name) if t.core_tap?
  return path unless t.installed?

  t.formula_files_by_name[name] || path
end

#testBasicObject

This method is overridden in Formula subclasses to provide the test instructions. Called by brew test.

Returns:

  • (BasicObject)


3321
# File 'formula.rb', line 3321

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)


3309
3310
3311
# File 'formula.rb', line 3309

def test_defined?
  method(:test).owner != Formula
end

#test_fixtures(file) ⇒ Pathname

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:



3324
3325
3326
# File 'formula.rb', line 3324

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:



2311
2312
2313
2314
2315
2316
2317
# File 'formula.rb', line 2311

def time
  if ENV["SOURCE_DATE_EPOCH"].present?
    Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc
  else
    Time.now.utc
  end
end

#to_hashHash{String => 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.

Returns:



2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
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
# File 'formula.rb', line 2928

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,
    "patches"                         => serialized_patches,
    "revision"                        => revision,
    "version_scheme"                  => version_scheme,
    "compatibility_version"           => compatibility_version,
    "autobump"                        => autobump?,
    "no_autobump_message"             => no_autobump_message,
    "skip_livecheck"                  => livecheck.skip?,
    "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,
    "deprecation_replacement_formula" => deprecation_replacement_formula,
    "deprecation_replacement_cask"    => deprecation_replacement_cask,
    "deprecate_args"                  => deprecate_args,
    "disabled"                        => disabled?,
    "disable_date"                    => disable_date,
    "disable_reason"                  => disable_reason,
    "disable_replacement_formula"     => disable_replacement_formula,
    "disable_replacement_cask"        => disable_replacement_cask,
    "disable_args"                    => disable_args,
    "post_install_steps"              => post_install_steps,
    "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_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_variationsHash{String => 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.

Returns:



3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
# File 'formula.rb', line 3024

def to_hash_with_variations
  if loaded_from_internal_api?
    raise UsageError, "Cannot call #to_hash_with_variations on formulae loaded from the internal API"
  end

  hash = to_hash

  # Take from API, merging in local install status.
  if loaded_from_api? && (json_formula = api_source) && !Homebrew::EnvConfig.no_install_from_api?
    return json_formula.dup.merge(
      hash.slice("name", "installed", "linked_keg", "pinned", "outdated"),
    )
  end

  variations = {}

  if path.exist? && on_system_blocks_exist?
    formula_contents = path.read
    OnSystem::VALID_OS_ARCH_TAGS.each do |bottle_tag|
      Homebrew::SimulateSystem.with_tag(bottle_tag) do
        variations_namespace = Formulary.class_s("Variations#{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.to_hash.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
  hash
end

#unlockArray<FormulaLock>

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:



1938
1939
1940
1941
# File 'formula.rb', line 1938

def unlock
  @lock&.unlock
  @oldname_locks.each(&:unlock)
end

#unpin(*args, &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)
  • block (T.untyped)

Returns:

  • (T.untyped)


169
# File 'sorbet/rbi/dsl/formula.rbi', line 169

def unpin(*args, &block); end

#unversioned_formula_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:



706
707
708
709
710
# File 'formula.rb', line 706

def unversioned_formula_name
  return unless versioned_formula?

  name.sub(/@[\d.]+(?=-full$|$)/, "")
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.



647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
# File 'formula.rb', line 647

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)
  end
end

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

Parameters:

  • val (String) (defaults to: "")
  • specs (Hash{Symbol => T.anything}) (defaults to: {})

Returns:



153
# File 'sorbet/rbi/shims/rspec.rbi', line 153

def url(val = "", specs = {}); end

#urls_hashHash{String => Hash{String => 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.

Returns:



3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
# File 'formula.rb', line 3099

def urls_hash
  hash = {}

  if stable
    stable_spec = T.must(stable)
    hash["stable"] = {
      "url"      => stable_spec.url,
      "tag"      => stable_spec.specs[:tag],
      "revision" => stable_spec.specs[:revision],
      "using"    => (stable_spec.using if stable_spec.using.is_a?(Symbol)),
      "checksum" => stable_spec.checksum&.to_s,
    }
  end

  if head
    hash["head"] = {
      "url"    => T.must(head).url,
      "branch" => T.must(head).specs[:branch],
      "using"  => (T.must(head).using if T.must(head).using.is_a?(Symbol)),
    }
  end

  hash
end

#valid_platform?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 can be installed on this platform. Redefined in extend/os.

Returns:

  • (Boolean)


2683
2684
2685
# File 'formula.rb', line 2683

def valid_platform?
  supports_macos? && supports_linux?
end

#varPathname

The directory where the formula's variable files should be installed. This directory is not inside the HOMEBREW_CELLAR so it persists across upgrades.

Returns:



1395
# File 'formula.rb', line 1395

def var = HOMEBREW_PREFIX/"var"

#versionT.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 version for the currently active SoftwareSpec. The version is autodetected from the URL and/or tag so only needs to be declared if it cannot be autodetected correctly.

Parameters:

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

Returns:

  • (T.untyped)

See Also:



616
# File 'formula.rb', line 616

delegate version: :active_spec

#versioned_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.

If this is a @-versioned formula.

Returns:

  • (Boolean)


671
# File 'formula.rb', line 671

def versioned_formula? = name.include?("@")

#versioned_formulaeArray<Formula>

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 any @-versioned Formula objects for any Formula (including versioned formulae).

Returns:



697
698
699
700
701
702
703
# File 'formula.rb', line 697

def versioned_formulae
  versioned_formulae_names.filter_map do |name|
    Formula[name]
  rescue FormulaUnavailableError
    nil
  end.sort_by(&:version).reverse
end

#versioned_formulae_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.

Returns any other @-versioned formulae names for any Formula (including versioned formulae).

Returns:



675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
# File 'formula.rb', line 675

def versioned_formulae_names
  name_prefix = unversioned_formula_name || name

  versioned_names = if (formula_tap = tap)
    formula_tap.prefix_to_versioned_formulae_names.fetch(name_prefix, [])
  else
    versioned_formula_glob = if name_prefix.end_with?("-full")
      "#{name_prefix.delete_suffix("-full")}@*-full.rb"
    else
      "#{name_prefix}@*.rb"
    end

    formula_names_for_glob(versioned_formula_glob)
  end

  versioned_names.reject do |versioned_name|
    versioned_name == name
  end
end

#warn_on_post_install_steps_conflictvoid

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.



1614
1615
1616
# File 'formula.rb', line 1614

def warn_on_post_install_steps_conflict
  opoo "#{full_name}: `post_install` is ignored because `post_install_steps` are defined!"
end

#with_logging(log_type, &_block) ⇒ T.type_parameter(:U)

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.

Runs a block with the given log type in effect for its duration.

Parameters:

  • log_type (String)
  • _block (T.proc.returns(T.type_parameter(:U)))

Returns:

  • (T.type_parameter(:U))


1478
1479
1480
1481
1482
1483
1484
# File 'formula.rb', line 1478

def with_logging(log_type, &_block)
  old_log_type = @active_log_type
  @active_log_type = T.let(log_type, T.nilable(String))
  yield
ensure
  @active_log_type = old_log_type
end

#xcodebuild(*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.

Runs xcodebuild without Homebrew's compiler environment variables set.

Parameters:



3656
3657
3658
3659
3660
3661
3662
3663
3664
# File 'formula.rb', line 3656

def xcodebuild(*args)
  removed = ENV.remove_cc_etc

  begin
    self.system("xcodebuild", *args)
  ensure
    ENV.update(removed)
  end
end

#zsh_completionPathname

The directory where the formula's zsh 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:



1431
# File 'formula.rb', line 1431

def zsh_completion = share/"zsh/site-functions"

#zsh_functionPathname

The directory where the formula's zsh 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:



1404
# File 'formula.rb', line 1404

def zsh_function = share/"zsh/site-functions"