Class: Formula Abstract

Inherits:
Object
  • Object
show all
Extended by:
BuildEnvironment::DSL, Enumerable, Forwardable
Includes:
FileUtils, Utils::Inreplace, Utils::Shell
Defined in:
Library/Homebrew/formula.rb

Overview

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! <pre>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</pre>

Constant Summary

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

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

Methods included from Utils::Inreplace

inreplace

Methods included from FileUtils

#make, mkdir, mktemp, #old_mkdir, #old_ruby, #ruby, #scons, #xcodebuild

Constructor Details

#initialize(name, path, spec, alias_path: nil) ⇒ Formula

Returns a new instance of Formula



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'Library/Homebrew/formula.rb', line 171

def initialize(name, path, spec, alias_path: nil)
  @name = name
  @path = path
  @alias_path = alias_path
  @alias_name = File.basename(alias_path) if alias_path
  @revision = self.class.revision || 0
  @version_scheme = self.class.version_scheme || 0

  @tap = if path == Formulary.core_path(name)
    CoreTap.instance
  elsif match = path.to_s.match(HOMEBREW_TAP_PATH_REGEX)
    Tap.fetch(match[:user], match[:repo])
  end

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

  spec_eval :stable
  spec_eval :devel
  spec_eval :head

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

Class Attribute Details

.bottle(*args, &block) ⇒ Object

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. docs.brew.sh/Bottles.html You can ignore this block entirely if submitting to Homebrew/homebrew-core. It'll be handled for you by the Brew Test Bot.

<pre>bottle do

root_url "https://example.com" # Optional root to calculate bottle URLs
prefix "/opt/homebrew" # Optional HOMEBREW_PREFIX in which the bottles were built.
cellar "/opt/homebrew/Cellar" # Optional HOMEBREW_CELLAR in which the bottles were built.
rebuild 1 # Making the old bottle outdated without bumping the version/revision of the formula.
sha256 "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" => :el_capitan
sha256 "53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3" => :yosemite
sha256 "1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2" => :mavericks

end</pre>

Only formulae where the upstream URL breaks or moves frequently, require compile or have a reasonable amount of patches/resources should be bottled. Formulae which do not meet the above requirements should not be bottled.

Formulae which should not be bottled & can be installed without any compile required should be tagged with: <pre>bottle :unneeded</pre>

Otherwise formulae which do not meet the above requirements and should not be bottled should be tagged with: <pre>bottle :disable, “reasons”</pre>



2085
2086
2087
# File 'Library/Homebrew/formula.rb', line 2085

def bottle(*args, &block)
  stable.bottle(*args, &block)
end

.deprecated_option(hash) ⇒ Object

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`). <pre>deprecated_option “enable-debug” => “with-debug”</pre>



2236
2237
2238
# File 'Library/Homebrew/formula.rb', line 2236

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

.desc=(value) ⇒ Object (writeonly)

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

<pre>desc “Example formula”</pre>



1947
# File 'Library/Homebrew/formula.rb', line 1947

attr_rw :desc

.devel(&block) ⇒ Object

Adds a devel SoftwareSpec. This can be installed by passing the `–devel` option to allow installing non-stable (e.g. beta) versions of software.

<pre>devel do

url "https://example.com/archive-2.0-beta.tar.gz"
sha256 "2a2ba417eebaadcb4418ee7b12fe2998f26d6e6f7fda7983412ff66a741ab6f7"

depends_on "cairo"
depends_on "pixman"

end</pre>



2124
2125
2126
2127
2128
# File 'Library/Homebrew/formula.rb', line 2124

def devel(&block)
  @devel ||= SoftwareSpec.new
  return @devel unless block_given?
  @devel.instance_eval(&block)
end

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

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. <pre>head “we.prefer.https.over.git.example.com/.git”> <pre>head “example.com/.git”, :branch => “name_of_branch”, :revision => “abc123”</pre> or (if autodetect fails): <pre>head “hg.is.awesome.but.git.has.won.example.com/”, :using => :hg</pre>



2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
# File 'Library/Homebrew/formula.rb', line 2142

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

.homepage=(value) ⇒ Object (writeonly)

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

<pre>homepage “www.example.com”>



1956
# File 'Library/Homebrew/formula.rb', line 1956

attr_rw :homepage

.mirror(val) ⇒ Object

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.

<pre>mirror “in.case.the.host.is.down.example.com” mirror “in.case.the.mirror.is.down.example.com>



2037
2038
2039
# File 'Library/Homebrew/formula.rb', line 2037

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

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

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

<pre>option “with-spam”, “The description goes here without a dot at the end”</pre> <pre>option “with-qt”, “Text here overwrites the autogenerated one from 'depends_on ”qt“ => :optional'”</pre> <pre>option :universal</pre>



2227
2228
2229
# File 'Library/Homebrew/formula.rb', line 2227

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

.plist_manualObject (readonly)

The `:manual` attribute set by plist_options.



1964
1965
1966
# File 'Library/Homebrew/formula.rb', line 1964

def plist_manual
  @plist_manual
end

.plist_startupObject (readonly)

The `:startup` attribute set by plist_options.



1960
1961
1962
# File 'Library/Homebrew/formula.rb', line 1960

def plist_startup
  @plist_startup
end

.pour_bottle_check_unsatisfied_reasonObject

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



1969
1970
1971
# File 'Library/Homebrew/formula.rb', line 1969

def pour_bottle_check_unsatisfied_reason
  @pour_bottle_check_unsatisfied_reason
end

.revision=(value) ⇒ Object (writeonly)

Used for creating new Homebrew versions of software without new upstream versions. For example, if we bump the major version of a library 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.

<pre>revision 1</pre>



1979
# File 'Library/Homebrew/formula.rb', line 1979

attr_rw :revision

.sha256=(value) ⇒ Object (writeonly)

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.

<pre>sha256 “2a2ba417eebaadcb4418ee7b12fe2998f26d6e6f7fda7983412ff66a741ab6f7”</pre>



2049
2050
2051
# File 'Library/Homebrew/formula.rb', line 2049

Checksum::TYPES.each do |type|
  define_method(type) { |val| stable.send(type, val) }
end

.stable(&block) ⇒ Object

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

<pre>stable do

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

depends_on "libxml2"
depends_on "libffi"

end</pre>



2106
2107
2108
2109
2110
# File 'Library/Homebrew/formula.rb', line 2106

def stable(&block)
  @stable ||= SoftwareSpec.new
  return @stable unless block_given?
  @stable.instance_eval(&block)
end

.url(val, specs = {}) ⇒ Object

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

`:git`, `:hg`, `:svn`, `:bzr`, `:cvs`,
`:curl` (normal file download. Will also extract.)
`:nounzip` (without extracting)
`:post` (download via an HTTP POST)
`S3DownloadStrategy` (download from S3 using signed request)

<pre>url “packed.sources.and.we.prefer.https.example.com/archive-1.2.3.tar.bz2”> <pre>url “some.dont.provide.archives.example.com”,

:using => :git,
:tag => "1.2.3",
:revision => "db8e4de5b2d6653f66aea53094624468caad15d2"</pre>


2014
2015
2016
# File 'Library/Homebrew/formula.rb', line 2014

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

.version(val = nil) ⇒ Object

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.

<pre>version “1.2-final”</pre>



2024
2025
2026
# File 'Library/Homebrew/formula.rb', line 2024

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

.version_scheme=(value) ⇒ Object (writeonly)

Used for creating new Homebrew versions 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.

<pre>version_scheme 1</pre>



1991
# File 'Library/Homebrew/formula.rb', line 1991

attr_rw :version_scheme

Instance Attribute Details

#active_log_typeObject (readonly)

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



154
155
156
# File 'Library/Homebrew/formula.rb', line 154

def active_log_type
  @active_log_type
end

#active_spec=(spec_sym) ⇒ Object



208
209
210
211
212
213
214
215
# File 'Library/Homebrew/formula.rb', line 208

def active_spec=(spec_sym)
  spec = send(spec_sym)
  raise FormulaSpecificationError, "#{spec_sym} spec is not available for #{full_name}" unless spec
  @active_spec = spec
  @active_spec_sym = spec_sym
  validate_attributes!
  @build = active_spec.build
end

#active_spec_symObject (readonly)

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

See Also:

  • #active_spec


124
125
126
# File 'Library/Homebrew/formula.rb', line 124

def active_spec_sym
  @active_spec_sym
end

#alias_nameObject (readonly)

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



72
73
74
# File 'Library/Homebrew/formula.rb', line 72

def alias_name
  @alias_name
end

#alias_pathObject (readonly)

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`



68
69
70
# File 'Library/Homebrew/formula.rb', line 68

def alias_path
  @alias_path
end

#buildBuildOptions

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



161
162
163
# File 'Library/Homebrew/formula.rb', line 161

def build
  @build
end

#buildpathObject (readonly)

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



140
141
142
# File 'Library/Homebrew/formula.rb', line 140

def buildpath
  @buildpath
end

#develObject (readonly)

The development SoftwareSpec for this Formula. Installed when using `brew install –devel` `nil` if there is no development version.

See Also:



104
105
106
# File 'Library/Homebrew/formula.rb', line 104

def devel
  @devel
end

#follow_installed_aliasBoolean Also known as: follow_installed_alias?

A Boolean indicating 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)


167
168
169
# File 'Library/Homebrew/formula.rb', line 167

def follow_installed_alias
  @follow_installed_alias
end

#full_alias_nameObject (readonly)

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



82
83
84
# File 'Library/Homebrew/formula.rb', line 82

def full_alias_name
  @full_alias_name
end

#full_nameObject (readonly)

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



77
78
79
# File 'Library/Homebrew/formula.rb', line 77

def full_name
  @full_name
end

#headObject (readonly)

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

See Also:



113
114
115
# File 'Library/Homebrew/formula.rb', line 113

def head
  @head
end

#local_bottle_pathObject

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



149
150
151
# File 'Library/Homebrew/formula.rb', line 149

def local_bottle_path
  @local_bottle_path
end

#nameObject (readonly)

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



64
65
66
# File 'Library/Homebrew/formula.rb', line 64

def name
  @name
end

#pathObject (readonly)

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



86
87
88
# File 'Library/Homebrew/formula.rb', line 86

def path
  @path
end

#revisionObject (readonly)

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

See Also:



133
134
135
# File 'Library/Homebrew/formula.rb', line 133

def revision
  @revision
end

#source_modified_timeObject (readonly)

most recent modified time for source files



128
129
130
# File 'Library/Homebrew/formula.rb', line 128

def source_modified_time
  @source_modified_time
end

#stableObject (readonly)

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



97
98
99
# File 'Library/Homebrew/formula.rb', line 97

def stable
  @stable
end

#tapObject (readonly)

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



91
92
93
# File 'Library/Homebrew/formula.rb', line 91

def tap
  @tap
end

#testpathObject (readonly)

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



144
145
146
# File 'Library/Homebrew/formula.rb', line 144

def testpath
  @testpath
end

#version_schemeObject (readonly)

Used to change version schemes for packages



136
137
138
# File 'Library/Homebrew/formula.rb', line 136

def version_scheme
  @version_scheme
end

Class Method Details

.[](name) ⇒ Object



1440
1441
1442
# File 'Library/Homebrew/formula.rb', line 1440

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

.alias_full_namesObject

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



1424
1425
1426
# File 'Library/Homebrew/formula.rb', line 1424

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

.aliasesObject

an array of all aliases



1418
1419
1420
# File 'Library/Homebrew/formula.rb', line 1418

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

.buildObject



2090
2091
2092
# File 'Library/Homebrew/formula.rb', line 2090

def build
  stable.build
end

.clear_installed_formulae_cacheObject

Clear caches of .racks and .installed.



1364
1365
1366
1367
# File 'Library/Homebrew/formula.rb', line 1364

def self.clear_installed_formulae_cache
  clear_racks_cache
  @installed = nil
end

.clear_racks_cacheObject

Clear cache of .racks



1359
1360
1361
# File 'Library/Homebrew/formula.rb', line 1359

def self.clear_racks_cache
  @racks = nil
end

.conflictsObject



2290
2291
2292
# File 'Library/Homebrew/formula.rb', line 2290

def conflicts
  @conflicts ||= []
end

.conflicts_with(*names) ⇒ Object

If this formula conflicts with another one. <pre>conflicts_with “imagemagick”, :because => “because both install 'convert' binaries”</pre>



2296
2297
2298
2299
# File 'Library/Homebrew/formula.rb', line 2296

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

.core_alias_filesObject

an array of all alias files of core Formula



1400
1401
1402
# File 'Library/Homebrew/formula.rb', line 1400

def self.core_alias_files
  CoreTap.instance.alias_files
end

.core_alias_reverse_tableObject

a table mapping core formula name to aliases



1436
1437
1438
# File 'Library/Homebrew/formula.rb', line 1436

def self.core_alias_reverse_table
  CoreTap.instance.alias_reverse_table
end

.core_alias_tableObject

a table mapping core alias to formula name



1430
1431
1432
# File 'Library/Homebrew/formula.rb', line 1430

def self.core_alias_table
  CoreTap.instance.alias_table
end

.core_aliasesObject

an array of all core aliases



1406
1407
1408
# File 'Library/Homebrew/formula.rb', line 1406

def self.core_aliases
  CoreTap.instance.aliases
end

.core_filesObject

an array of all core Formula files



1310
1311
1312
# File 'Library/Homebrew/formula.rb', line 1310

def self.core_files
  CoreTap.instance.formula_files
end

.core_namesObject

an array of all core Formula names



1304
1305
1306
# File 'Library/Homebrew/formula.rb', line 1304

def self.core_names
  CoreTap.instance.formula_names
end

.cxxstdlib_check(check_type) ⇒ Object

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



2325
2326
2327
# File 'Library/Homebrew/formula.rb', line 2325

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

.depends_on(dep) ⇒ Object

The dependencies for this formula. Use strings for the names of other formulae. Homebrew provides some :special dependencies for stuff that requires certain extra handling (often changing some ENV vars or deciding if to use the system provided version or not.) <pre># `:build` means this dep is only needed during build. depends_on “cmake” => :build</pre> <pre>depends_on “homebrew/dupes/tcl-tk” => :optional</pre> <pre># `:recommended` dependencies are built by default. # But a `–without-…` option is generated to opt-out. depends_on “readline” => :recommended</pre> <pre># `:optional` dependencies are NOT built by default. # But a `–with-…` options is generated. depends_on “glib” => :optional</pre> <pre># 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.</pre> <pre># Optional and enforce that boost is built with `–with-c++11`. depends_on “boost” => [:optional, “with-c++11”]</pre> <pre># If a dependency is only needed in certain cases: depends_on “sqlite” if MacOS.version == :leopard depends_on :xcode # If the formula really needs full Xcode. depends_on :macos => :lion # Needs at least OS X Lion (10.7). depends_on :arch => :intel # If this formula only builds on Intel architecture. depends_on :arch => :x86_64 # If this formula only builds on Intel x86 64-bit. depends_on :arch => :ppc # Only builds on PowerPC? depends_on :ld64 # Sometimes ld fails on `MacOS.version < :leopard`. Then use this. depends_on :x11 => :optional # X11/XQuartz components. depends_on :osxfuse # Permits the use of the upstream signed binary or our source package. depends_on :tuntap # Does the same thing as above. This is vital for Yosemite and above. <pre># It is possible to only depend on something if # `build.with?` or `build.without? “another_formula”`: depends_on “postgresql” if build.without? “sqlite”

<pre># Python 2.7: depends_on “python”</pre> <pre># Python 2.7 but use system Python where possible depends_on “python” if MacOS.version <= :snow_leopard</pre> <pre># Python 3.x if the `–with-python3` is given to `brew install example` depends_on “python3” => :optional</pre>



2210
2211
2212
# File 'Library/Homebrew/formula.rb', line 2210

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

.eachObject



1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
# File 'Library/Homebrew/formula.rb', line 1345

def self.each
  files.each do |file|
    begin
      yield Formulary.factory(file)
    rescue StandardError => e
      # Don't let one broken formula break commands. But do complain.
      onoe "Failed to import: #{file}"
      puts e
      next
    end
  end
end

.fails_with(compiler, &block) ⇒ Object

Marks the Formula as failing with a particular compiler so it will fall back to others. For Apple compilers, this should be in the format: <pre>fails_with :clang do

build 600
cause "multiple configure and compile errors"

end</pre>

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

`major_version` should be the major release number only, for instance '4.8' for the GCC 4.8 series (4.8.0, 4.8.1, etc.). If `version` or the block is omitted, then the compiler will be blacklisted for all compilers in that series.

For example, if a bug is only triggered on GCC 4.8.1 but is not encountered on 4.8.2:

<pre>fails_with :gcc => '4.8' do

version '4.8.1'

end</pre>



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

def fails_with(compiler, &block)
  odeprecated "fails_with :llvm" if compiler == :llvm
  specs.each { |spec| spec.fails_with(compiler, &block) }
end

.filesObject

an array of all Formula files



1334
1335
1336
# File 'Library/Homebrew/formula.rb', line 1334

def self.files
  @files ||= core_files + tap_files
end

.full_namesObject

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



1340
1341
1342
# File 'Library/Homebrew/formula.rb', line 1340

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

.go_resource(name, &block) ⇒ Object



2166
2167
2168
# File 'Library/Homebrew/formula.rb', line 2166

def go_resource(name, &block)
  specs.each { |spec| spec.go_resource(name, &block) }
end

.installedObject

An array of all installed Formula



1383
1384
1385
1386
1387
1388
1389
1390
1391
# File 'Library/Homebrew/formula.rb', line 1383

def self.installed
  @installed ||= racks.flat_map do |rack|
    begin
      Formulary.from_rack(rack)
    rescue FormulaUnavailableError, TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError
      []
    end
  end.uniq(&:name)
end

.installed_with_alias_path(alias_path) ⇒ Object



1393
1394
1395
1396
# File 'Library/Homebrew/formula.rb', line 1393

def self.installed_with_alias_path(alias_path)
  return [] if alias_path.nil?
  installed.select { |f| f.installed_alias_path == alias_path }
end

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

Software that will not be sym-linked into the `brew –prefix` will only live in its Cellar. Other formulae can depend on it and then brew will add the necessary includes and libs (etc.) during the brewing of that other formula. But generally, keg_only formulae are not in your PATH and not seen by compilers if you build your own software outside of Homebrew. This way, we don't shadow software provided by macOS. <pre>keg_only :provided_by_macos</pre> <pre>keg_only “because I want it so”</pre>



2320
2321
2322
# File 'Library/Homebrew/formula.rb', line 2320

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


2405
2406
2407
2408
# File 'Library/Homebrew/formula.rb', line 2405

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


2411
2412
2413
# File 'Library/Homebrew/formula.rb', line 2411

def link_overwrite_paths
  @link_overwrite_paths ||= Set.new
end

.method_added(method) ⇒ Object



1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
# File 'Library/Homebrew/formula.rb', line 1917

def method_added(method)
  case method
  when :brew
    raise "You cannot override Formula#brew in class #{name}"
  when :test
    define_method(:test_defined?) { true }
  when :options
    instance = allocate

    specs.each do |spec|
      instance.options.each do |opt, desc|
        spec.option(opt[/^--(.+)$/, 1], desc)
      end
    end

    remove_method(:options)
  end
end

.namesObject

an array of all Formula names



1328
1329
1330
# File 'Library/Homebrew/formula.rb', line 1328

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

.needs(*standards) ⇒ Object



2355
2356
2357
# File 'Library/Homebrew/formula.rb', line 2355

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

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

External patches can be declared using resource-style blocks. <pre>patch do

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

end</pre>

A strip level of `-p1` is assumed. It can be overridden using a symbol argument: <pre>patch :p0 do

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

end</pre>

Patches can be declared in stable, devel, and head blocks. This form is preferred over using conditionals. <pre>stable do

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

end</pre>

Embedded (`__END__`) patches are declared like so: <pre>patch :DATA patch :p0, :DATA</pre>

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. <pre>patch :p0, “…”</pre>



2270
2271
2272
# File 'Library/Homebrew/formula.rb', line 2270

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

.plist_options(options) ⇒ Object

Defines launchd plist handling.

Does your plist need to be loaded at startup? <pre>plist_options :startup => true</pre>

Or only when necessary or desired by the user? <pre>plist_options :manual => “foo”</pre>

Or perhaps you'd like to give the user a choice? Ooh fancy. <pre>plist_options :startup => true, :manual => “foo start”</pre>



2284
2285
2286
2287
# File 'Library/Homebrew/formula.rb', line 2284

def plist_options(options)
  @plist_startup = options[:startup]
  @plist_manual = options[:manual]
end

.pour_bottle?(&block) ⇒ Boolean

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

For example, if the bottle requires the Xcode CLT to be installed a Formula would declare: <pre>pour_bottle? do

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

end</pre>

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.

Returns:

  • (Boolean)


2399
2400
2401
2402
# File 'Library/Homebrew/formula.rb', line 2399

def pour_bottle?(&block)
  @pour_bottle_check = PourBottleCheck.new(self)
  @pour_bottle_check.instance_eval(&block)
end

.racksObject

An array of all racks currently installed.



1371
1372
1373
1374
1375
1376
1377
1378
1379
# File 'Library/Homebrew/formula.rb', line 1371

def self.racks
  @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) ⇒ Object

Additional downloads can be defined as resources and accessed in the install method. Resources can also be defined inside a stable, devel, or head block. This mechanism replaces ad-hoc “subformula” classes. <pre>resource “additional_files” do

url "https://example.com/additional-stuff.tar.gz"
sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"

end</pre>



2160
2161
2162
2163
2164
# File 'Library/Homebrew/formula.rb', line 2160

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

.skip_clean(*paths) ⇒ Object



2301
2302
2303
2304
2305
# File 'Library/Homebrew/formula.rb', line 2301

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

.skip_clean_pathsObject



2308
2309
2310
# File 'Library/Homebrew/formula.rb', line 2308

def skip_clean_paths
  @skip_clean_paths ||= Set.new
end

.specsObject

A list of the stable, devel and head SoftwareSpecs.



1995
1996
1997
# File 'Library/Homebrew/formula.rb', line 1995

def specs
  @specs ||= [stable, devel, head].freeze
end

.tap_aliasesObject

an array of all tap aliases



1412
1413
1414
# File 'Library/Homebrew/formula.rb', line 1412

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

.tap_filesObject

an array of all tap Formula files



1322
1323
1324
# File 'Library/Homebrew/formula.rb', line 1322

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

.tap_namesObject

an array of all tap Formula names



1316
1317
1318
# File 'Library/Homebrew/formula.rb', line 1316

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

.test(&block) ⇒ Boolean

Test (is required for new formula and makes us happy). The block will create, run in and delete a temporary directory.

We are fine if the executable does not error out, so we know linking and building the software was ok. <pre>system bin/“foobar”, “–version”</pre>

<pre>(testpath/“test.file”).write <<~EOS

writing some test file, if you need to

EOS assert_equal “OK”, shell_output(“test_command test.file”).strip</pre>

Need complete control over stdin, stdout? <pre>require “open3” Open3.popen3(“##bin/example”, “argument”) do |stdin, stdout, _|

stdin.write("some text")
stdin.close
assert_equal "result", stdout.read

end</pre>

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

Returns:

  • (Boolean)


2383
2384
2385
# File 'Library/Homebrew/formula.rb', line 2383

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

Instance Method Details

#<=>(other) ⇒ Object



1262
1263
1264
1265
# File 'Library/Homebrew/formula.rb', line 1262

def <=>(other)
  return unless other.is_a?(Formula)
  name <=> other.name
end

#==(other) ⇒ Object Also known as: eql?



1249
1250
1251
1252
1253
# File 'Library/Homebrew/formula.rb', line 1249

def ==(other)
  instance_of?(other.class) &&
    name == other.name &&
    active_spec == other.active_spec
end

#_outdated_kegs(options = {}) ⇒ Object



1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
# File 'Library/Homebrew/formula.rb', line 1144

def _outdated_kegs(options = {})
  all_kegs = []

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

    tab = Tab.for_keg(keg)
    next if version_scheme > tab.version_scheme
    next if version_scheme == tab.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?

    return [] # this keg is the current version of the formula, so it's not outdated
  end

  # Even if this formula hasn't been installed, there may be installations
  # of other formulae which used to be targets of the alias currently
  # targetting this formula. These should be counted as outdated versions.
  all_kegs.concat old_installed_formulae.flat_map(&:installed_kegs)

  head_version = latest_head_version
  if head_version && !head_version_outdated?(head_version, options)
    []
  else
    all_kegs.sort_by(&:version)
  end
end

#active_log_prefixObject

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



823
824
825
826
827
828
829
# File 'Library/Homebrew/formula.rb', line 823

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

#alias_changed?Boolean

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

Returns:

  • (Boolean)


1198
1199
1200
# File 'Library/Homebrew/formula.rb', line 1198

def alias_changed?
  installed_alias_target_changed? || supersedes_an_installed_formula?
end

#aliasesObject

All of aliases for the formula



385
386
387
388
389
390
391
392
393
# File 'Library/Homebrew/formula.rb', line 385

def aliases
  @aliases ||= if tap
    tap.alias_reverse_table[full_name].to_a.map do |a|
      a.split("/")[-1]
    end
  else
    []
  end
end

#any_version_installed?Boolean

If at least one version of Formula is installed.

Returns:

  • (Boolean)


440
441
442
443
# File 'Library/Homebrew/formula.rb', line 440

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

#bash_completionObject

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.



788
789
790
# File 'Library/Homebrew/formula.rb', line 788

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

#binObject

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.

Need to install into the #bin but the makefile doesn't mkdir -p prefix/bin? <pre>bin.mkpath</pre>

No `make install` available? <pre>bin.install “binary1”</pre>



571
572
573
# File 'Library/Homebrew/formula.rb', line 571

def bin
  prefix/"bin"
end

#bottleObject

The Bottle object for the currently active SoftwareSpec.



330
331
332
# File 'Library/Homebrew/formula.rb', line 330

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

#bottle_prefixObject

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.



812
813
814
# File 'Library/Homebrew/formula.rb', line 812

def bottle_prefix
  prefix/".bottle"
end

#brewObject

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



1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
# File 'Library/Homebrew/formula.rb', line 1088

def brew
  @prefix_returns_versioned_prefix = true
  stage do |staging|
    staging.retain! if ARGV.keep_tmp?
    prepare_patches

    begin
      yield self, staging
    rescue StandardError
      staging.retain! if ARGV.interactive? || ARGV.debug?
      raise
    ensure
      cp Dir["config.log", "CMakeCache.txt"], logs
    end
  end
ensure
  @prefix_returns_versioned_prefix = false
end

#caveatsString

Tell the user about any Homebrew-specific caveats or locations regarding this package. These should not contain setup instructions that would apply to installation through a different package manager on a different OS. <pre>def caveats

<<~EOS
  Are optional. Something the user should know?
EOS

end</pre>

<pre>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 < :mountain_lion
s

end</pre>

Returns:



1005
1006
1007
# File 'Library/Homebrew/formula.rb', line 1005

def caveats
  nil
end

#conflictsObject



1470
1471
1472
# File 'Library/Homebrew/formula.rb', line 1470

def conflicts
  self.class.conflicts
end

#core_formula?Boolean

True if this formula is provided by Homebrew itself

Returns:

  • (Boolean)


1446
1447
1448
# File 'Library/Homebrew/formula.rb', line 1446

def core_formula?
  tap&.core_tap?
end

#current_installed_alias_targetObject



1179
1180
1181
# File 'Library/Homebrew/formula.rb', line 1179

def current_installed_alias_target
  Formulary.factory(installed_alias_path) if installed_alias_path
end

#descObject

The description of the software.

See Also:



337
# File 'Library/Homebrew/formula.rb', line 337

delegate desc: :"self.class

#devel?Boolean

Is the currently active SoftwareSpec a #devel build?

Returns:

  • (Boolean)


309
310
311
# File 'Library/Homebrew/formula.rb', line 309

def devel?
  active_spec == devel
end

#docObject

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.



578
579
580
# File 'Library/Homebrew/formula.rb', line 578

def doc
  share/"doc"/name
end

#eligible_kegs_for_cleanupObject



1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
# File 'Library/Homebrew/formula.rb', line 1798

def eligible_kegs_for_cleanup
  eligible_for_cleanup = []
  if installed?
    eligible_kegs = if head? && (head_prefix = latest_head_prefix)
      installed_kegs - [Keg.new(head_prefix)]
    else
      installed_kegs.select do |keg|
        tab = Tab.for_keg(keg)
        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"
        elsif pinned? && keg == Keg.new(@pin.path.resolved_path)
          opoo "Skipping (old) #{keg} due to it being pinned"
        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"
  end
  eligible_for_cleanup
end

#elispObject

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

Install an Emacs mode included with a software package: <pre>elisp.install “contrib/emacs/example-mode.el”</pre>



732
733
734
# File 'Library/Homebrew/formula.rb', line 732

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

#envObject



1465
1466
1467
# File 'Library/Homebrew/formula.rb', line 1465

def env
  self.class.env
end

#etcObject

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 is persisted across upgrades.



757
758
759
# File 'Library/Homebrew/formula.rb', line 757

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

#fetchObject



1602
1603
1604
# File 'Library/Homebrew/formula.rb', line 1602

def fetch
  active_spec.fetch
end

#fish_completionObject

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.



804
805
806
# File 'Library/Homebrew/formula.rb', line 804

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

#fish_functionObject

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.



780
781
782
# File 'Library/Homebrew/formula.rb', line 780

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

#frameworksObject

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



740
741
742
# File 'Library/Homebrew/formula.rb', line 740

def frameworks
  prefix/"Frameworks"
end

#full_installed_alias_nameObject



272
273
274
# File 'Library/Homebrew/formula.rb', line 272

def full_installed_alias_name
  full_name_with_optional_tap(installed_alias_name)
end

#full_installed_specified_nameObject

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



297
298
299
# File 'Library/Homebrew/formula.rb', line 297

def full_installed_specified_name
  full_installed_alias_name || full_name
end

#full_specified_nameObject

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



287
288
289
# File 'Library/Homebrew/formula.rb', line 287

def full_specified_name
  full_alias_name || full_name
end

#hashObject



1257
1258
1259
# File 'Library/Homebrew/formula.rb', line 1257

def hash
  name.hash
end

#head?Boolean

Is the currently active SoftwareSpec a #head build?

Returns:

  • (Boolean)


315
316
317
# File 'Library/Homebrew/formula.rb', line 315

def head?
  active_spec == head
end

#head_version_outdated?(version, options = {}) ⇒ Boolean

Returns:

  • (Boolean)


468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
# File 'Library/Homebrew/formula.rb', line 468

def head_version_outdated?(version, options = {})
  tab = Tab.for_keg(prefix(version))

  return true if tab.version_scheme < version_scheme
  return true if stable && tab.stable_version && tab.stable_version < stable.version
  return true if devel && tab.devel_version && tab.devel_version < devel.version

  if options[:fetch_head]
    return false unless head&.downloader.is_a?(VCSDownloadStrategy)
    downloader = head.downloader
    downloader.shutup! unless ARGV.verbose?
    downloader.commit_outdated?(version.version.commit)
  else
    false
  end
end

#homepageObject

The homepage for the software.

See Also:



342
# File 'Library/Homebrew/formula.rb', line 342

delegate homepage: :"self.class

#includeObject

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.

No `make install` available? <pre>include.install “example.h”</pre>



588
589
590
# File 'Library/Homebrew/formula.rb', line 588

def include
  prefix/"include"
end

#infoObject

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.



595
596
597
# File 'Library/Homebrew/formula.rb', line 595

def info
  share/"info"
end

#inreplace(paths, before = nil, after = nil) ⇒ Object

Actually implemented in Utils::Inreplace.inreplace. 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 var defined by the formula. Only HOMEBREW_PREFIX is available in the embedded patch. inreplace supports regular expressions. <pre>inreplace “somefile.cfg”, /lookwhat?/, “replace by ##bin/tool”</pre>



# File 'Library/Homebrew/formula.rb', line 51

#inspectObject



1272
1273
1274
# File 'Library/Homebrew/formula.rb', line 1272

def inspect
  "#<Formula #{name} (#{active_spec_sym}) #{path}>"
end

#installObject

This method is overridden in Formula subclasses to provide the installation instructions. The sources (from url) are downloaded, hash-checked and Homebrew changes into a temporary directory where the archive was unpacked or repository cloned. <pre>def install

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

end</pre>



1670
# File 'Library/Homebrew/formula.rb', line 1670

def install; end

#installed?Boolean

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

Returns:

  • (Boolean)


434
435
436
# File 'Library/Homebrew/formula.rb', line 434

def installed?
  (dir = installed_prefix).directory? && !dir.children.empty?
end

#installed_alias_nameObject



268
269
270
# File 'Library/Homebrew/formula.rb', line 268

def installed_alias_name
  File.basename(installed_alias_path) if installed_alias_path
end

#installed_alias_pathObject

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.



261
262
263
264
265
266
# File 'Library/Homebrew/formula.rb', line 261

def installed_alias_path
  path = build.source["path"] if build.is_a?(Tab)
  return unless path =~ %r{#{HOMEBREW_TAP_DIR_REGEX}/Aliases}
  return unless File.symlink?(path)
  path
end

#installed_alias_target_changed?Boolean

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)


1185
1186
1187
1188
1189
# File 'Library/Homebrew/formula.rb', line 1185

def installed_alias_target_changed?
  target = current_installed_alias_target
  return false unless target
  target.name != name
end

#installed_kegsObject

All currently installed kegs.



558
559
560
# File 'Library/Homebrew/formula.rb', line 558

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

#installed_prefixObject

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



488
489
490
491
492
493
494
495
496
497
498
# File 'Library/Homebrew/formula.rb', line 488

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

#installed_prefixesObject

All currently installed prefix directories.



552
553
554
# File 'Library/Homebrew/formula.rb', line 552

def installed_prefixes
  rack.directory? ? rack.subdirs.sort : []
end

#installed_specified_nameObject

The name specified to install this formula.



292
293
294
# File 'Library/Homebrew/formula.rb', line 292

def installed_specified_name
  installed_alias_name || name
end

#installed_versionObject

The currently installed version for this formula. Will raise an exception if the formula is not installed.



503
504
505
# File 'Library/Homebrew/formula.rb', line 503

def installed_version
  Keg.new(installed_prefix).version
end

#keg_only?Boolean

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

Returns:

  • (Boolean)


1011
1012
1013
1014
# File 'Library/Homebrew/formula.rb', line 1011

def keg_only?
  return false unless keg_only_reason
  keg_only_reason.valid?
end

#keg_only_reasonObject



1017
1018
1019
# File 'Library/Homebrew/formula.rb', line 1017

def keg_only_reason
  self.class.keg_only_reason
end

#kext_prefixObject

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



748
749
750
# File 'Library/Homebrew/formula.rb', line 748

def kext_prefix
  prefix/"Library/Extensions"
end

#latest_formulaObject

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



1204
1205
1206
# File 'Library/Homebrew/formula.rb', line 1204

def latest_formula
  installed_alias_target_changed? ? current_installed_alias_target : self
end

#latest_head_prefixObject



463
464
465
466
# File 'Library/Homebrew/formula.rb', line 463

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

#latest_head_versionObject



452
453
454
455
456
457
458
459
460
461
# File 'Library/Homebrew/formula.rb', line 452

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

  head_versions.max_by do |pn_pkgversion|
    [Tab.for_keg(prefix(pn_pkgversion)).source_modified_time, pn_pkgversion.revision]
  end
end

#libObject

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.

No `make install` available? <pre>lib.install “example.dylib”</pre>



605
606
607
# File 'Library/Homebrew/formula.rb', line 605

def lib
  prefix/"lib"
end

#libexecObject

The directory where the formula's binaries should be installed. This is not symlinked into `HOMEBREW_PREFIX`. It is also 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.



614
615
616
# File 'Library/Homebrew/formula.rb', line 614

def libexec
  prefix/"libexec"
end

Sometimes we accidentally install files outside prefix. After we fix that, users will get nasty link conflict error. So we create a whitelist here to allow overwriting certain files. e.g.

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

Returns:

  • (Boolean)


1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
# File 'Library/Homebrew/formula.rb', line 1039

def link_overwrite?(path)
  # Don't overwrite files not created by Homebrew.
  return false unless path.stat.uid == HOMEBREW_BREW_FILE.stat.uid
  # Don't overwrite files belong to other keg except when that
  # keg's formula is deleted.
  begin
    keg = Keg.for(path)
  rescue NotAKegError, Errno::ENOENT # rubocop:disable Lint/HandleExceptions
    # file doesn't belong to any keg.
  else
    tab_tap = Tab.for_keg(keg).tap
    return false if tab_tap.nil? # this keg doesn't below to any core/tap formula, most likely coming from a DIY install.
    begin
      Formulary.factory(keg.name)
    rescue FormulaUnavailableError # rubocop:disable Lint/HandleExceptions
      # formula for this keg is deleted, so defer to whitelist
    rescue TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError
      return false # this keg belongs to another formula
    else
      return false # this keg belongs to another formula
    end
  end
  to_check = path.relative_path_from(HOMEBREW_PREFIX).to_s
  self.class.link_overwrite_paths.any? do |p|
    p == to_check ||
      to_check.start_with?(p.chomp("/") + "/") ||
      to_check =~ /^#{Regexp.escape(p).gsub('\*', ".*?")}$/
  end
end

#linked?Boolean

Is the formula linked?

Returns:

  • (Boolean)


522
523
524
# File 'Library/Homebrew/formula.rb', line 522

def linked?
  linked_keg.symlink?
end

#linked_kegObject

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



448
449
450
# File 'Library/Homebrew/formula.rb', line 448

def linked_keg
  HOMEBREW_LINKED_KEGS/name
end

#linked_versionObject

PkgVersion of the linked keg for the formula.



538
539
540
541
# File 'Library/Homebrew/formula.rb', line 538

def linked_version
  return unless linked?
  Keg.for(linked_keg).version
end

#lockObject



1108
1109
1110
1111
1112
1113
1114
1115
1116
# File 'Library/Homebrew/formula.rb', line 1108

def lock
  @lock = FormulaLock.new(name)
  @lock.lock
  return unless oldname
  return unless (oldname_rack = HOMEBREW_CELLAR/oldname).exist?
  return unless oldname_rack.resolved_path == rack
  @oldname_lock = FormulaLock.new(oldname)
  @oldname_lock.lock
end

#logsObject

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



818
819
820
# File 'Library/Homebrew/formula.rb', line 818

def logs
  HOMEBREW_LOGS + name
end

#manObject

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



623
624
625
# File 'Library/Homebrew/formula.rb', line 623

def man
  share/"man"
end

#man1Object

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.

No `make install` available? <pre>man1.install “example.1”</pre>



633
634
635
# File 'Library/Homebrew/formula.rb', line 633

def man1
  man/"man1"
end

#man2Object

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.



640
641
642
# File 'Library/Homebrew/formula.rb', line 640

def man2
  man/"man2"
end

#man3Object

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.

No `make install` available? <pre>man3.install “man.3”</pre>



650
651
652
# File 'Library/Homebrew/formula.rb', line 650

def man3
  man/"man3"
end

#man4Object

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.



657
658
659
# File 'Library/Homebrew/formula.rb', line 657

def man4
  man/"man4"
end

#man5Object

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.



664
665
666
# File 'Library/Homebrew/formula.rb', line 664

def man5
  man/"man5"
end

#man6Object

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.



671
672
673
# File 'Library/Homebrew/formula.rb', line 671

def man6
  man/"man6"
end

#man7Object

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.



678
679
680
# File 'Library/Homebrew/formula.rb', line 678

def man7
  man/"man7"
end

#man8Object

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.



685
686
687
# File 'Library/Homebrew/formula.rb', line 685

def man8
  man/"man8"
end

#migration_needed?Boolean

Returns:

  • (Boolean)


1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
# File 'Library/Homebrew/formula.rb', line 1124

def migration_needed?
  return false unless oldname
  return false if rack.exist?

  old_rack = HOMEBREW_CELLAR/oldname
  return false unless old_rack.directory?
  return false if old_rack.subdirs.empty?

  tap == Tab.for_keg(old_rack.subdirs.sort.first).tap
end

#missing_dependencies(hide: nil) ⇒ Object

Returns a list of formulae depended on by this formula that aren't installed



1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
# File 'Library/Homebrew/formula.rb', line 1498

def missing_dependencies(hide: nil)
  hide ||= []
  missing_dependencies = recursive_dependencies do |dependent, dep|
    if dep.build?
      Dependency.prune
    elsif dep.optional? || dep.recommended?
      tab = Tab.for_formula(dependent)
      Dependency.prune unless tab.with?(dep)
    end
  end

  missing_dependencies.map!(&:to_formula)
  missing_dependencies.select! do |d|
    hide.include?(d.name) || d.installed_prefixes.empty?
  end
  missing_dependencies
rescue FormulaUnavailableError
  []
end

#new_formula_available?Boolean

Returns:

  • (Boolean)


1175
1176
1177
# File 'Library/Homebrew/formula.rb', line 1175

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

#old_installed_formulaeObject



1208
1209
1210
1211
1212
1213
1214
# File 'Library/Homebrew/formula.rb', line 1208

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

#oldnameObject

An old name for the formula



377
378
379
380
381
382
# File 'Library/Homebrew/formula.rb', line 377

def oldname
  @oldname ||= if tap
    formula_renames = tap.formula_renames
    formula_renames.to_a.rassoc(name).first if formula_renames.value?(name)
  end
end

#opt_binObject



901
902
903
# File 'Library/Homebrew/formula.rb', line 901

def opt_bin
  opt_prefix/"bin"
end

#opt_elispObject



929
930
931
# File 'Library/Homebrew/formula.rb', line 929

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

#opt_frameworksObject



933
934
935
# File 'Library/Homebrew/formula.rb', line 933

def opt_frameworks
  opt_prefix/"Frameworks"
end

#opt_includeObject



905
906
907
# File 'Library/Homebrew/formula.rb', line 905

def opt_include
  opt_prefix/"include"
end

#opt_libObject



909
910
911
# File 'Library/Homebrew/formula.rb', line 909

def opt_lib
  opt_prefix/"lib"
end

#opt_libexecObject



913
914
915
# File 'Library/Homebrew/formula.rb', line 913

def opt_libexec
  opt_prefix/"libexec"
end

#opt_pkgshareObject



925
926
927
# File 'Library/Homebrew/formula.rb', line 925

def opt_pkgshare
  opt_prefix/"share"/name
end

#opt_prefixObject

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 prefered way to refer a formula in plists or from another formula, as the path is stable even when the software is updated. <pre>args << “–with-readline=#Formula</a>.opt_prefix” if build.with? “readline”</pre>



897
898
899
# File 'Library/Homebrew/formula.rb', line 897

def opt_prefix
  Pathname.new("#{HOMEBREW_PREFIX}/opt/#{name}")
end

#opt_sbinObject



917
918
919
# File 'Library/Homebrew/formula.rb', line 917

def opt_sbin
  opt_prefix/"sbin"
end

#opt_shareObject



921
922
923
# File 'Library/Homebrew/formula.rb', line 921

def opt_share
  opt_prefix/"share"
end

#optlinked?Boolean

Is the formula linked to opt?

Returns:

  • (Boolean)


527
528
529
# File 'Library/Homebrew/formula.rb', line 527

def optlinked?
  opt_prefix.symlink?
end

#outdated?(options = {}) ⇒ Boolean

Returns:

  • (Boolean)


1217
1218
1219
1220
1221
# File 'Library/Homebrew/formula.rb', line 1217

def outdated?(options = {})
  !outdated_kegs(options).empty?
rescue Migrator::MigrationNeededError
  true
end

#outdated_kegs(options = {}) ⇒ Object



1136
1137
1138
1139
1140
1141
1142
# File 'Library/Homebrew/formula.rb', line 1136

def outdated_kegs(options = {})
  @outdated_kegs ||= Hash.new do |cache, key|
    raise Migrator::MigrationNeededError, self if migration_needed?
    cache[key] = _outdated_kegs(key)
  end
  @outdated_kegs[options]
end

#patchObject



1079
1080
1081
1082
1083
# File 'Library/Homebrew/formula.rb', line 1079

def patch
  return if patchlist.empty?
  ohai "Patching"
  patchlist.each(&:apply)
end

#pinObject



1239
1240
1241
# File 'Library/Homebrew/formula.rb', line 1239

def pin
  @pin.pin
end

#pinnable?Boolean

Returns:

  • (Boolean)


1224
1225
1226
# File 'Library/Homebrew/formula.rb', line 1224

def pinnable?
  @pin.pinnable?
end

#pinned?Boolean

Returns:

  • (Boolean)


1229
1230
1231
# File 'Library/Homebrew/formula.rb', line 1229

def pinned?
  @pin.pinned?
end

#pinned_versionObject



1234
1235
1236
# File 'Library/Homebrew/formula.rb', line 1234

def pinned_version
  @pin.pinned_version
end

#pkg_versionObject

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



360
361
362
# File 'Library/Homebrew/formula.rb', line 360

def pkg_version
  PkgVersion.new(version, revision)
end

#pkgshareObject

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.

No `make install` available? <pre>pkgshare.install “examples”</pre>



723
724
725
# File 'Library/Homebrew/formula.rb', line 723

def pkgshare
  prefix/"share"/name
end

#plistObject

This method can be overridden to provide a plist. For more examples read Apple's handy manpage: developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/plist.5.html <pre>def plist; <<~EOS

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

end</pre>



866
867
868
# File 'Library/Homebrew/formula.rb', line 866

def plist
  nil
end

#plist_manualObject



881
882
883
# File 'Library/Homebrew/formula.rb', line 881

def plist_manual
  self.class.plist_manual
end

#plist_nameObject

The generated launchd #plist service name.



871
872
873
# File 'Library/Homebrew/formula.rb', line 871

def plist_name
  "homebrew.mxcl." + name
end

#plist_pathObject

The generated launchd #plist file path.



876
877
878
# File 'Library/Homebrew/formula.rb', line 876

def plist_path
  prefix + (plist_name + ".plist")
end

#plist_startupObject



886
887
888
# File 'Library/Homebrew/formula.rb', line 886

def plist_startup
  self.class.plist_startup
end

#post_installObject

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



953
# File 'Library/Homebrew/formula.rb', line 953

def post_install; end

#pour_bottle?Boolean

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)


943
944
945
# File 'Library/Homebrew/formula.rb', line 943

def pour_bottle?
  true
end

#pour_bottle_check_unsatisfied_reasonObject



948
949
950
# File 'Library/Homebrew/formula.rb', line 948

def pour_bottle_check_unsatisfied_reason
  self.class.pour_bottle_check_unsatisfied_reason
end

#prefix(v = pkg_version) ⇒ Object

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.



511
512
513
514
515
516
517
518
519
# File 'Library/Homebrew/formula.rb', line 511

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

#prefix_linked?(v = pkg_version) ⇒ Boolean

Is formula's linked keg points to the prefix.

Returns:

  • (Boolean)


532
533
534
535
# File 'Library/Homebrew/formula.rb', line 532

def prefix_linked?(v = pkg_version)
  return false unless linked?
  linked_keg.resolved_path == versioned_prefix(v)
end


1458
1459
1460
1461
1462
# File 'Library/Homebrew/formula.rb', line 1458

def print_tap_action(options = {})
  return unless tap?
  verb = options[:verb] || "Installing"
  ohai "#{verb} #{name} from #{tap}"
end

#rackObject

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



546
547
548
# File 'Library/Homebrew/formula.rb', line 546

def rack
  Pathname.new("#{HOMEBREW_CELLAR}/#{name}")
end

#recursive_dependencies(&block) ⇒ Object

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



1477
1478
1479
# File 'Library/Homebrew/formula.rb', line 1477

def recursive_dependencies(&block)
  Dependency.expand(self, &block)
end

#recursive_requirements(&block) ⇒ Object

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



1483
1484
1485
# File 'Library/Homebrew/formula.rb', line 1483

def recursive_requirements(&block)
  Requirement.expand(self, &block)
end

#require_universal_deps?Boolean

Returns:

  • (Boolean)


1074
1075
1076
# File 'Library/Homebrew/formula.rb', line 1074

def require_universal_deps?
  false
end

#resourceObject

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. <pre>resource(“additional_files”).stage { bin.install “my/extra/tool” }</pre>



374
# File 'Library/Homebrew/formula.rb', line 374

delegate resource: :active_spec

#resourcesObject

The Resources for the currently active SoftwareSpec.



397
# File 'Library/Homebrew/formula.rb', line 397

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

#run_post_installObject



956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
# File 'Library/Homebrew/formula.rb', line 956

def run_post_install
  @prefix_returns_versioned_prefix = true
  build = self.build
  self.build = Tab.for_formula(self)

  new_env = {
    "TMPDIR" => HOMEBREW_TEMP,
    "TEMP" => HOMEBREW_TEMP,
    "TMP" => HOMEBREW_TEMP,
    "HOMEBREW_PATH" => nil,
    "PATH" => ENV["HOMEBREW_PATH"],
  }

  with_env(new_env) do
    ENV.clear_sensitive_environment!

    Pathname.glob("#{bottle_prefix}/{etc,var}/**/*") do |path|
      path.extend(InstallRenamed)
      path.cp_path_sub(bottle_prefix, HOMEBREW_PREFIX)
    end

    with_logging("post_install") do
      post_install
    end
  end
ensure
  self.build = build
  @prefix_returns_versioned_prefix = false
end

#run_testObject



1612
1613
1614
1615
1616
1617
1618
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
# File 'Library/Homebrew/formula.rb', line 1612

def run_test
  @prefix_returns_versioned_prefix = true

  test_env = {
    CURL_HOME: ENV["CURL_HOME"] || ENV["HOME"],
    TMPDIR: HOMEBREW_TEMP,
    TEMP: HOMEBREW_TEMP,
    TMP: HOMEBREW_TEMP,
    TERM: "dumb",
    PATH: PATH.new(ENV["PATH"], HOMEBREW_PREFIX/"bin"),
    HOMEBREW_PATH: nil,
    _JAVA_OPTIONS: "#{ENV["_JAVA_OPTIONS"]} -Duser.home=#{HOMEBREW_CACHE}/java_cache",
  }

  ENV.clear_sensitive_environment!

  mktemp("#{name}-test") do |staging|
    staging.retain! if ARGV.keep_tmp?
    @testpath = staging.tmpdir
    test_env[:HOME] = @testpath
    setup_home @testpath
    begin
      with_logging("test") do
        with_env(test_env) do
          test
        end
      end
    rescue Exception # rubocop:disable Lint/RescueException
      staging.retain! if ARGV.debug?
      raise
    end
  end
ensure
  @testpath = nil
  @prefix_returns_versioned_prefix = false
end

#runtime_dependenciesObject

Returns a list of Dependency objects that are required at runtime.



1489
1490
1491
1492
1493
1494
# File 'Library/Homebrew/formula.rb', line 1489

def runtime_dependencies
  recursive_dependencies do |_, dependency|
    Dependency.prune if dependency.build?
    Dependency.prune if !dependency.required? && build.without?(dependency)
  end
end

#sbinObject

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.



693
694
695
# File 'Library/Homebrew/formula.rb', line 693

def sbin
  prefix/"sbin"
end

#shareObject

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.

Need a custom directory? <pre>(share/“concept”).mkpath</pre>

Installing something into another custom directory? <pre>(share/“concept2”).install “ducks.txt”</pre>

Install `./example_code/simple/ones` to share/demos <pre>(share/“demos”).install “example_code/simple/ones”</pre>

Install `./example_code/simple/ones` to share/demos/examples <pre>(share/“demos”).install “example_code/simple/ones” => “examples”</pre>



712
713
714
# File 'Library/Homebrew/formula.rb', line 712

def share
  prefix/"share"
end

#skip_clean?(path) ⇒ Boolean

sometimes the formula cleaner breaks things skip cleaning paths in a formula with a class method like this:

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

keep .la files with:

skip_clean :la

Returns:

  • (Boolean)


1027
1028
1029
1030
1031
# File 'Library/Homebrew/formula.rb', line 1027

def skip_clean?(path)
  return true if path.extname == ".la" && self.class.skip_clean_paths.include?(:la)
  to_check = path.relative_path_from(prefix).to_s
  self.class.skip_clean_paths.include? to_check
end

#skip_cxxstdlib_check?Boolean

Returns:

  • (Boolean)


1069
1070
1071
# File 'Library/Homebrew/formula.rb', line 1069

def skip_cxxstdlib_check?
  false
end

#specified_nameObject

The name specified to find this formula.



282
283
284
# File 'Library/Homebrew/formula.rb', line 282

def specified_name
  alias_name || name
end

#specified_pathObject

The path that was specified to find this formula.



277
278
279
# File 'Library/Homebrew/formula.rb', line 277

def specified_path
  alias_path || path
end

#stable?Boolean

Is the currently active SoftwareSpec a #stable build?

Returns:

  • (Boolean)


303
304
305
# File 'Library/Homebrew/formula.rb', line 303

def stable?
  active_spec == stable
end

#std_cmake_argsObject

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. Note: there isn't a std_autotools variant because autotools is a lot less consistent and the standard parameters are more memorable.



1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
# File 'Library/Homebrew/formula.rb', line 1282

def std_cmake_args
  args = %W[
    -DCMAKE_C_FLAGS_RELEASE=-DNDEBUG
    -DCMAKE_CXX_FLAGS_RELEASE=-DNDEBUG
    -DCMAKE_INSTALL_PREFIX=#{prefix}
    -DCMAKE_BUILD_TYPE=Release
    -DCMAKE_FIND_FRAMEWORK=LAST
    -DCMAKE_VERBOSE_MAKEFILE=ON
    -Wno-dev
  ]

  # Avoid false positives for clock_gettime support on 10.11.
  # CMake cache entries for other weak symbols may be added here as needed.
  if MacOS.version == "10.11" && MacOS::Xcode.installed? && MacOS::Xcode.version >= "8.0"
    args << "-DHAVE_CLOCK_GETTIME:INTERNAL=0"
  end

  args
end

#supersedes_an_installed_formula?Boolean

Is this formula the target of an alias used to install an old formula?

Returns:

  • (Boolean)


1192
1193
1194
# File 'Library/Homebrew/formula.rb', line 1192

def supersedes_an_installed_formula?
  old_installed_formulae.any?
end

#system(cmd, *args) ⇒ Object

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. <pre>system “./bootstrap.sh”, “–arg1”, “–prefix=##prefix”</pre>

For CMake we have some necessary defaults in #std_cmake_args: <pre>system “cmake”, “.”, *std_cmake_args</pre>

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 to: <pre>args = [“–with-option1”, “–with-option2”]

# Most software still uses `configure` and `make`. # Check with `./configure –help` 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”</pre>



1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
# File 'Library/Homebrew/formula.rb', line 1707

def system(cmd, *args)
  verbose = ARGV.verbose?
  verbose_using_dots = !ENV["HOMEBREW_VERBOSE_USING_DOTS"].nil?

  # 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
  if cmd == "./configure" && !verbose
    pretty_args.delete "--disable-dependency-tracking"
    pretty_args.delete "--disable-debug"
  end
  pretty_args.each_index do |i|
    if pretty_args[i].to_s.start_with? "import setuptools"
      pretty_args[i] = "import setuptools..."
    end
  end
  ohai "#{cmd} #{pretty_args * " "}".strip

  @exec_count ||= 0
  @exec_count += 1
  logfn = format("#{logs}/#{active_log_prefix}%02d.%s", @exec_count, 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 unless (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 { exec_cmd(cmd, args, log, logfn) }
    end

    Process.wait(pid)

    $stdout.flush

    unless $CHILD_STATUS.success?
      log_lines = ENV["HOMEBREW_FAIL_LOG_LINES"]
      log_lines ||= "15"

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

      require "system_config"
      require "build_environment"

      env = ENV.to_hash

      SystemConfig.dump_verbose_config(log)
      log.puts
      Homebrew.dump_build_env(env, log)

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

#tap?Boolean

True if this formula is provided by external Tap

Returns:

  • (Boolean)


1452
1453
1454
1455
# File 'Library/Homebrew/formula.rb', line 1452

def tap?
  return false unless tap
  !tap.core_tap?
end

#testObject



1655
# File 'Library/Homebrew/formula.rb', line 1655

def test; end

#test_defined?Boolean

Returns:

  • (Boolean)


1650
1651
1652
# File 'Library/Homebrew/formula.rb', line 1650

def test_defined?
  false
end

#test_fixtures(file) ⇒ Object



1658
1659
1660
# File 'Library/Homebrew/formula.rb', line 1658

def test_fixtures(file)
  HOMEBREW_LIBRARY_PATH/"test/support/fixtures"/file
end

#to_hashObject



1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
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
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
# File 'Library/Homebrew/formula.rb', line 1519

def to_hash
  hsh = {
    "name" => name,
    "full_name" => full_name,
    "desc" => desc,
    "homepage" => homepage,
    "oldname" => oldname,
    "aliases" => aliases,
    "versions" => {
      "stable" => stable&.version&.to_s,
      "bottle" => bottle ? true : false,
      "devel" => devel&.version&.to_s,
      "head" => head&.version&.to_s,
    },
    "revision" => revision,
    "version_scheme" => version_scheme,
    "installed" => [],
    "linked_keg" => (linked_version.to_s if linked_keg.exist?),
    "pinned" => pinned?,
    "outdated" => outdated?,
    "keg_only" => keg_only?,
    "dependencies" => deps.map(&:name).uniq,
    "recommended_dependencies" => deps.select(&:recommended?).map(&:name).uniq,
    "optional_dependencies" => deps.select(&:optional?).map(&:name).uniq,
    "build_dependencies" => deps.select(&:build?).map(&:name).uniq,
    "conflicts_with" => conflicts.map(&:name),
    "caveats" => caveats,
  }

  hsh["requirements"] = requirements.map do |req|
    {
      "name" => req.name,
      "cask" => req.cask,
      "download" => req.download,
    }
  end

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

  hsh["bottle"] = {}
  %w[stable devel].each do |spec_sym|
    next unless spec = send(spec_sym)
    next unless spec.bottle_defined?
    bottle_spec = spec.bottle_specification
    bottle_info = {
      "rebuild" => bottle_spec.rebuild,
      "cellar" => (cellar = bottle_spec.cellar).is_a?(Symbol) ? cellar.inspect : cellar,
      "prefix" => bottle_spec.prefix,
      "root_url" => bottle_spec.root_url,
    }
    bottle_info["files"] = {}
    bottle_spec.collector.keys.each do |os| # rubocop:disable Performance/HashEachMethods
      checksum = bottle_spec.collector[os]
      bottle_info["files"][os] = {
        "url" => "#{bottle_spec.root_url}/#{Bottle::Filename.create(self, os, bottle_spec.rebuild)}",
        checksum.hash_type.to_s => checksum.hexdigest,
      }
    end
    hsh["bottle"][spec_sym] = bottle_info
  end

  installed_kegs.each do |keg|
    tab = Tab.for_keg keg

    hsh["installed"] << {
      "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,
      "runtime_dependencies" => tab.runtime_dependencies,
      "installed_as_dependency" => tab.installed_as_dependency,
      "installed_on_request" => tab.installed_on_request,
    }
  end

  hsh["installed"] = hsh["installed"].sort_by { |i| Version.create(i["version"]) }

  hsh
end

#to_sObject



1267
1268
1269
# File 'Library/Homebrew/formula.rb', line 1267

def to_s
  name
end

#unlockObject



1119
1120
1121
1122
# File 'Library/Homebrew/formula.rb', line 1119

def unlock
  @lock&.unlock
  @oldname_lock&.unlock
end

#unpinObject



1244
1245
1246
# File 'Library/Homebrew/formula.rb', line 1244

def unpin
  @pin.unpin
end

#update_head_versionObject



351
352
353
354
355
356
357
# File 'Library/Homebrew/formula.rb', line 351

def update_head_version
  return unless head?
  return unless head.downloader.is_a?(VCSDownloadStrategy)
  return unless head.downloader.cached_location.exist?

  head.version.update_commit(head.downloader.last_commit)
end

#varObject

The directory where the formula's variable files should be installed. This directory is not inside the `HOMEBREW_CELLAR` so it is persisted across upgrades.



764
765
766
# File 'Library/Homebrew/formula.rb', line 764

def var
  HOMEBREW_PREFIX/"var"
end

#verify_download_integrity(fn) ⇒ Object



1607
1608
1609
# File 'Library/Homebrew/formula.rb', line 1607

def verify_download_integrity(fn)
  active_spec.verify_download_integrity(fn)
end

#versionObject

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.

See Also:



349
# File 'Library/Homebrew/formula.rb', line 349

delegate version: :active_spec

#versioned_formula?Boolean

If this is a `@`-versioned formula.

Returns:

  • (Boolean)


365
366
367
# File 'Library/Homebrew/formula.rb', line 365

def versioned_formula?
  name.include?("@")
end

#with_logging(log_type) ⇒ Object

Runs a block with the given log type in effect for its duration



832
833
834
835
836
837
838
# File 'Library/Homebrew/formula.rb', line 832

def with_logging(log_type)
  old_log_type = @active_log_type
  @active_log_type = log_type
  yield
ensure
  @active_log_type = old_log_type
end

#zsh_completionObject

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.



796
797
798
# File 'Library/Homebrew/formula.rb', line 796

def zsh_completion
  share/"zsh/site-functions"
end

#zsh_functionObject

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.



772
773
774
# File 'Library/Homebrew/formula.rb', line 772

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