Class: Formula Abstract Private

Inherits:
Object show all
Extended by:
APIHashable, BuildEnvironment::DSL, Cachable, Forwardable, OnSystem::MacOSAndLinux, T::Helpers
Includes:
Context, FileUtils, Homebrew::Livecheck::Constants, OS::Linux::Formula, OS::Mac::Formula, OnSystem::MacOSAndLinux, Utils::Shebang, Utils::Shell
Defined in:
formula.rb,
sorbet/rbi/dsl/formula.rbi

Overview

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

This class is abstract.

A formula provides instructions and metadata for Homebrew to install a piece of software. Every Homebrew formula is a Formula. All subclasses of Formula (and all Ruby classes) have to be named UpperCase and not-use-dashes. A formula specified in this-formula.rb should have a class named ThisFormula. Homebrew does enforce that the name of the file and the class correspond. Make sure you check with brew search that the name is free!

Example

class Wget < Formula
  homepage "https://www.gnu.org/software/wget/"
  url "https://ftp.gnu.org/gnu/wget/wget-1.15.tar.gz"
  sha256 "52126be8cf1bddd7536886e74c053ad7d0ed2aa89b4b630f76785bac21695fcd"

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

Constant Summary

Constants included from Homebrew::Livecheck::Constants

Homebrew::Livecheck::Constants::LATEST_VERSION

Constants included from Utils::Shell

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

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from OnSystem::MacOSAndLinux

included, on_arch_conditional, on_macos, on_system_conditional

Methods included from BuildEnvironment::DSL

inherited

Methods included from Cachable

cache

Methods included from APIHashable

generated_hash!, generating_hash!, generating_hash?

Methods included from Context

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

Methods included from Utils::Shell

csh_quote, export_value, from_path, parent, preferred, preferred_path, prepend_path_in_profile, profile, set_variable_in_profile, sh_quote, 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)


227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
# File 'formula.rb', line 227

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 = T.let(name, String)
  @unresolved_path = T.let(path, Pathname)
  @path = T.let(path.resolved_path, Pathname)
  @alias_path = T.let(alias_path, T.nilable(Pathname))
  @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)
  @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 = T.let(force_bottle, T::Boolean)

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

  @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)
end

Class Attribute Details

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



3566
3567
3568
# File 'formula.rb', line 3566

def conflicts
  @conflicts
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 that this Formula was or becomes deprecated. Returns nil if no date is specified.

Returns:

  • (Date, nil)

See Also:



4400
4401
4402
# File 'formula.rb', line 4400

def deprecation_date
  @deprecation_date
end

.deprecation_reasonnil, ... (readonly)

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

The reason for deprecation of a Formula.

Returns:

  • (nil, String, Symbol)

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

See Also:



4407
4408
4409
# File 'formula.rb', line 4407

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:



4421
4422
4423
# File 'formula.rb', line 4421

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:



4414
4415
4416
# File 'formula.rb', line 4414

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



4499
4500
4501
# File 'formula.rb', line 4499

def disable_date
  @disable_date
end

.disable_reasonnil, ... (readonly)

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

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

Returns:

See Also:



4506
4507
4508
# File 'formula.rb', line 4506

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:



4520
4521
4522
# File 'formula.rb', line 4520

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:



4513
4514
4515
# File 'formula.rb', line 4513

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:



3367
3368
3369
# File 'formula.rb', line 3367

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:



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

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 autobump list. Returns nil if no message is specified.

Returns:

See Also:



4240
4241
4242
# File 'formula.rb', line 4240

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:



3580
3581
3582
# File 'formula.rb', line 3580

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:



3575
3576
3577
# File 'formula.rb', line 3575

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



3569
3570
3571
# File 'formula.rb', line 3569

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:



202
203
204
# File 'formula.rb', line 202

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:



277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# File 'formula.rb', line 277

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


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

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:



108
109
110
# File 'formula.rb', line 108

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:



103
104
105
# File 'formula.rb', line 103

def alias_path
  @alias_path
end

#buildBuildOptions, Tab

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

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

Returns:



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

def build
  @build
end

#buildpathPathname? (readonly)

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

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

Returns:



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

def buildpath
  @buildpath
end

#follow_installed_aliasBoolean Also known as: follow_installed_alias?

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

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

Returns:

  • (Boolean)


215
216
217
# File 'formula.rb', line 215

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)


221
222
223
# File 'formula.rb', line 221

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:



122
123
124
# File 'formula.rb', line 122

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:



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

def full_name
  @full_name
end

#headSoftwareSpec? (readonly)

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

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

Returns:

See Also:



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

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:



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

def local_bottle_path
  @local_bottle_path
end

#nameString (readonly)

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

Returns:



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

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:



129
130
131
# File 'formula.rb', line 129

def path
  @path
end

#revisionInteger (readonly)

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

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

Returns:

  • (Integer)

See Also:

  • revision=


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

def revision
  @revision
end

#source_modified_timeTime? (readonly)

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

most recent modified time for source files

Returns:



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

def source_modified_time
  @source_modified_time
end

#stableSoftwareSpec? (readonly)

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

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

Returns:



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

def stable
  @stable
end

#tapTap? (readonly)

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

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

Returns:



136
137
138
# File 'formula.rb', line 136

def tap
  @tap
end

#testpathPathname? (readonly)

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

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

Returns:



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

def testpath
  @testpath
end

#version_schemeInteger (readonly)

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

Used to change version schemes for packages.

Returns:

  • (Integer)

See Also:

  • version_scheme=


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

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:



2298
2299
2300
# File 'formula.rb', line 2298

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:



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

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:



2277
2278
2279
2280
2281
# File 'formula.rb', line 2277

def self.aliases
  @aliases ||= T.let((core_aliases + tap_aliases.map do |name|
    name.split("/").fetch(-1)
  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 all Formula this should only be used when users specify --all to a command

Parameters:

  • eval_all (Boolean) (defaults to: false)

Returns:



2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
# File 'formula.rb', line 2206

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

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

    nil
  end
end

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



3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
# File 'formula.rb', line 3465

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 autobump list?

Returns:

  • (Boolean)


4227
4228
4229
# File 'formula.rb', line 4227

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", catalina:    "ef65c759c5097a36323fa9c77756468649e8d1980a3a4e05695c05e39568967c"
  sha256 cellar: :any,           mojave:      "28f4090610946a4eb207df102d841de23ced0d06ba31cb79e040d883906dcd4f"
  sha256                         high_sierra: "91dd0caca9bd3f38c439d5a7b6f68440c4274945615fae035ff0a369264b8a2f"
end

Homebrew maintainers aim to bottle all formulae.

Parameters:

See Also:



3729
# File 'formula.rb', line 3729

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:



3732
# File 'formula.rb', line 3732

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:



3736
3737
3738
3739
3740
3741
3742
# File 'formula.rb', line 3736

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

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

.conflicts_with(*names) ⇒ 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)


4024
4025
4026
4027
# File 'formula.rb', line 4024

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 Formula

Returns:



2259
2260
2261
# File 'formula.rb', line 2259

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:



2265
2266
2267
# File 'formula.rb', line 2265

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:



2173
2174
2175
# File 'formula.rb', line 2173

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:



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

def cxxstdlib_check(check_type)
  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:



3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
# File 'formula.rb', line 3497

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

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

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

Parameters:



3890
3891
3892
# File 'formula.rb', line 3890

def depends_on(dep)
  specs.each { |spec| spec.depends_on(dep) }
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 (nil, String, Symbol)
  • replacement (String, nil) (defaults to: nil)
  • replacement_formula (String, nil) (defaults to: nil)
  • replacement_cask (String, nil) (defaults to: nil)

See Also:



4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
# File 'formula.rb', line 4366

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

  @deprecation_date = T.let(Date.parse(date), T.nilable(Date))
  return if T.must(@deprecation_date) > Date.today

  @deprecation_reason = T.let(because, T.any(NilClass, 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))
  T.must(@deprecated = T.let(true, T.nilable(T::Boolean)))
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:



4391
4392
4393
# File 'formula.rb', line 4391

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:



3953
3954
3955
# File 'formula.rb', line 3953

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:



3381
3382
3383
# File 'formula.rb', line 3381

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 the formula will be deprecated instead of disabled.

Examples

disable! date: "2020-08-27", because: :does_not_build
disable! date: "2020-08-27", because: "has been replaced by foo"
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 (nil, String, Symbol)
  • replacement (String, nil) (defaults to: nil)
  • replacement_formula (String, nil) (defaults to: nil)
  • replacement_cask (String, nil) (defaults to: nil)

See Also:



4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
# File 'formula.rb', line 4457

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 deprecate!(:replacement_cask)",
    )
  end

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

  if T.must(@disable_date) > Date.today
    @deprecation_reason = T.let(because, T.any(NilClass, 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:



4490
4491
4492
# File 'formula.rb', line 4490

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:



4124
4125
4126
# File 'formula.rb', line 4124

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)


3344
3345
3346
3347
3348
3349
3350
3351
# File 'formula.rb', line 3344

def freeze
  specs.each(&:freeze)
  @livecheck.freeze
  @conflicts.freeze
  @skip_clean_paths.freeze
  @link_overwrite_paths.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 the fully-qualified name

Returns:



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

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:



2291
2292
2293
2294
2295
# File 'formula.rb', line 2291

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

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

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

Example

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

or (if autodetect fails):

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

Parameters:

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

Returns:

  • (T.untyped)


3795
3796
3797
3798
3799
3800
3801
3802
3803
# File 'formula.rb', line 3795

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:



3532
3533
3534
# File 'formula.rb', line 3532

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:



3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
# File 'formula.rb', line 3325

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]))
    @loaded_from_api = T.let(false, T.nilable(T::Boolean))
    @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]))
  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 Formula

Returns:



2242
2243
2244
2245
2246
2247
2248
# File 'formula.rb', line 2242

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:



2236
2237
2238
# File 'formula.rb', line 2236

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:



2251
2252
2253
2254
2255
# File 'formula.rb', line 2251

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:



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

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

.license(args = nil) ⇒ nil, ...

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

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

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

Examples

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

Parameters:

Returns:

See Also:



3438
3439
3440
3441
3442
3443
3444
# File 'formula.rb', line 3438

def license(args = nil)
  if args.nil?
    @licenses
  else
    @licenses = T.let(args, T.any(NilClass, String, Symbol, T::Hash[T.any(String, Symbol), T.anything]))
  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:



4537
4538
4539
4540
# File 'formula.rb', line 4537

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)


4201
4202
4203
4204
4205
4206
# File 'formula.rb', line 4201

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)


3541
3542
3543
# File 'formula.rb', line 3541

def livecheck_defined?
  @livecheck_defined == true
end

.livecheckable?Boolean

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

Deprecated.

Use livecheck_defined? instead.

Checks whether a livecheck specification is defined or not. This is a legacy alias for #livecheck_defined?.

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

Returns:

  • (Boolean)


3551
3552
3553
3554
# File 'formula.rb', line 3551

def livecheckable?
  odeprecated "`livecheckable?`", "`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)


3358
# File 'formula.rb', line 3358

def loaded_from_api? = !!@loaded_from_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:



3686
# File 'formula.rb', line 3686

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:



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

def self.names
  @names ||= T.let((core_names + tap_names.map do |name|
    name.split("/").fetch(-1)
  end).uniq.sort, T.nilable(T::Array[String]))
end

.needs(*standards) ⇒ void

This method returns an undefined value.

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

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

Parameters:

See Also:



4140
4141
4142
# File 'formula.rb', line 4140

def needs(*standards)
  specs.each { |spec| spec.needs(*standards) }
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:



3354
# File 'formula.rb', line 3354

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)


3512
3513
3514
3515
3516
3517
# File 'formula.rb', line 3512

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

TODO:

limit this method to the official taps only (f.e. raise

This method returns an undefined value.

Method that excludes the formula from the autobump list. an error if !tap.official?)

Parameters:



4215
4216
4217
4218
4219
4220
4221
4222
4223
# File 'formula.rb', line 4215

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

  @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

.no_autobump_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 no_autobump! method defined?

Returns:

  • (Boolean)


4233
# File 'formula.rb', line 4233

def no_autobump_defined? = @no_autobump_defined == true

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


3363
# File 'formula.rb', line 3363

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.

There are also some special options:

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

Examples

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

Parameters:



3937
3938
3939
# File 'formula.rb', line 3937

def option(name, description = "")
  specs.each { |spec| spec.option(name, description) }
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:



4010
4011
4012
# File 'formula.rb', line 4010

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

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


4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
# File 'formula.rb', line 4294

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

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



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

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:



3820
3821
3822
3823
3824
# File 'formula.rb', line 3820

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:

  • (Integer, nil)


3596
3597
3598
# File 'formula.rb', line 3596

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)


4257
4258
4259
4260
4261
# File 'formula.rb', line 4257

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)


3561
3562
3563
# File 'formula.rb', line 3561

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:



3702
# File 'formula.rb', line 3702

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:



4049
4050
4051
4052
4053
# File 'formula.rb', line 4049

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:



3621
# File 'formula.rb', line 3621

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:



3625
3626
3627
3628
3629
# File 'formula.rb', line 3625

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:

Returns:

  • (T.untyped)


3762
3763
3764
3765
3766
# File 'formula.rb', line 3762

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:



2271
2272
2273
# File 'formula.rb', line 2271

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:



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

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:



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

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) ⇒ T.untyped

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

Returns:

  • (T.untyped)

See Also:



4181
# File 'formula.rb', line 4181

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

Examples

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

Parameters:

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

Returns:



3655
# File 'formula.rb', line 3655

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:



3906
3907
3908
# File 'formula.rb', line 3906

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:



3669
# File 'formula.rb', line 3669

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:

  • (Integer, nil)


3616
3617
3618
# File 'formula.rb', line 3616

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:



1181
1182
1183
1184
1185
1186
1187
# File 'formula.rb', line 1181

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)


1681
1682
1683
# File 'formula.rb', line 1681

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:



631
632
633
634
635
636
637
638
639
# File 'formula.rb', line 631

def aliases
  @aliases ||= T.let(
    if (tap = self.tap)
      tap.alias_reverse_table.fetch(full_name, []).map { _1.split("/").fetch(-1) }
    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:



2367
2368
2369
2370
2371
2372
# File 'formula.rb', line 2367

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:



2378
2379
2380
2381
2382
2383
2384
# File 'formula.rb', line 2378

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:



2389
2390
2391
# File 'formula.rb', line 2389

def any_installed_version
  any_installed_keg&.version
end

#any_version_installed?Boolean

If at least one version of Formula is installed.

Returns:

  • (Boolean)


693
694
695
# File 'formula.rb', line 693

def any_version_installed?
  installed_prefixes.any? { |keg| (keg/AbstractTab::FILENAME).file? }
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 autobump list?

Parameters:

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

Returns:

  • (Boolean)

See Also:



489
# File 'formula.rb', line 489

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:



1142
# File 'formula.rb', line 1142

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:



840
# File 'formula.rb', line 840

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:



441
442
443
# File 'formula.rb', line 441

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)


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

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:



447
448
449
# File 'formula.rb', line 447

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:



2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
# File 'formula.rb', line 2622

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



1173
# File 'formula.rb', line 1173

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)


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

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:



3218
3219
3220
3221
3222
# File 'formula.rb', line 3218

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)


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

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)


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

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)


1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
# File 'formula.rb', line 1548

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)


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

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 < :el_capitan
  s
end

Returns:



1383
# File 'formula.rb', line 1383

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:



2705
2706
2707
2708
# File 'formula.rb', line 2705

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)


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

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)


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

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.

!attr[r] conflicts

Returns:



2343
# File 'formula.rb', line 2343

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)


2304
2305
2306
# File 'formula.rb', line 2304

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:



1660
1661
1662
# File 'formula.rb', line 1660

def current_installed_alias_target
  Formulary.factory(T.must(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)


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

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)


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

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:



2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
# File 'formula.rb', line 2711

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

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

  hash = {}

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

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

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

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

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

  hash
end

#deprecated?Boolean

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

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

Parameters:

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

Returns:

  • (Boolean)

See Also:



1449
# File 'formula.rb', line 1449

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)


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

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)


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

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:



1456
# File 'formula.rb', line 1456

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:



1463
# File 'formula.rb', line 1463

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:



1477
# File 'formula.rb', line 1477

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:



1470
# File 'formula.rb', line 1470

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)


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

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:



454
# File 'formula.rb', line 454

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:



1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
# File 'formula.rb', line 1970

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&.each do |target|
    extract_macho_slice_from(Pathname(target), Hardware::CPU.arch)
  end
end

#disable_dateT.untyped

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

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

Parameters:

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

Returns:

  • (T.untyped)

    Date

See Also:



1491
# File 'formula.rb', line 1491

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:



1498
# File 'formula.rb', line 1498

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:



1512
# File 'formula.rb', line 1512

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:



1505
# File 'formula.rb', line 1505

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:



1484
# File 'formula.rb', line 1484

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:



848
# File 'formula.rb', line 848

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)


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

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:



3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
# File 'formula.rb', line 3124

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 cellar only has one version installed, don't complain
    # that we can't tell which one to keep. Don't complain at all if the
    # only installed version is a pinned formula.
    opoo "Skipping #{full_name}: most recent version #{pkg_version} not installed" unless quiet
  end
  eligible_for_cleanup
end

#elispPathname

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

Example

To install an Emacs mode included with a software package:

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

Returns:



1070
# File 'formula.rb', line 1070

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

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


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

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:



1098
# File 'formula.rb', line 1098

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

#fetch(verify_download_integrity: true, timeout: nil, quiet: false) ⇒ 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:

  • verify_download_integrity (Boolean) (defaults to: true)
  • timeout (Integer, Float, nil) (defaults to: nil)
  • quiet (Boolean) (defaults to: false)

Returns:



2806
2807
2808
2809
# File 'formula.rb', line 2806

def fetch(verify_download_integrity: true, timeout: nil, quiet: false)
  odisabled "Formula#fetch", "Resource#fetch on Formula#resource"
  active_spec.fetch(verify_download_integrity:, timeout:, quiet:)
end

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


3211
3212
3213
3214
3215
# File 'formula.rb', line 3211

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.



3206
3207
3208
# File 'formula.rb', line 3206

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:



1160
# File 'formula.rb', line 1160

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:



1133
# File 'formula.rb', line 1133

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:



1079
# File 'formula.rb', line 1079

def frameworks = prefix/"Frameworks"

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



373
# File 'formula.rb', line 373

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:



408
409
410
# File 'formula.rb', line 408

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:



396
397
398
# File 'formula.rb', line 396

def full_specified_name
  full_alias_name || full_name
end

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

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

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

Using predefined shell_parameter_format :arg.

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

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

Using predefined shell_parameter_format :none.

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

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

Using predefined shell_parameter_format :click.

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

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

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

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

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

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

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



2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
# File 'formula.rb', line 2119

def generate_completions_from_executable(*commands,
                                         base_name: nil,
                                         shells: [:bash, :zsh, :fish],
                                         shell_parameter_format: nil)
  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]
    # Go's cobra and Rust's clap accept "powershell".
    shell_argument = (shell == :pwsh) ? "powershell" : shell.to_s
    shell_parameter = if shell_parameter_format.nil?
      shell_argument.to_s
    elsif shell_parameter_format == :flag
      "--#{shell_argument}"
    elsif shell_parameter_format == :arg
      "--shell=#{shell_argument}"
    elsif shell_parameter_format == :none
      nil
    elsif shell_parameter_format == :click
      prog_name = File.basename(executable).upcase.tr("-", "_")
      popen_read_env["_#{prog_name}_COMPLETE"] = "#{shell_argument}_source"
      nil
    elsif shell_parameter_format == :clap
      popen_read_env["COMPLETE"] = shell_argument.to_s
      nil
    else
      "#{shell_parameter_format}#{shell_argument}"
    end

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

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

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

#head?Boolean

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

Is the currently active SoftwareSpec a #head build?

Returns:

  • (Boolean)


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

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)


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

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)


729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
# File 'formula.rb', line 729

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:



464
# File 'formula.rb', line 464

delegate homepage: :"self.class"

#includePathname

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

Example

No make install available?

include.install "example.h"

Returns:



864
# File 'formula.rb', line 864

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:



872
# File 'formula.rb', line 872

def info = share/"info"

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



2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
# File 'formula.rb', line 2921

def inreplace(paths, before = nil, after = nil, old_audit_result = nil, audit_result: true, global: true, &block)
  # NOTE: must check for `#nil?` and not `#blank?`, or else `old_audit_result = false` will not call `odeprecated`.
  unless old_audit_result.nil?
    odisabled "inreplace(paths, before, after, #{old_audit_result})",
              "inreplace(paths, before, after, audit_result: #{old_audit_result})"
    audit_result = old_audit_result
  end
  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 is part of a private API. This method may only be 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.

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


2883
# File 'formula.rb', line 2883

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.



1317
1318
1319
1320
1321
1322
1323
1324
# File 'formula.rb', line 1317

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

#installed_alias_nameString?

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

Returns:



370
# File 'formula.rb', line 370

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:



357
358
359
360
361
362
363
364
365
366
367
# File 'formula.rb', line 357

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)


1667
1668
1669
1670
1671
1672
# File 'formula.rb', line 1667

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:



816
817
818
# File 'formula.rb', line 816

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:



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

def installed_prefixes
  possible_names.map { |name| HOMEBREW_CELLAR/name }
                .select(&:directory?)
                .flat_map(&:subdirs)
                .sort_by(&:basename)
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:



402
403
404
# File 'formula.rb', line 402

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)


2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
# File 'formula.rb', line 2776

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:



1391
1392
1393
1394
1395
# File 'formula.rb', line 1391

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)


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

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:



1088
# File 'formula.rb', line 1088

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

Returns:



1688
1689
1690
# File 'formula.rb', line 1688

def latest_formula
  installed_alias_target_changed? ? T.must(current_installed_alias_target) : self
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:



723
724
725
726
# File 'formula.rb', line 723

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:



711
712
713
714
715
716
717
718
719
720
# File 'formula.rb', line 711

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:



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

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)


685
686
687
# File 'formula.rb', line 685

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

#launchd_service_pathPathname

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

The generated launchd service file path.

Returns:



1209
# File 'formula.rb', line 1209

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:



888
# File 'formula.rb', line 888

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:



905
# File 'formula.rb', line 905

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:



459
# File 'formula.rb', line 459

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.

Parameters:

Returns:

  • (Boolean)

See Also:



1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
# File 'formula.rb', line 1410

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

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

    begin
      f = Formulary.factory(keg.name)
    rescue FormulaUnavailableError
      # formula for this keg is deleted, so defer to allowlist
    rescue TapFormulaAmbiguityError
      return false # this keg belongs to another formula
    else
      # this keg belongs to another unrelated formula
      return false unless f.possible_names.include?(keg.name)
    end
  end
  to_check = path.relative_path_from(HOMEBREW_PREFIX).to_s
  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
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)


778
# File 'formula.rb', line 778

def linked? = linked_keg.symlink?

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



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

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:



794
795
796
797
798
# File 'formula.rb', line 794

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:



469
# File 'formula.rb', line 469

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:



474
# File 'formula.rb', line 474

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.

Is a livecheck specification defined for the software?

Parameters:

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

Returns:

  • (Boolean)

See Also:



479
# File 'formula.rb', line 479

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:



520
# File 'formula.rb', line 520

delegate loaded_from_api?: :"self.class"

#loader_pathString

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

Returns:



1947
# File 'formula.rb', line 1947

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:



1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
# File 'formula.rb', line 1582

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:



1177
# File 'formula.rb', line 1177

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:



915
# File 'formula.rb', line 915

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:



931
# File 'formula.rb', line 931

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:



939
# File 'formula.rb', line 939

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:



955
# File 'formula.rb', line 955

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:



963
# File 'formula.rb', line 963

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:



971
# File 'formula.rb', line 971

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:



979
# File 'formula.rb', line 979

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:



987
# File 'formula.rb', line 987

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:



995
# File 'formula.rb', line 995

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)


1614
1615
1616
# File 'formula.rb', line 1614

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

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

Parameters:

Returns:



2454
2455
2456
2457
2458
2459
2460
2461
2462
# File 'formula.rb', line 2454

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

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


3186
3187
3188
3189
3190
3191
# File 'formula.rb', line 3186

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

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


3179
3180
3181
# File 'formula.rb', line 3179

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)


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

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)


1655
1656
1657
# File 'formula.rb', line 1655

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 autobump list.

Parameters:

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

Returns:

  • (T.untyped)

See Also:



484
# File 'formula.rb', line 484

delegate no_autobump!: :"self.class"

#no_autobump_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 no_autobump! method defined?

Parameters:

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

Returns:

  • (Boolean)

See Also:



494
# File 'formula.rb', line 494

delegate no_autobump_defined?: :"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)


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

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:



1693
1694
1695
1696
1697
1698
1699
1700
# File 'formula.rb', line 1693

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:



617
618
619
620
621
622
623
624
625
# File 'formula.rb', line 617

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:



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

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)


2795
2796
2797
# File 'formula.rb', line 2795

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:



1246
# File 'formula.rb', line 1246

def opt_bin = opt_prefix/"bin"

#opt_elispPathname

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

Returns:



1288
# File 'formula.rb', line 1288

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

#opt_frameworksPathname

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

Returns:



1294
# File 'formula.rb', line 1294

def opt_frameworks = opt_prefix/"Frameworks"

#opt_includePathname

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

Returns:



1252
# File 'formula.rb', line 1252

def opt_include = opt_prefix/"include"

#opt_libPathname

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

Returns:



1258
# File 'formula.rb', line 1258

def opt_lib = opt_prefix/"lib"

#opt_libexecPathname

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

Returns:



1264
# File 'formula.rb', line 1264

def opt_libexec = opt_prefix/"libexec"

#opt_pkgsharePathname

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

Returns:



1282
# File 'formula.rb', line 1282

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:



1240
# File 'formula.rb', line 1240

def opt_prefix = HOMEBREW_PREFIX/"opt"/name

#opt_sbinPathname

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

Returns:



1270
# File 'formula.rb', line 1270

def opt_sbin = opt_prefix/"sbin"

#opt_sharePathname

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

Returns:



1276
# File 'formula.rb', line 1276

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)


676
# File 'formula.rb', line 676

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)


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

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)


782
# File 'formula.rb', line 782

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)


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

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:



1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
# File 'formula.rb', line 1619

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

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

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

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

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

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

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

#patchvoid

This method is part of a private API. This method may only be 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.



1521
1522
1523
1524
1525
1526
# File 'formula.rb', line 1521

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)


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

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)


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

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)


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

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

#pinned?(*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)


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

def pinned?(*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)


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

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:



543
# File 'formula.rb', line 543

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:



1107
# File 'formula.rb', line 1107

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:



1055
# File 'formula.rb', line 1055

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:



1201
# File 'formula.rb', line 1201

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:



1737
1738
1739
# File 'formula.rb', line 1737

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.



1309
# File 'formula.rb', line 1309

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)


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

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

#pour_bottle?Boolean

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

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

Returns:

  • (Boolean)


1303
# File 'formula.rb', line 1303

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)


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

def pour_bottle_check_unsatisfied_reason(*args, &block); end

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

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

Parameters:

Returns:



763
764
765
766
767
768
769
770
771
772
# File 'formula.rb', line 763

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)


786
787
788
789
790
# File 'formula.rb', line 786

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

  linked_keg.resolved_path == versioned_prefix(version)
end

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

This method returns an undefined value.

Parameters:



2324
2325
2326
2327
2328
2329
# File 'formula.rb', line 2324

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

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

#pwsh_completionPathname

This method is part of a private API. This method may only be 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 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:



1167
# File 'formula.rb', line 1167

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:



803
# File 'formula.rb', line 803

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:



2350
2351
2352
2353
# File 'formula.rb', line 2350

def recursive_dependencies(&block)
  cache_key = "Formula#recursive_dependencies" unless block
  Dependency.expand(self, cache_key:, &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:



2359
2360
2361
2362
# File 'formula.rb', line 2359

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

#require_universal_deps?Boolean

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

Returns:

  • (Boolean)


1518
# File 'formula.rb', line 1518

def require_universal_deps? = false

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


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

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:



605
606
607
608
609
610
611
# File 'formula.rb', line 605

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)


643
# File 'formula.rb', line 643

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:



1935
1936
1937
1938
1939
1940
1941
# File 'formula.rb', line 1935

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:



2470
2471
2472
# File 'formula.rb', line 2470

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:



2465
2466
2467
# File 'formula.rb', line 2465

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.



1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
# File 'formula.rb', line 1327

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

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

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

#run_test(keep_tmp: false) ⇒ 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:

  • keep_tmp (Boolean) (defaults to: false)

Returns:

  • (T.untyped)


2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
# File 'formula.rb', line 2818

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_PATH: nil,
  }.merge(common_stage_test_env)
  test_env[:_JAVA_OPTIONS] += " -Djava.io.tmpdir=#{HOMEBREW_TEMP}"

  ENV.clear_sensitive_environment!
  Utils::Git.set_name_email!

  mktemp("#{name}-test") do |staging|
    staging.retain! if keep_tmp
    @testpath = T.let(staging.tmpdir, T.nilable(Pathname))
    test_env[:HOME] = @testpath
    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:



2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
# File 'formula.rb', line 2397

def runtime_dependencies(read_from_tab: true, undeclared: true)
  deps = if read_from_tab && undeclared &&
            (tab_deps = any_installed_keg&.runtime_dependencies)
    tab_deps.filter_map do |d|
      full_name = d["full_name"]
      next unless full_name

      Dependency.new full_name
    end
  end
  begin
    deps ||= declared_runtime_dependencies unless undeclared
    deps ||= (declared_runtime_dependencies | undeclared_runtime_dependencies)
  rescue FormulaUnavailableError
    onoe "Could not get runtime dependencies from #{path}!"
    deps ||= []
  end
  deps
end

#runtime_formula_dependencies(read_from_tab: true, undeclared: true) ⇒ 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:



2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
# File 'formula.rb', line 2419

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:



2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
# File 'formula.rb', line 2434

def runtime_installed_formula_dependents
  # `any_installed_keg` and `runtime_dependencies` `select`s ensure
  # that we don't end up with something `Formula#runtime_dependencies` can't
  # read from a `Tab`.
  Formula.cache[:runtime_installed_formula_dependents] ||= {}
  Formula.cache[:runtime_installed_formula_dependents][full_name] ||= Formula.installed
                                                                             .select(&:any_installed_keg)
                                                                             .select(&:runtime_dependencies)
                                                                             .select do |f|
    f.runtime_formula_dependencies.any? do |dep|
      full_name == dep.full_name
    rescue
      name == dep.name
    end
  end
end

#sbinPathname

The directory where the formula's sbin binaries should be installed. This is symlinked into HOMEBREW_PREFIX after installation or with brew link for formulae that are not keg-only. Generally we try to migrate these to #bin instead.

Returns:



1004
# File 'formula.rb', line 1004

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)


1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
# File 'formula.rb', line 1529

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



2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
# File 'formula.rb', line 2679

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

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

The service specification of the software.

Returns:



1221
1222
1223
# File 'formula.rb', line 1221

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:



501
# File 'formula.rb', line 501

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:



1205
# File 'formula.rb', line 1205

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:



1038
# File 'formula.rb', line 1038

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:

  • name (String)
  • version (String, Integer, nil) (defaults to: nil)

Returns:



1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
# File 'formula.rb', line 1909

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:



1401
1402
1403
1404
1405
1406
# File 'formula.rb', line 1401

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)


1515
# File 'formula.rb', line 1515

def skip_cxxstdlib_check? = false

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



390
391
392
# File 'formula.rb', line 390

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:



377
378
379
380
381
382
383
384
385
386
# File 'formula.rb', line 377

def specified_path
  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)


414
415
416
# File 'formula.rb', line 414

def stable?
  active_spec == stable
end

#std_cabal_v2_argsArray<String>

Standard parameters for cabal-v2 builds.

Returns:



1754
1755
1756
1757
1758
1759
1760
1761
1762
# File 'formula.rb', line 1754

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: ".") ⇒ Array<String>

Standard parameters for cargo builds.

Parameters:

Returns:



1770
1771
1772
# File 'formula.rb', line 1770

def std_cargo_args(root: prefix, path: ".")
  ["--jobs", ENV.make_jobs.to_s, "--locked", "--root=#{root}", "--path=#{path}"]
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:



1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
# File 'formula.rb', line 1788

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:



1810
1811
1812
1813
# File 'formula.rb', line 1810

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:



1826
1827
1828
1829
1830
1831
1832
# File 'formula.rb', line 1826

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:



1838
1839
1840
# File 'formula.rb', line 1838

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

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

Standard parameters for npm builds.

Parameters:

Returns:



1846
1847
1848
1849
1850
1851
1852
# File 'formula.rb', line 1846

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

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

  Language::Node.local_npm_install_args
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:



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

def std_pip_args(prefix: self.prefix, build_isolation: false)
  args = ["--verbose", "--no-deps", "--no-binary=:all:", "--ignore-installed", "--no-compile"]
  args << "--prefix=#{prefix}" if prefix
  args << "--no-build-isolation" unless build_isolation
  args
end

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


1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
# File 'formula.rb', line 1878

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)


1676
# File 'formula.rb', line 1676

def supersedes_an_installed_formula? = old_installed_formulae.any?

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


580
581
582
583
584
# File 'formula.rb', line 580

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:



3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
# File 'formula.rb', line 3016

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
  logfn = format("#{logs}/#{active_log_prefix}%02<exec_count>d.%<cmd_base>s",
                 exec_count: @exec_count,
                 cmd_base:   File.basename(cmd).split.first)
  logs.mkpath

  File.open(logfn, "w") do |log|
    log.puts Time.now, "", cmd, args, ""
    log.flush

    if verbose?
      rd, wr = IO.pipe
      begin
        pid = fork do
          rd.close
          log.close
          exec_cmd(cmd, args, wr, logfn)
        end
        wr.close

        if verbose_using_dots
          last_dot = Time.at(0)
          while (buf = rd.gets)
            log.puts buf
            # make sure dots printed with interval of at least 1 min.
            next if (Time.now - last_dot) <= 60

            print "."
            $stdout.flush
            last_dot = Time.now
          end
          puts
        else
          while (buf = rd.gets)
            log.puts buf
            puts buf
          end
        end
      ensure
        rd.close
      end
    else
      pid = fork do
        exec_cmd(cmd, args, log, logfn)
      end
    end

    Process.wait(pid)

    $stdout.flush

    unless $CHILD_STATUS.success?
      log_lines = Homebrew::EnvConfig.fail_log_lines

      log.flush
      if !verbose? || verbose_using_dots
        puts "Last #{log_lines} lines from #{logfn}:"
        Kernel.system "/usr/bin/tail", "-n", log_lines.to_s, logfn
      end
      log.puts

      require "system_config"
      require "build_environment"

      env = ENV.to_hash

      SystemConfig.dump_verbose_config(log)
      log.puts
      BuildEnvironment.dump env, log

      raise BuildError.new(self, cmd, args, env)
    end
  end
end

#systemd_service_pathPathname

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

The generated systemd service file path.

Returns:



1213
# File 'formula.rb', line 1213

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:



1217
# File 'formula.rb', line 1217

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

#tap?Boolean

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

True if this formula is provided by external Tap

Returns:

  • (Boolean)


2310
2311
2312
2313
2314
# File 'formula.rb', line 2310

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:



2332
2333
2334
2335
2336
# File 'formula.rb', line 2332

def tap_git_head
  tap&.git_head
rescue TapUnavailableError
  nil
end

#testBoolean?

This method is part of a private API. This method may only be 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)


2862
# File 'formula.rb', line 2862

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)


2857
2858
2859
# File 'formula.rb', line 2857

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:



2865
2866
2867
# File 'formula.rb', line 2865

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:



1953
1954
1955
1956
1957
1958
1959
# File 'formula.rb', line 1953

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:



2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
# File 'formula.rb', line 2491

def to_hash
  hsh = {
    "name"                            => name,
    "full_name"                       => full_name,
    "tap"                             => tap&.name,
    "oldnames"                        => oldnames,
    "aliases"                         => aliases.sort,
    "versioned_formulae"              => versioned_formulae.map(&:name),
    "desc"                            => desc,
    "license"                         => SPDX.license_expression_to_string(license),
    "homepage"                        => homepage,
    "versions"                        => {
      "stable" => stable&.version&.to_s,
      "head"   => head&.version&.to_s,
      "bottle" => bottle_defined?,
    },
    "urls"                            => urls_hash,
    "revision"                        => revision,
    "version_scheme"                  => version_scheme,
    "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,
    "disabled"                        => disabled?,
    "disable_date"                    => disable_date,
    "disable_reason"                  => disable_reason,
    "disable_replacement_formula"     => disable_replacement_formula,
    "disable_replacement_cask"        => disable_replacement_cask,
    "post_install_defined"            => post_install_defined?,
    "service"                         => (service.to_hash if service?),
    "tap_git_head"                    => tap_git_head,
    "ruby_source_path"                => ruby_source_path,
    "ruby_source_checksum"            => {},
  }

  hsh["bottle"]["stable"] = bottle_hash if stable && bottle_defined?

  hsh["options"] = options.map do |opt|
    { "option" => opt.flag, "description" => opt.description }
  end

  hsh.merge!(dependencies_hash)

  hsh["installed"] = installed_kegs.sort_by(&:scheme_and_version).map do |keg|
    tab = keg.tab
    {
      "version"                 => keg.version.to_s,
      "used_options"            => tab.used_options.as_flags,
      "built_as_bottle"         => tab.built_as_bottle,
      "poured_from_bottle"      => tab.poured_from_bottle,
      "time"                    => tab.time,
      "runtime_dependencies"    => tab.runtime_dependencies,
      "installed_as_dependency" => tab.installed_as_dependency,
      "installed_on_request"    => tab.installed_on_request,
    }
  end

  if (source_checksum = ruby_source_checksum)
    hsh["ruby_source_checksum"] = {
      "sha256" => source_checksum.hexdigest,
    }
  end

  hsh
end

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



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

def to_hash_with_variations
  hash = to_hash

  # Take from API, merging in local install status.
  if loaded_from_api? && !Homebrew::EnvConfig.no_install_from_api?
    json_formula = Homebrew::API::Formula.all_formulae.fetch(name).dup
    return json_formula.merge(
      hash.slice("name", "installed", "linked_keg", "pinned", "outdated"),
    )
  end

  variations = {}

  if path.exist? && on_system_blocks_exist?
    formula_contents = path.read
    OnSystem::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:



1597
1598
1599
1600
# File 'formula.rb', line 1597

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)


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

def unpin(*args, &block); end

#update_head_versionvoid

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

This method returns an undefined value.



523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
# File 'formula.rb', line 523

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

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



2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
# File 'formula.rb', line 2653

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)


2319
2320
2321
# File 'formula.rb', line 2319

def valid_platform?
  requirements.none?(MacOSRequirement) && requirements.none?(LinuxRequirement)
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:



1115
# File 'formula.rb', line 1115

def var = HOMEBREW_PREFIX/"var"

#verify_download_integrity(filename) ⇒ 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:



2812
2813
2814
2815
# File 'formula.rb', line 2812

def verify_download_integrity(filename)
  odisabled "Formula#verify_download_integrity", "Resource#verify_download_integrity on Formula#resource"
  active_spec.verify_download_integrity(filename)
end

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



508
# File 'formula.rb', line 508

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)


547
# File 'formula.rb', line 547

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:



570
571
572
573
574
575
576
# File 'formula.rb', line 570

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:



551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
# File 'formula.rb', line 551

def versioned_formulae_names
  versioned_names = if tap
    name_prefix = name.gsub(/(@[\d.]+)?$/, "")
    T.must(tap).prefix_to_versioned_formulae_names.fetch(name_prefix, [])
  elsif path.exist?
    Pathname.glob(path.to_s.gsub(/(@[\d.]+)?\.rb$/, "@*.rb"))
            .map { |path| path.basename(".rb").to_s }
            .sort
  else
    raise "Either tap or path is required to list versioned formulae"
  end

  versioned_names.reject do |versioned_name|
    versioned_name == name
  end
end

#with_logging(log_type, &_block) ⇒ 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 a block with the given log type in effect for its duration.

Parameters:

  • log_type (String)
  • _block (T.proc.void)


1191
1192
1193
1194
1195
1196
1197
# File 'formula.rb', line 1191

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:



3195
3196
3197
3198
3199
3200
3201
3202
3203
# File 'formula.rb', line 3195

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:



1151
# File 'formula.rb', line 1151

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:



1124
# File 'formula.rb', line 1124

def zsh_function = share/"zsh/site-functions"