Class: Formula Abstract Private
- Extended by:
- APIHashable, BuildEnvironment::DSL, Cacheable, Forwardable, OnSystem::MacOSAndLinux, T::Generic, T::Helpers, Utils::Output::Mixin
- Includes:
- Context, FileUtils, Homebrew::Livecheck::Constants, OS::Linux::Formula, OS::Mac::Formula, OnSystem::MacOSAndLinux, SystemCommand::Helpers, Utils::Output::Mixin, Utils::Path, 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.
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
Direct Known Subclasses
Defined Under Namespace
Classes: FormulaConflict, self
Constant Summary collapse
- Cache =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
type_template { { fixed: T::Hash[Symbol, T.untyped] } }
Constants included from Homebrew::Livecheck::Constants
Homebrew::Livecheck::Constants::LATEST_VERSION
Constants included from Utils::Shell
Utils::Shell::SHELL_PROFILE_MAP
Class Attribute Summary collapse
-
.api_source ⇒ Hash{String => T.untyped}?
readonly
private
Whether this formula was loaded using the formulae.brew.sh API.
- .conflicts ⇒ Array<FormulaConflict> readonly private
-
.deprecate_args ⇒ Hash{Symbol => String, Symbol, nil}?
readonly
private
The arguments that were passed to deprecate!.
-
.deprecation_date ⇒ Date?
readonly
private
The date of deprecation of a Formula.
-
.deprecation_reason ⇒ String, ...
readonly
private
The reason for deprecation of a Formula.
-
.deprecation_replacement_cask ⇒ String?
readonly
private
The replacement cask for a deprecated Formula.
-
.deprecation_replacement_formula ⇒ String?
readonly
private
The replacement formula for a deprecated Formula.
-
.disable_args ⇒ Hash{Symbol => String, Symbol, nil}?
readonly
private
The arguments that were passed to disable!.
-
.disable_date ⇒ Date?
readonly
private
The date that this Formula was or becomes disabled.
-
.disable_reason ⇒ String, ...
readonly
private
The reason this Formula is disabled.
-
.disable_replacement_cask ⇒ String?
readonly
private
The replacement cask for a disabled Formula.
-
.disable_replacement_formula ⇒ String?
readonly
private
The replacement formula for a disabled Formula.
- .homepage_browsed ⇒ Date? readonly private
-
.keg_only_reason ⇒ KegOnlyReason?
readonly
private
The reason for why this software is not linked (by default) to HOMEBREW_PREFIX.
- .link_overwrite_paths ⇒ Set<String> readonly private
- .network_access_allowed ⇒ Hash{Symbol => Boolean} readonly private
-
.no_autobump_message ⇒ String, ...
readonly
private
Message that explains why the formula was excluded from the autobump list.
-
.pour_bottle_check_unsatisfied_reason ⇒ String?
private
If
pour_bottle?returnsfalse: the user-visible reason to display for why they cannot use the bottle. - .pour_bottle_only_if ⇒ Symbol? readonly private
- .pypi_packages_info ⇒ PypiPackages? readonly private
- .skip_clean_paths ⇒ Set<String, Symbol> readonly private
Instance Attribute Summary collapse
-
#active_log_type ⇒ String?
readonly
private
When performing a build, test, or other loggable action, indicates which log file location to use.
-
#active_spec ⇒ SoftwareSpec
private
The currently active SoftwareSpec.
-
#active_spec_sym ⇒ Symbol
readonly
private
A symbol to indicate currently active SoftwareSpec.
-
#alias_name ⇒ String?
readonly
private
The name of the alias that was used to identify this Formula.
-
#alias_path ⇒ Pathname?
readonly
private
The path to the alias that was used to identify this Formula.
-
#build ⇒ BuildOptions, Tab
private
The BuildOptions or Tab for this Formula.
-
#buildpath ⇒ Pathname?
The current working directory during builds.
-
#compatibility_version ⇒ Integer?
readonly
Used to indicate API/ABI compatibility for dependencies.
-
#follow_installed_alias ⇒ Boolean
(also: #follow_installed_alias?)
private
Whether this formula should be considered outdated if the target of the alias it was installed with has since changed.
-
#force_bottle ⇒ Boolean
private
Whether or not to force the use of a bottle.
-
#full_alias_name ⇒ String?
readonly
private
The fully-qualified alias referring to this Formula.
-
#full_name ⇒ String
readonly
The fully-qualified name of this Formula.
-
#head ⇒ SoftwareSpec?
readonly
The HEAD SoftwareSpec for this Formula.
-
#local_bottle_path ⇒ Pathname?
private
When installing a bottle (binary package) from a local path this will be set to the full path to the bottle tarball.
-
#name ⇒ String
readonly
The name of this Formula.
-
#oldnames ⇒ Array<String>
internal
Old names for the formula.
-
#path ⇒ Pathname
readonly
The full path to this Formula.
- #pinned? ⇒ Boolean readonly private
-
#pypi_packages_info ⇒ PypiPackages
readonly
private
Information about PyPI mappings for this Formula is stored as PypiPackages object.
-
#revision ⇒ Integer
readonly
Used for creating new Homebrew versions of software without new upstream versions.
-
#source_modified_time ⇒ Time?
readonly
private
The most recent modified time for source files.
-
#stable ⇒ SoftwareSpec?
readonly
The stable (and default) SoftwareSpec for this Formula.
- #tap ⇒ Tap?
-
#testpath ⇒ Pathname?
readonly
The current working directory during tests.
-
#version_scheme ⇒ Integer
readonly
Used to change version schemes for packages.
Class Method Summary collapse
- .[](name) ⇒ Formula private
-
.alias_full_names ⇒ Array<String>
private
An array of all aliases as fully-qualified names.
-
.aliases ⇒ Array<String>
private
An array of all aliases.
-
.all ⇒ Array<Formula>
private
An array of each known trusted Formula.
-
.allow_network_access!(phases = []) ⇒ void
The phases for which network access is allowed.
-
.autobump? ⇒ Boolean
private
Is the formula in the autobump list?.
-
.bottle(&block) ⇒ void
Adds a Formula.bottle SoftwareSpec.
- .build ⇒ BuildOptions private
- .build_flags ⇒ Object private
-
.compatibility_version(val = nil) ⇒ Integer?
Used to indicate API/ABI compatibility for dependencies.
-
.conflicts_with(*names, because: nil, cask: nil) ⇒ void
One or more formulae that conflict with this one and why.
-
.core_aliases ⇒ Array<String>
private
An array of all core aliases.
-
.core_names ⇒ Array<String>
private
An array of all core Formula names.
-
.deny_network_access!(phases = []) ⇒ void
The phases for which network access is denied.
-
.depends_on(dep) ⇒ void
The dependencies for this formula.
-
.deprecate!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil) ⇒ void
Deprecates a Formula (on the given date) so a warning is shown on each installation.
-
.deprecated? ⇒ Boolean
private
Whether this Formula is deprecated (i.e. warns on installation).
-
.deprecated_option(hash) ⇒ void
Deprecated options are used to rename options and migrate users who used them to newer ones.
-
.desc(val = nil) ⇒ String?
A one-line description of the software.
-
.disable!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil) ⇒ void
Disables a Formula (on the given date) so it cannot be installed.
-
.disabled? ⇒ Boolean
private
Whether this Formula is disabled (i.e. cannot be installed).
-
.fails_with(compiler, &block) ⇒ void
Marks the Formula as failing with a particular compiler so it will fall back to others.
- .formula_namespace ⇒ T::Module[T.anything]? private
- .freeze ⇒ T.self_type private
-
.full_names ⇒ Array<String>
private
An array of all Formula names, which the tap formulae have as the fully-qualified name.
-
.fuzzy_search(name) ⇒ Array<String>
private
Returns a list of approximately matching formula names, but not the complete match.
-
.head(val = nil, specs = {}, &block) ⇒ T.untyped
Adds a Formula.head SoftwareSpec.
-
.homepage(val = nil, browsed: nil) ⇒ String?
The homepage for the software.
-
.inherited(child) ⇒ void
private
Initialise instance variables for each subclass.
-
.installed ⇒ Array<Formula>
private
An array of all installed Formulae.
-
.installed_formula_names ⇒ Array<String>
private
An array of all currently installed formula names.
- .installed_with_alias_path(alias_path) ⇒ Array<Formula> private
-
.keg_only(reason, explanation = "") ⇒ void
Software that will not be symlinked into the
brew --prefixand will only live in its Cellar. -
.license(args = nil) ⇒ SPDX::LicenseExpression?
The SPDX ID of the open-source license that the formula uses.
-
.link_overwrite(*paths) ⇒ Set<String>
private
Permit overwriting certain files while linking.
-
.livecheck(&block) ⇒ T.untyped
Livecheck can be used to check for newer versions of the software.
-
.livecheck_defined? ⇒ Boolean
private
Checks whether a
livecheckspecification is defined or not. -
.loaded_from_api? ⇒ Boolean
private
Whether this formula was loaded using the formulae.brew.sh API.
-
.loaded_from_internal_api? ⇒ Boolean
private
Whether this formula was loaded using the internal formulae.brew.sh API.
-
.loaded_from_metadata? ⇒ Boolean
private
Whether this formula was loaded from installed metadata.
-
.mirror(val) ⇒ void
Additional URLs for the Formula.stable version of the formula.
-
.names ⇒ Array<String>
private
An array of all Formula names.
-
.network_access_allowed?(phase) ⇒ Boolean
private
Whether the specified phase should be forced offline.
-
.no_autobump!(because:) ⇒ void
Exclude the formula from the autobump list.
- .on_arch_conditional(arm: nil, intel: nil) ⇒ T.type_parameter(:U)? private
- .on_arm(&block) ⇒ T.type_parameter(:U)? private
- .on_big_sur(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- .on_golden_gate(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- .on_intel(&block) ⇒ T.type_parameter(:U)? private
- .on_linux(&block) ⇒ T.type_parameter(:U)? private
- .on_macos(&block) ⇒ T.type_parameter(:U)? private
- .on_monterey(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- .on_sequoia(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- .on_sonoma(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- .on_system(linux, macos:, &block) ⇒ T.type_parameter(:U)? private
-
.on_system_blocks_exist? ⇒ Boolean
private
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). - .on_system_conditional(macos: nil, linux: nil) ⇒ T.type_parameter(:U)? private
- .on_tahoe(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- .on_ventura(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
-
.option(name, description = "") ⇒ void
Options can be used as arguments to
brew install. -
.patch(strip = :p1, src = nil, &block) ⇒ void
External patches can be declared using resource-style blocks.
-
.post_install_steps(*steps, &block) ⇒ Homebrew::InstallSteps::Steps
Declarative steps to run after bottle installation.
- .post_install_steps_defined? ⇒ Boolean private
-
.pour_bottle?(only_if: nil, &block) ⇒ void
Defines whether the Formula's bottle can be used on the given Homebrew installation.
-
.preserve_rpath(value: true) ⇒ Boolean
Preserve
@rpathinstall names when fixing dynamic linkage on macOS. -
.preserve_rpath? ⇒ Boolean
internal
Check if
@rpathinstall names should be preserved. -
.pypi_packages(package_name: nil, extra_packages: nil, exclude_packages: nil, dependencies: nil) ⇒ void
Adds information about PyPI formula mapping as PypiPackages object.
-
.python_major_minor_version(python) ⇒ Version?
Returns the major.minor Version for the given Python executable, as a shorthand for
Language::Python.major_minor_versionin the formula DSL. -
.rack_installed?(name) ⇒ Boolean
private
Whether the rack for a formula name, with or without a tap prefix, holds a keg.
-
.racks ⇒ Array<Pathname>
private
An array of all racks currently installed.
-
.resource(name, klass = Resource, &block) ⇒ void
Additional downloads can be defined as Formula.resources and accessed in the install method.
-
.revision(val = nil) ⇒ Integer?
Used for creating new Homebrew versions of software without new upstream versions.
-
.service(&block) ⇒ T.proc.void?
Service can be used to define services.
-
.service? ⇒ Boolean
private
Checks whether a service specification is defined or not.
-
.sha256(val) ⇒ void
To verify the cached download's integrity and security we verify the SHA-256 hash matches what we've declared in the Formula.
-
.skip_clean(*paths) ⇒ Set<String, Symbol>
Skip cleaning paths in a formula.
- .spec_syms ⇒ Array<Symbol> private
-
.specs ⇒ Array<SoftwareSpec>
private
A list of the Formula.stable and Formula.head SoftwareSpecs.
-
.stable(&block) ⇒ T.untyped
Allows adding Formula.depends_on and Patches just to the Formula.stable SoftwareSpec.
-
.tap_aliases ⇒ Array<String>
private
An array of all tap aliases.
-
.tap_files ⇒ Array<Pathname>
private
An array of all tap Formula files.
-
.tap_names ⇒ Array<String>
private
An array of all tap Formula names.
-
.test(&block) ⇒ void
A test is required for new formulae and makes us happy.
-
.url(val = nil, specs = {}) ⇒ String
The URL used to download the source for the Formula.stable version of the formula.
-
.uses_from_macos(dep, bounds = {}) ⇒ void
Indicates use of dependencies provided by macOS.
-
.version(val = nil) ⇒ Version?
The version string for the Formula.stable version of the formula.
-
.version_scheme(val = nil) ⇒ Integer?
Used for creating new Homebrew version schemes.
Instance Method Summary collapse
-
#active_log_prefix ⇒ String
private
The prefix, if any, to use in filenames for logging current activity.
-
#alias_changed? ⇒ Boolean
private
Has the alias used to install the formula changed, or are different formulae already installed with this alias?.
-
#aliases ⇒ Array<String>
internal
All aliases for the formula.
- #allow_network_access!(*args, &block) ⇒ T.untyped private
-
#any_installed_keg ⇒ Keg?
private
Returns a Keg for the
opt_prefixorinstalled_prefixif they exist. -
#any_installed_prefix ⇒ Pathname?
internal
Get the path of any installed prefix.
-
#any_installed_version ⇒ PkgVersion?
private
Returns the PkgVersion for this formula if it is installed.
-
#any_version_installed? ⇒ Boolean
If at least one version of Formula is installed.
-
#api_source ⇒ T.untyped
private
The API source data used to load this formula.
-
#autobump? ⇒ Boolean
private
Is the formula in the autobump list?.
-
#bash_completion ⇒ Pathname
The directory where the formula's
bashcompletion files should be installed. -
#bin ⇒ Pathname
The directory where the formula's binaries should be installed.
-
#bottle ⇒ Bottle?
private
The Bottle object for the currently active SoftwareSpec.
- #bottle_defined?(*args, &block) ⇒ Boolean private
-
#bottle_for_tag(tag = nil) ⇒ Bottle?
private
The Bottle object for given tag.
-
#bottle_hash ⇒ Hash{String => T.untyped}
private
Returns the bottle information for a formula.
- #bottle_prefix ⇒ Pathname private
- #bottle_specification(*args, &block) ⇒ T.untyped private
- #bottle_tab_attributes ⇒ Hash{String => T.untyped} private
- #bottle_tag?(*args, &block) ⇒ Boolean private
- #bottled?(*args, &block) ⇒ Boolean private
-
#brew(fetch: true, keep_tmp: false, debug_symbols: false, interactive: false, staging_path: nil, staged: false, &_blk) ⇒ void
private
Yields
|self,staging|with current working directory set to the uncompressed tarball where staging is a Mktemp staging context. - #cached_download(*args, &block) ⇒ T.untyped private
-
#caveats ⇒ String?
private
Warn the user about any Homebrew-specific issues or quirks for this package.
- #caveats_with_placeholders ⇒ String? private
-
#change_dylib_id(file, id, resolve_source: false) ⇒ void
Changes the dynamic library ID of one Mach-O file and codesigns it on Apple Silicon.
- #clear_cache(*args, &block) ⇒ T.untyped private
-
#common_sandbox_env(home) ⇒ Hash{Symbol => String}
private
Common environment variables used by sandboxed fetch, build, test and postinstall phases.
- #compiler_failures(*args, &block) ⇒ T.untyped private
-
#conflicts ⇒ Array<FormulaConflict>
internal
Returns a list of FormulaConflict objects indicating any formulae that conflict with this one and why.
-
#core_formula? ⇒ Boolean
private
True if this formula is provided by Homebrew itself.
- #current_installed_alias_target ⇒ Formula? private
- #declared_deps(*args, &block) ⇒ T.untyped private
- #deny_network_access!(*args, &block) ⇒ T.untyped private
- #dependencies_hash ⇒ Hash{String => T.untyped} private
-
#deprecate_args ⇒ T.untyped
private
The arguments that were used to deprecate this Formula.
-
#deprecated? ⇒ Boolean
private
Whether this Formula is deprecated (i.e. warns on installation).
- #deprecated_flags(*args, &block) ⇒ T.untyped private
- #deprecated_options(*args, &block) ⇒ T.untyped private
-
#deprecation_date ⇒ T.untyped
private
The date that this Formula was or becomes deprecated.
-
#deprecation_reason ⇒ T.untyped
private
The reason this Formula is deprecated.
-
#deprecation_replacement_cask ⇒ T.untyped
private
The replacement cask for this deprecated Formula.
-
#deprecation_replacement_formula ⇒ T.untyped
private
The replacement formula for this deprecated Formula.
- #deps(*args, &block) ⇒ T.untyped private
-
#desc ⇒ T.untyped
private
The description of the software.
-
#deuniversalize_machos(*targets) ⇒ void
Replaces a universal binary with its native slice.
-
#disable_args ⇒ T.untyped
private
The arguments that were used to disable this Formula.
-
#disable_date ⇒ T.untyped
private
The date that this Formula was or becomes disabled.
-
#disable_reason ⇒ T.untyped
private
The reason this Formula is disabled.
-
#disable_replacement_cask ⇒ T.untyped
private
The replacement cask for this disabled Formula.
-
#disable_replacement_formula ⇒ T.untyped
private
The replacement formula for this disabled Formula.
-
#disabled? ⇒ Boolean
private
Whether this Formula is disabled (i.e. cannot be installed).
-
#doc ⇒ Pathname
The directory where the formula's documentation should be installed.
- #downloader(*args, &block) ⇒ T.untyped private
- #eligible_kegs_for_cleanup(quiet: false) ⇒ Array<Keg> private
-
#elisp ⇒ Pathname
The directory where Emacs Lisp files should be installed, with the formula name appended to avoid linking conflicts.
- #enqueue_resources_and_patches(download_queue:, test: false) ⇒ void private
-
#ensure_installed!(reason: "", latest: false, output_to_stderr: true, quiet: false, executable: nil, version_args: ["--version"]) ⇒ T.self_type, Pathname
private
Ensure the given formula is installed.
- #env(*args, &block) ⇒ T.untyped private
-
#etc ⇒ Pathname
The directory where the formula's configuration files should be installed.
-
#fetch ⇒ void
Downloads what #install needs from the network, e.g.
- #fetch_bottle_tab(quiet: false) ⇒ void private
- #fetch_defined? ⇒ Boolean private
- #fetch_patches ⇒ void private
-
#fish_completion ⇒ Pathname
The directory where the formula's
fishcompletion files should be installed. -
#fish_function ⇒ Pathname
The directory where the formula's
fishfunction files should be installed. -
#frameworks ⇒ Pathname
The directory where the formula's Frameworks should be installed.
-
#full_formulae_names ⇒ Array<String>
private
Returns the sibling
-fullor non--fullformula names for any Formula. - #full_installed_alias_name ⇒ String? private
-
#full_installed_specified_name ⇒ String
private
The name (including tap) specified to install this formula.
-
#full_specified_name ⇒ String
private
The name (including tap) specified to find this formula.
-
#generate_completions_from_executable(*commands, base_name: nil, shell_parameter_format: nil, shells: Utils::ShellCompletion.default_completion_shells(shell_parameter_format)) ⇒ void
Generate shell completions for a formula for
bash,zsh,fish, and optionallypwshusing the formula's executable. -
#head? ⇒ Boolean
private
Is the currently active SoftwareSpec a #head build?.
-
#head_only? ⇒ Boolean
private
Is this formula HEAD-only?.
- #head_version_outdated?(version, fetch_head: false) ⇒ Boolean private
-
#homepage ⇒ T.untyped
private
The homepage for the software.
-
#homepage_browsed ⇒ T.untyped
private
The date when a human last browsed the homepage.
- #implied_link_overwrite?(keg_name, overwrite_formulae) ⇒ Boolean private
-
#include ⇒ Pathname
The directory where the formula's headers should be installed.
-
#info ⇒ Pathname
The directory where the formula's info files should be installed.
- #initialize(name, path, spec, alias_path: nil, tap: nil, force_bottle: false) ⇒ void constructor private
-
#inreplace(paths, before = nil, after = nil, audit_result: true, global: true, &block) ⇒ void
Sometimes we have to change a bit before we install.
-
#install ⇒ void
This method is overridden in Formula subclasses to provide the installation instructions.
- #install_etc_var ⇒ void private
- #installed_alias_name ⇒ String? private
-
#installed_alias_path ⇒ Pathname?
private
The alias path that was used to install this formula, if it exists.
-
#installed_alias_target_changed? ⇒ Boolean
private
Has the target of the alias used to install this formula changed? Returns false if the formula wasn't installed with an alias.
-
#installed_kegs ⇒ Array<Keg>
private
All currently installed kegs.
-
#installed_prefixes ⇒ Array<Pathname>
private
All currently installed prefix directories.
-
#installed_runtime_formula_dependencies(read_from_tab: true, undeclared: true) ⇒ Array<Formula>
private
Returns a list of installed Formula objects that are required at runtime.
-
#keg_only? ⇒ Boolean
internal
Rarely, you don't want your library symlinked into the main prefix.
- #keg_only_reason(*args, &block) ⇒ T.untyped private
-
#kext_prefix ⇒ Pathname
The directory where the formula's kernel extensions should be installed.
-
#latest_formula ⇒ Formula
private
If the alias has changed value, return the new formula.
- #latest_head_pkg_version(fetch_head: false) ⇒ PkgVersion private
- #latest_head_prefix ⇒ Pathname? private
- #latest_head_version ⇒ PkgVersion? private
-
#latest_installed_prefix ⇒ Pathname
private
The latest prefix for this formula.
-
#latest_version_installed? ⇒ Boolean
private
If this Formula is installed.
-
#launchd_service_path ⇒ Pathname
private
The generated launchd plist file path.
-
#launchd_service_paths ⇒ Array<Pathname>
private
The generated launchd plist file paths, including compatible defaults.
-
#lib ⇒ Pathname
The directory where the formula's libraries should be installed.
-
#libexec ⇒ Pathname
The directory where the formula's binaries should be installed.
-
#license ⇒ T.untyped
private
The SPDX ID of the software license.
-
#link_overwrite?(path) ⇒ Boolean
private
Explicit
link_overwritepaths may also be implied for related formula families. -
#link_overwrite_formulae ⇒ Array<Formula>
private
Returns sibling Formulae whose prefix links should be replaced when this Formula is linked.
-
#link_overwrite_formulae_names ⇒ Array<String>
private
Returns sibling Formula names whose prefix links should be replaced when this Formula is linked.
- #link_overwrite_keg_name(path) ⇒ String, ... private
- #link_overwrite_reason ⇒ String? private
- #link_overwrite_related_formula_names ⇒ Array<String> private
-
#linked? ⇒ Boolean
internal
Is the formula linked?.
-
#linked_keg ⇒ Pathname
internal
The link status symlink directory for this Formula.
-
#linked_version ⇒ PkgVersion?
private
PkgVersion of the linked keg for the formula.
-
#livecheck ⇒ T.untyped
private
The
livecheckspecification for the software. -
#livecheck_defined? ⇒ Boolean
private
Is a
livecheckspecification defined for the software?. -
#livecheckable? ⇒ Boolean
private
This is a legacy alias for
#livecheck_defined?. -
#loaded_from_api? ⇒ Boolean
private
Whether this formula was loaded using the formulae.brew.sh API.
-
#loaded_from_internal_api? ⇒ Boolean
private
Whether this formula was loaded using the internal formulae.brew.sh API.
-
#loader_path ⇒ String
Linker variable for the directory containing the program or shared object.
-
#local_patch_checksums ⇒ Hash{String => String}
private
API generation requires every patch checksum; other metadata consumers can omit unreadable patches.
- #lock ⇒ Array<String> private
-
#logs ⇒ Pathname
private
The directory where the formula's installation or test logs will be written.
-
#man ⇒ Pathname
The root directory where the formula's manual pages should be installed.
-
#man1 ⇒ Pathname
The directory where the formula's man1 pages should be installed.
-
#man2 ⇒ Pathname
The directory where the formula's man2 pages should be installed.
-
#man3 ⇒ Pathname
The directory where the formula's man3 pages should be installed.
-
#man4 ⇒ Pathname
The directory where the formula's man4 pages should be installed.
-
#man5 ⇒ Pathname
The directory where the formula's man5 pages should be installed.
-
#man6 ⇒ Pathname
The directory where the formula's man6 pages should be installed.
-
#man7 ⇒ Pathname
The directory where the formula's man7 pages should be installed.
-
#man8 ⇒ Pathname
The directory where the formula's man8 pages should be installed.
- #migration_needed? ⇒ Boolean private
-
#missing_dependencies(hide: []) ⇒ Array<Dependency>
private
Returns a list of formulae depended on by this formula that aren't installed.
- #missing_library_linkage ⇒ Array<(Array<String>, Set<String>)> private
-
#mkdir(name, &block) ⇒ T.untyped
private
A version of
FileUtils.mkdirthat also changes to that folder in a block. -
#mktemp(prefix = name, retain: false, retain_in_cache: false, &block) ⇒ T.type_parameter(:U)
private
Create a temporary directory then yield.
- #network_access_allowed?(*args, &block) ⇒ Boolean private
- #new_formula_available? ⇒ Boolean private
-
#no_autobump! ⇒ T.untyped
private
Exclude the formula from the autobump list.
- #no_autobump_message(*args, &block) ⇒ T.untyped private
- #old_installed_formulae ⇒ Array<Formula> private
- #oldnames_to_migrate ⇒ Array<String> private
- #on_arch_conditional(arm: nil, intel: nil) ⇒ T.type_parameter(:U)? private
- #on_arm(&block) ⇒ T.type_parameter(:U)? private
- #on_big_sur(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- #on_golden_gate(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- #on_intel(&block) ⇒ T.type_parameter(:U)? private
- #on_linux(&block) ⇒ T.type_parameter(:U)? private
- #on_macos(&block) ⇒ T.type_parameter(:U)? private
- #on_monterey(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- #on_sequoia(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- #on_sonoma(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- #on_system(linux, macos:, &block) ⇒ T.type_parameter(:U)? private
- #on_system_blocks_exist? ⇒ Boolean? private
- #on_system_conditional(macos: nil, linux: nil) ⇒ T.type_parameter(:U)? private
- #on_tahoe(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
- #on_ventura(or_condition = nil, &block) ⇒ T.type_parameter(:U)? private
-
#opt_bin ⇒ Pathname
Same as #bin, but relative to #opt_prefix instead of #prefix.
-
#opt_elisp ⇒ Pathname
Same as #elisp, but relative to #opt_prefix instead of #prefix.
-
#opt_frameworks ⇒ Pathname
Same as #frameworks, but relative to #opt_prefix instead of #prefix.
-
#opt_include ⇒ Pathname
Same as #include, but relative to #opt_prefix instead of #prefix.
-
#opt_lib ⇒ Pathname
Same as #lib, but relative to #opt_prefix instead of #prefix.
-
#opt_libexec ⇒ Pathname
Same as #libexec, but relative to #opt_prefix instead of #prefix.
-
#opt_pkgshare ⇒ Pathname
Same as #pkgshare, but relative to #opt_prefix instead of #prefix.
-
#opt_prefix ⇒ Pathname
A stable path for this formula, when installed.
-
#opt_sbin ⇒ Pathname
Same as #sbin, but relative to #opt_prefix instead of #prefix.
-
#opt_share ⇒ Pathname
Same as #share, but relative to #opt_prefix instead of #prefix.
-
#option_defined? ⇒ Boolean
private
If a named option is defined for the currently active SoftwareSpec.
- #options(*args, &block) ⇒ T.untyped private
-
#optlinked? ⇒ Boolean
private
Is the formula linked to
opt?. -
#outdated?(fetch_head: false) ⇒ Boolean
internal
Check whether the installed formula is outdated.
- #outdated_kegs(fetch_head: false) ⇒ Array<Keg> private
-
#patch ⇒ void
Applies all patches in the #patchlist to the source tree.
- #patchlist(*args, &block) ⇒ T.untyped private
- #pin(*args, &block) ⇒ T.untyped private
- #pinnable?(*args, &block) ⇒ Boolean private
- #pinned_version(*args, &block) ⇒ T.untyped private
-
#pkg_version ⇒ PkgVersion
private
The PkgVersion for this formula with Formula.version and #revision information.
-
#pkgetc ⇒ Pathname
A subdirectory of
etcwith the formula name suffixed, e.g. -
#pkgshare ⇒ Pathname
The directory where the formula's shared files should be installed, with the name of the formula appended to avoid linking conflicts.
-
#plist_name ⇒ String
private
The generated launchd plist service name.
-
#plist_names ⇒ Array<String>
private
The generated launchd plist service names, including compatible defaults.
- #possible_names ⇒ Array<String> private
- #post_install ⇒ void private
- #post_install_defined? ⇒ Boolean private
-
#post_install_steps ⇒ T.untyped
private
The post-install steps.
- #post_install_steps_defined? ⇒ Boolean private
-
#pour_bottle? ⇒ Boolean
private
Indicates that this formula supports bottles.
- #pour_bottle_check_unsatisfied_reason(*args, &block) ⇒ T.untyped private
-
#prefix(version = pkg_version) ⇒ Pathname
The directory in the Cellar that the formula is installed to.
- #preserve_rpath? ⇒ Boolean private
- #print_tap_action(options = {}) ⇒ void private
-
#pwsh_completion ⇒ Pathname
The directory where the formula's PowerShell completion files should be installed.
-
#python3 ⇒ Pathname
The stable path to the executable provided by this formula's direct Python 3 dependency.
-
#rack ⇒ Pathname
private
The parent of the prefix; the named directory in the Cellar containing all installed versions of this software.
-
#recursive_dependencies(&block) ⇒ Array<Dependency>
internal
Returns a list of Dependency objects in an installable order, which means if
adepends onbthenbwill be ordered beforeain this list. -
#recursive_requirements(&block) ⇒ Requirements
internal
The full set of Requirements for this formula's dependency tree.
- #reloadable_ref ⇒ String, Pathname private
- #requirements(*args, &block) ⇒ T.untyped private
-
#resource(name = nil, klass = Resource, &block) ⇒ Resource?
A named Resource for the currently active SoftwareSpec.
-
#resources ⇒ T.untyped
private
The Resources for the currently active SoftwareSpec.
-
#rpath(source: bin, target: lib) ⇒ String
Executable/Library RPATH according to platform conventions.
- #ruby_source_checksum ⇒ Checksum? private
- #ruby_source_path ⇒ String? private
- #run_post_install ⇒ void private
- #run_post_install_steps ⇒ void private
- #run_test(keep_tmp: false) ⇒ void private
-
#runtime_dependencies(read_from_tab: true, undeclared: true) ⇒ Array<Dependency>
internal
Returns a list of Dependency objects that are required at runtime.
-
#runtime_formula_dependencies(read_from_tab: true, undeclared: true) ⇒ Array<Formula>
private
Returns a list of Formula objects that are required at runtime.
- #runtime_installed_formula_dependents ⇒ Array<Formula> private
-
#sbin ⇒ Pathname
The directory where the formula's
sbinbinaries should be installed. - #selective_patch(is_data: false) ⇒ void private
- #serialized_patches ⇒ Array<Hash{String => T.untyped}> private
- #serialized_requirements ⇒ Array<Hash{String => T.untyped}> private
-
#service ⇒ Homebrew::Service
The service specification for the software.
-
#service? ⇒ Boolean
private
Is a service specification defined for the software?.
-
#service_name ⇒ String
private
The generated service name.
-
#service_names ⇒ Array<String>
private
The generated systemd service names, including compatible defaults.
-
#share ⇒ Pathname
The directory where the formula's shared files should be installed.
-
#shared_library(name, version = nil) ⇒ String
Shared library names according to platform conventions.
- #skip_clean?(path) ⇒ Boolean private
-
#specified_name ⇒ String
private
The name specified to find this formula.
-
#specified_path ⇒ Pathname?
private
The path that was specified to find this formula.
-
#stable? ⇒ Boolean
private
Is the currently active SoftwareSpec a #stable build?.
-
#std_cabal_v2_args(installdir: bin) ⇒ Array<String>
Standard parameters for Cabal-v2 builds.
-
#std_cargo_args(root: prefix, path: ".", features: nil) ⇒ Array<String>
Standard parameters for Cargo builds.
-
#std_cargo_fetch_args ⇒ Array<String>
Standard parameters for Cargo dependency fetches.
-
#std_cmake_args(install_prefix: prefix, install_libdir: "lib", find_framework: "LAST") ⇒ Array<String>
Standard parameters for CMake builds.
-
#std_configure_args(prefix: self.prefix, libdir: "lib") ⇒ Array<String>
Standard parameters for configure builds.
-
#std_go_args(output: bin/name, ldflags: nil, gcflags: nil, tags: nil) ⇒ Array<String>
Standard parameters for Go builds.
-
#std_meson_args(prefix: self.prefix, libdir: "lib") ⇒ Array<String>
Standard parameters for Meson builds.
-
#std_npm_args(prefix: libexec, ignore_scripts: true) ⇒ Array<String>
Standard parameters for npm builds.
-
#std_pip_args(prefix: self.prefix, build_isolation: false) ⇒ Array<String>
Standard parameters for pip builds.
-
#std_shards_args ⇒ Array<String>
Standard parameters for Shards builds.
-
#std_swift_args ⇒ Array<String>
Standard parameters for Swift builds.
-
#std_zig_args(prefix: self.prefix, release_mode: :fast, cpu: nil) ⇒ Array<String>
Standard parameters for Zig builds.
-
#supersedes_an_installed_formula? ⇒ Boolean
private
Is this formula the target of an alias used to install an old formula?.
- #supports_linux? ⇒ Boolean private
- #supports_macos? ⇒ Boolean private
-
#synced_with_other_formulae? ⇒ Boolean
private
Whether this Formula is version-synced with other formulae.
-
#system(cmd, *args) ⇒ void
To call out to the system, we use the
systemmethod and we prefer you give the args separately as in the line below, otherwise a subshell has to be opened first. -
#systemd_service_path ⇒ Pathname
private
The generated systemd Formula.service file path.
-
#systemd_service_paths ⇒ Array<Pathname>
private
The generated systemd Formula.service file paths, including compatible defaults.
-
#systemd_timer_path ⇒ Pathname
private
The generated systemd timer file path.
-
#systemd_timer_paths ⇒ Array<Pathname>
private
The generated systemd timer file paths, including compatible defaults.
- #tap! ⇒ Tap private
-
#tap? ⇒ Boolean
private
True if this formula is provided by an external Tap.
- #tap_git_head ⇒ String? private
- #tap_path ⇒ Pathname private
-
#test ⇒ void
This method is overridden in Formula subclasses to provide the test instructions.
- #test_defined? ⇒ Boolean private
-
#test_fixtures(file) ⇒ Pathname
Returns the path to a fixture file for use in formula tests.
-
#test_sandbox_env(testpath) ⇒ Hash{Symbol => String}
private
Environment variables for the sandboxed test phase, on top of #common_sandbox_env.
-
#time ⇒ Time
private
Creates a new
Timeobject for use in the formula as the build time. - #to_hash ⇒ Hash{String => T.untyped} private
- #to_hash_with_variations ⇒ Hash{String => T.untyped} private
- #unlock ⇒ Array<FormulaLock> private
- #unpin(*args, &block) ⇒ T.untyped private
- #unversioned_formula_name ⇒ String? private
- #update_head_version ⇒ void private
- #urls_hash ⇒ Hash{String => Hash{String => T.untyped}} private
-
#valid_platform? ⇒ Boolean
private
True if this formula can be installed on this platform.
-
#var ⇒ Pathname
The directory where the formula's variable files should be installed.
-
#version ⇒ T.untyped
private
The version for the currently active SoftwareSpec.
-
#versioned_formula? ⇒ Boolean
private
If this is a
@-versioned formula. -
#versioned_formulae ⇒ Array<Formula>
private
Returns any
@-versioned Formula objects for any Formula (including versioned formulae). -
#versioned_formulae_names ⇒ Array<String>
private
Returns any other
@-versioned formulae names for any Formula (including versioned formulae). -
#with_logging(log_type, &_block) ⇒ T.type_parameter(:U)
private
Runs a block with the given log type in effect for its duration.
-
#xcodebuild(*args) ⇒ void
Runs
xcodebuildwithout Homebrew's compiler environment variables set. -
#zsh_completion ⇒ Pathname
The directory where the formula's
zshcompletion files should be installed. -
#zsh_function ⇒ Pathname
The directory where the formula's
zshfunction files should be installed.
Methods included from OnSystem::MacOSAndLinux
Methods included from BuildEnvironment::DSL
Methods included from Cacheable
Methods included from APIHashable
deep_remove_placeholders, generating_hash!, generating_hash?
Methods included from Utils::Output::Mixin
issue_reporting_message, odebug, odeprecated, odie, odisabled, ofail, oh1, oh1_title, ohai, ohai_title, onoe, opoo, opoo_once, opoo_outside_github_actions, opoo_without_github_actions_annotation, pretty_cannot_install, pretty_deprecated, pretty_disabled, pretty_duration, pretty_install_status, pretty_installed, pretty_uninstalled, pretty_unmarked, pretty_upgradable, pretty_warning
Methods included from Context
current, current=, #debug?, #deferred_environment_expansion?, #quiet?, #verbose?, #with_context
Methods included from Utils::Path
formula_installed_prefixes, formula_opt_bin_env, formula_opt_bin_path, install_info, loadable_package_path?, tap_package_path, uninstall_info, valid_package_name?
Methods included from Utils::Path::Helpers
#child_of?, #cp_path_sub, #ensure_child_of!, #ensure_writable, #relative_path_from, #resolved_path, #resolved_path_exists?, #rmdir_if_possible, #text_executable?
Methods included from Utils::Path::FormulaHelpers
#formula_any_version_installed?, #formula_opt_bin, #formula_opt_include, #formula_opt_lib, #formula_opt_libexec, #formula_opt_prefix
Methods included from SystemCommand::Helpers
Methods included from Utils::Shell
csh_quote, export_value, from_path, interactive, parent, preferred, preferred_path, prepend_path_in_profile, profile, profile_redirect_target, pwsh_quote, set_variable_in_profile, sh_quote, shell_with_prompt, which, with_env, with_homebrew_path
Methods included from Utils::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.
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 |
# File 'formula.rb', line 281 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 raise "Formula subclasses cannot override `brew`." if self.class.instance_method(:brew).owner != Formula # Stop any subsequent modification of a formula's definition. # Changes do not propagate to existing instances of formulae. # Now that we have an instance, it's too late to make any changes to the class-level definition. self.class.freeze @name = name @unresolved_path = path @path = T.let(resolved_path(path), Pathname) @alias_path = alias_path @alias_name = T.let((File.basename(alias_path) if alias_path), T.nilable(String)) @revision = T.let(self.class.revision || 0, Integer) @version_scheme = T.let(self.class.version_scheme || 0, Integer) @compatibility_version = T.let(self.class.compatibility_version, T.nilable(Integer)) @autobump = T.let(true, T::Boolean) @no_autobump_message = T.let(nil, T.nilable(T.any(String, Symbol))) @force_bottle = force_bottle @tap = tap @tap ||= if path == Formulary.core_path(name) CoreTap.instance else Tap.from_path(path) end @pypi_packages_info = T.let(self.class.pypi_packages_info || PypiPackages.new, PypiPackages) @full_name = T.let(full_name_with_optional_tap(name), String) @full_alias_name = T.let((full_name_with_optional_tap(@alias_name) if @alias_name), T.nilable(String)) @stable = T.let(spec_eval(self.class.stable, :stable), T.nilable(SoftwareSpec)) @head = T.let(spec_eval(self.class.head, :head), T.nilable(SoftwareSpec)) @active_spec = T.let(determine_active_spec(spec), SoftwareSpec) @active_spec_sym = T.let(head? ? :head : :stable, Symbol) @python3 = T.let(nil, T.nilable(Pathname)) 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
.api_source ⇒ Hash{String => T.untyped}? (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this formula was loaded using the formulae.brew.sh API.
4099 4100 4101 |
# File 'formula.rb', line 4099 def api_source @api_source end |
.conflicts ⇒ Array<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.
4358 4359 4360 |
# File 'formula.rb', line 4358 def conflicts @conflicts end |
.deprecate_args ⇒ Hash{Symbol => String, Symbol, nil}? (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The arguments that were passed to deprecate!.
5348 5349 5350 |
# File 'formula.rb', line 5348 def deprecate_args @deprecate_args end |
.deprecation_date ⇒ Date? (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The date of deprecation of a Formula.
5319 5320 5321 |
# File 'formula.rb', line 5319 def deprecation_date @deprecation_date end |
.deprecation_reason ⇒ String, ... (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.
5326 5327 5328 |
# File 'formula.rb', line 5326 def deprecation_reason @deprecation_reason end |
.deprecation_replacement_cask ⇒ String? (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.
5340 5341 5342 |
# File 'formula.rb', line 5340 def deprecation_replacement_cask @deprecation_replacement_cask end |
.deprecation_replacement_formula ⇒ String? (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.
5333 5334 5335 |
# File 'formula.rb', line 5333 def deprecation_replacement_formula @deprecation_replacement_formula end |
.disable_args ⇒ Hash{Symbol => String, Symbol, nil}? (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The arguments that were passed to disable!.
5463 5464 5465 |
# File 'formula.rb', line 5463 def disable_args @disable_args end |
.disable_date ⇒ Date? (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.
5434 5435 5436 |
# File 'formula.rb', line 5434 def disable_date @disable_date end |
.disable_reason ⇒ String, ... (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.
5441 5442 5443 |
# File 'formula.rb', line 5441 def disable_reason @disable_reason end |
.disable_replacement_cask ⇒ String? (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.
5455 5456 5457 |
# File 'formula.rb', line 5455 def disable_replacement_cask @disable_replacement_cask end |
.disable_replacement_formula ⇒ String? (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.
5448 5449 5450 |
# File 'formula.rb', line 5448 def disable_replacement_formula @disable_replacement_formula end |
.homepage_browsed ⇒ Date? (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.
4337 4338 4339 |
# File 'formula.rb', line 4337 def homepage_browsed @homepage_browsed end |
.keg_only_reason ⇒ KegOnlyReason? (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.
4108 4109 4110 |
# File 'formula.rb', line 4108 def keg_only_reason @keg_only_reason end |
.link_overwrite_paths ⇒ Set<String> (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.
4364 4365 4366 |
# File 'formula.rb', line 4364 def link_overwrite_paths @link_overwrite_paths end |
.network_access_allowed ⇒ Hash{Symbol => Boolean} (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
4083 4084 4085 |
# File 'formula.rb', line 4083 def network_access_allowed @network_access_allowed end |
.no_autobump_message ⇒ String, ... (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Message that explains why the formula was excluded from the autobump list.
Returns nil if no message is specified.
5139 5140 5141 |
# File 'formula.rb', line 5139 def @no_autobump_message end |
.pour_bottle_check_unsatisfied_reason ⇒ 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.
If pour_bottle? returns false: the user-visible reason to display for
why they cannot use the bottle.
4372 4373 4374 |
# File 'formula.rb', line 4372 def pour_bottle_check_unsatisfied_reason @pour_bottle_check_unsatisfied_reason end |
.pour_bottle_only_if ⇒ 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.
4367 4368 4369 |
# File 'formula.rb', line 4367 def pour_bottle_only_if @pour_bottle_only_if end |
.pypi_packages_info ⇒ PypiPackages? (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.
4111 4112 4113 |
# File 'formula.rb', line 4111 def pypi_packages_info @pypi_packages_info end |
.skip_clean_paths ⇒ Set<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.
4361 4362 4363 |
# File 'formula.rb', line 4361 def skip_clean_paths @skip_clean_paths end |
Instance Attribute Details
#active_log_type ⇒ String? (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.
251 252 253 |
# File 'formula.rb', line 251 def active_log_type @active_log_type end |
#active_spec ⇒ 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.
The currently active SoftwareSpec.
195 196 197 |
# File 'formula.rb', line 195 def active_spec @active_spec end |
#active_spec_sym ⇒ 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.
A symbol to indicate currently active SoftwareSpec.
It's either :stable or :head.
201 202 203 |
# File 'formula.rb', line 201 def active_spec_sym @active_spec_sym end |
#alias_name ⇒ String? (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
143 144 145 |
# File 'formula.rb', line 143 def alias_name @alias_name end |
#alias_path ⇒ Pathname? (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
138 139 140 |
# File 'formula.rb', line 138 def alias_path @alias_path end |
#build ⇒ BuildOptions, Tab
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The BuildOptions or Tab for this Formula. Lists the arguments passed and any options in the Formula. Note that these may differ at different times during the installation of a Formula. This is annoying but is the result of state that we're trying to eliminate.
258 259 260 |
# File 'formula.rb', line 258 def build @build end |
#buildpath ⇒ Pathname?
The current working directory during builds.
Will only be non-nil inside #install.
234 235 236 |
# File 'formula.rb', line 234 def buildpath @buildpath end |
#compatibility_version ⇒ Integer? (readonly)
Used to indicate API/ABI compatibility for dependencies.
227 228 229 |
# File 'formula.rb', line 227 def compatibility_version @compatibility_version end |
#follow_installed_alias ⇒ Boolean 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.
269 270 271 |
# File 'formula.rb', line 269 def follow_installed_alias @follow_installed_alias end |
#force_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.
Whether or not to force the use of a bottle.
275 276 277 |
# File 'formula.rb', line 275 def force_bottle @force_bottle end |
#full_alias_name ⇒ String? (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
157 158 159 |
# File 'formula.rb', line 157 def full_alias_name @full_alias_name end |
#full_name ⇒ String (readonly)
151 152 153 |
# File 'formula.rb', line 151 def full_name @full_name end |
#head ⇒ SoftwareSpec? (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.
190 191 192 |
# File 'formula.rb', line 190 def head @head end |
#local_bottle_path ⇒ 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.
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.
246 247 248 |
# File 'formula.rb', line 246 def local_bottle_path @local_bottle_path end |
#name ⇒ String (readonly)
The name of this Formula.
e.g. this-formula
133 134 135 |
# File 'formula.rb', line 133 def name @name end |
#oldnames ⇒ Array<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.
905 906 907 908 909 910 911 912 913 |
# File 'formula.rb', line 905 def oldnames @oldnames ||= T.let(nil, T.nilable(T::Array[String])) @oldnames ||= if (tap = self.tap) oldnames = Tap.tap_migration_oldnames(tap, name) + tap.formula_reverse_renames.fetch(name, []) oldnames.reject { |oldname| Utils.name_from_full_name(oldname) == name } else [] end end |
#path ⇒ Pathname (readonly)
The full path to this Formula.
e.g. /usr/local/Library/Taps/homebrew/homebrew-core/Formula/t/this-formula.rb
164 165 166 |
# File 'formula.rb', line 164 def path @path end |
#pinned? ⇒ Boolean (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2158 |
# File 'formula.rb', line 2158 delegate pinned?: :@pin |
#pypi_packages_info ⇒ PypiPackages (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Information about PyPI mappings for this Formula is stored as PypiPackages object.
263 264 265 |
# File 'formula.rb', line 263 def pypi_packages_info @pypi_packages_info end |
#revision ⇒ Integer (readonly)
Used for creating new Homebrew versions of software without new upstream versions.
213 214 215 |
# File 'formula.rb', line 213 def revision @revision end |
#source_modified_time ⇒ Time? (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The most recent modified time for source files.
205 206 207 |
# File 'formula.rb', line 205 def source_modified_time @source_modified_time end |
#stable ⇒ SoftwareSpec? (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.
179 180 181 |
# File 'formula.rb', line 179 def stable @stable end |
#testpath ⇒ Pathname? (readonly)
The current working directory during tests.
Will only be non-nil inside test.
241 242 243 |
# File 'formula.rb', line 241 def testpath @testpath end |
#version_scheme ⇒ Integer (readonly)
Used to change version schemes for packages.
220 221 222 |
# File 'formula.rb', line 220 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.
2857 2858 2859 |
# File 'formula.rb', line 2857 def self.[](name) Formulary.factory(name) end |
.alias_full_names ⇒ 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.
An array of all aliases as fully-qualified names.
2844 2845 2846 |
# File 'formula.rb', line 2844 def self.alias_full_names @alias_full_names ||= T.let(core_aliases + tap_aliases, T.nilable(T::Array[String])) end |
.aliases ⇒ 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.
An array of all aliases.
2836 2837 2838 2839 2840 |
# File 'formula.rb', line 2836 def self.aliases @aliases ||= T.let((core_aliases + tap_aliases.map do |name| Utils.name_from_full_name(name) end).uniq.sort, T.nilable(T::Array[String])) end |
.all ⇒ Array<Formula>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
An array of each known trusted Formula.
2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 |
# File 'formula.rb', line 2762 def self.all trusted_tap_files = Homebrew::Trust.trusted_formula_files(tap_files) (core_names + trusted_tap_files).filter_map do |name_or_file| if name_or_file.is_a?(Pathname) Formulary.from_path(name_or_file) else Formulary.factory(name_or_file) end rescue FormulaUnavailableError, FormulaUnreadableError, FormulaSpecificationError => e # Don't let one broken formula break commands. But do complain. onoe "Failed to import: #{name_or_file}" $stderr.puts e nil end end |
.allow_network_access!(phases = []) ⇒ void
This method 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 phases are passed, network access will be denied
for all other phases. 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]
4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 |
# File 'formula.rb', line 4213 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) end network_access_allowed.transform_values! { false } phases_array.each { |phase| network_access_allowed[phase] = true } end end |
.autobump? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Is the formula in the autobump list?
5130 5131 5132 |
# File 'formula.rb', line 5130 def autobump? @autobump != false # @autobump may be `nil` end |
.bottle(&block) ⇒ void
This method returns an undefined value.
Adds a bottle SoftwareSpec. This provides a pre-built binary package built by the Homebrew maintainers for you. It will be installed automatically if there is a binary package for your platform and you haven't passed or previously used any options on this formula.
If you maintain your own repository, you can add your own bottle links. You can ignore this block entirely if submitting to Homebrew/homebrew-core. It'll be handled for you by the Brew Test Bot.
bottle do
root_url "https://example.com" # Optional root to calculate bottle URLs.
rebuild 1 # Marks the old bottle as outdated without bumping the version/revision of the formula.
# Optionally specify the HOMEBREW_CELLAR in which the bottles were built.
sha256 cellar: "/brew/Cellar", tahoe: "ef65c759c5097a36323fa9c77756468649e8d1980a3a4e05695c05e39568967c"
sha256 cellar: :any, sequoia: "28f4090610946a4eb207df102d841de23ced0d06ba31cb79e040d883906dcd4f"
sha256 sonoma: "91dd0caca9bd3f38c439d5a7b6f68440c4274945615fae035ff0a369264b8a2f"
end
Homebrew maintainers aim to bottle all formulae.
4536 |
# File 'formula.rb', line 4536 def bottle(&block) = stable.bottle(&block) |
.build ⇒ BuildOptions
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
4539 |
# File 'formula.rb', line 4539 def build = stable.build |
.build_flags ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
4545 4546 4547 |
# File 'formula.rb', line 4545 def build_flags formula_namespace&.const_get(:BUILD_FLAGS) || [] end |
.compatibility_version(val = nil) ⇒ Integer?
Used to indicate API/ABI compatibility for dependencies. If a formula has
a compatibility_version of 1, then it need not be upgraded when
installing or upgrading dependencies as long as dependencies are known to
work with versions of the formula that have compatibility_version 1.
nil if unset.
Example
compatibility_version 1
4426 4427 4428 |
# File 'formula.rb', line 4426 def compatibility_version(val = nil) val.nil? ? @compatibility_version : @compatibility_version = T.let(val, T.nilable(Integer)) end |
.conflicts_with(*names, because: nil, cask: nil) ⇒ 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"
4920 4921 4922 4923 4924 |
# File 'formula.rb', line 4920 def conflicts_with(*names, because: nil, cask: nil) raise ArgumentError, "`conflicts_with` needs at least one formula or cask" if names.empty? && cask.nil? names.each { |name| conflicts << FormulaConflict.new(name:, reason: because) } end |
.core_aliases ⇒ 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.
An array of all core aliases.
2824 2825 2826 |
# File 'formula.rb', line 2824 def self.core_aliases CoreTap.instance.aliases end |
.core_names ⇒ 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.
An array of all core Formula names.
2730 2731 2732 |
# File 'formula.rb', line 2730 def self.core_names CoreTap.instance.formula_names end |
.deny_network_access!(phases = []) ⇒ void
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]
4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 |
# File 'formula.rb', line 4247 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
:no_linkage declares that the formula does not link against this dependency.
It does not change when the dependency is required.
All declarations of the same dependency within a spec and platform must
agree on :no_linkage; stable, HEAD and different platforms may differ.
depends_on "python@3.14" => :no_linkage
On a :build dependency, such as a compiler, :no_linkage also lets an
outdated installed version be used when building from source, whatever
its compatibility_version.
depends_on "llvm" => [:build, :no_linkage]
:recommended dependencies are built by default.
But a --without-... option is generated to opt-out.
depends_on "readline" => :recommended
:optional dependencies are NOT built by default unless the
auto-generated --with-... option is passed.
depends_on "glib" => :optional
If you need to specify that another formula has to be built with/out
certain options (note, no -- needed before the option):
depends_on "zeromq" => "with-pgm"
depends_on "qt" => ["with-qtdbus", "developer"] # Multiple options.
Optional and enforce that "boost" is built using --with-c++11.
depends_on "boost" => [:optional, "with-c++11"]
If a dependency is only needed in certain cases:
depends_on xcode: :build # If the formula really needs full Xcode to compile.
depends_on macos: :sequoia # Needs at least macOS Sequoia (15) to run.
on_tahoe :or_newer do
depends_on "sqlite"
end
It is possible to only depend on something if
build.with? or build.without? "another_formula":
depends_on "postgresql" if build.without? "sqlite"
4787 4788 4789 4790 |
# File 'formula.rb', line 4787 def depends_on(dep) set_in_block = instance_variable_get(:@called_in_on_system_block) == true specs.each { |spec| spec.depends_on(dep, set_in_block:) } end |
.deprecate!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil) ⇒ void
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"
5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 |
# File 'formula.rb', line 5273 def deprecate!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil) if [replacement, replacement_formula, replacement_cask].filter_map(&:presence).length > 1 raise ArgumentError, "more than one of replacement, replacement_formula and/or replacement_cask specified!" end if replacement odeprecated( "deprecate!(:replacement)", "deprecate!(:replacement_formula) or deprecate!(:replacement_cask)", ) end @deprecate_args = T.let( { date:, because:, replacement_formula:, replacement_cask: }, T.nilable(T::Hash[Symbol, T.nilable(T.any(String, Symbol))]), ) deprecation_date = Date.parse(date) @deprecation_date = T.let(deprecation_date, T.nilable(Date)) @deprecated = T.let(deprecation_date <= Date.today, T.nilable(T::Boolean)) if @deprecated @deprecation_reason = T.let(because, T.nilable(T.any(String, Symbol))) @deprecation_replacement_formula = T.let(replacement_formula.presence || replacement, T.nilable(String)) @deprecation_replacement_cask = T.let(replacement_cask.presence || replacement, T.nilable(String)) else # Reset these to handle disable! before deprecate! @deprecation_reason = nil @deprecation_replacement_formula = nil @deprecation_replacement_cask = nil end end |
.deprecated? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this Formula is deprecated (i.e. warns on installation). Defaults to false.
5310 5311 5312 |
# File 'formula.rb', line 5310 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"
4842 4843 4844 |
# File 'formula.rb', line 4842 def deprecated_option(hash) specs.each { |spec| spec.deprecated_option(hash) } end |
.desc(val = 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"
4126 4127 4128 |
# File 'formula.rb', line 4126 def desc(val = nil) val.nil? ? @desc : @desc = T.let(val, T.nilable(String)) end |
.disable!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil) ⇒ void
replace legacy replacement with replacement_formula or replacement_cask
This method returns an undefined value.
Disables a Formula (on the given date) so it cannot be installed. If the date has not yet passed and there is no deprecate! date, then the formula will be deprecated.
Examples
disable! date: "2020-08-27", because: :does_not_build
disable! date: "2020-08-27", because: "has been replaced by foo"
disable! date: "2020-08-27", because: "has been replaced by foo", replacement_formula: "foo"
disable! date: "2020-08-27", because: "has been replaced by foo", replacement_cask: "foo"
5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 |
# File 'formula.rb', line 5384 def disable!(date:, because:, replacement: nil, replacement_formula: nil, replacement_cask: nil) if [replacement, replacement_formula, replacement_cask].filter_map(&:presence).length > 1 raise ArgumentError, "more than one of replacement, replacement_formula and/or replacement_cask specified!" end if replacement odeprecated( "disable!(:replacement)", "disable!(:replacement_formula) or disable!(:replacement_cask)", ) end @disable_args = T.let( { date:, because:, replacement_formula:, replacement_cask: }, T.nilable(T::Hash[Symbol, T.nilable(T.any(String, Symbol))]), ) disable_date = Date.parse(date) @disable_date = T.let(disable_date, T.nilable(Date)) if disable_date > Date.today return if @deprecation_date.present? @deprecation_reason = T.let(because, T.nilable(T.any(String, Symbol))) @deprecation_replacement_formula = T.let(replacement_formula.presence || replacement, T.nilable(String)) @deprecation_replacement_cask = T.let(replacement_cask.presence || replacement, T.nilable(String)) @deprecated = T.let(true, T.nilable(T::Boolean)) return end @disable_reason = T.let(because, T.nilable(T.any(String, Symbol))) @disable_replacement_formula = T.let(replacement_formula.presence || replacement, T.nilable(String)) @disable_replacement_cask = T.let(replacement_cask.presence || replacement, T.nilable(String)) @disabled = T.let(true, T.nilable(T::Boolean)) end |
.disabled? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this Formula is disabled (i.e. cannot be installed). Defaults to false.
5425 5426 5427 |
# File 'formula.rb', line 5425 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
5041 5042 5043 |
# File 'formula.rb', line 5041 def fails_with(compiler, &block) specs.each { |spec| spec.fails_with(compiler, &block) } end |
.formula_namespace ⇒ T::Module[T.anything]?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
4550 4551 4552 4553 4554 4555 |
# File 'formula.rb', line 4550 def formula_namespace namespace = Utils.deconstantize(to_s) return if namespace.empty? const_get(namespace) end |
.freeze ⇒ T.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.
4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 |
# File 'formula.rb', line 4071 def freeze specs.each(&:freeze) @livecheck.freeze @conflicts.freeze @skip_clean_paths.freeze @link_overwrite_paths.freeze @post_install_steps.freeze @preserve_rpath&.freeze super end |
.full_names ⇒ 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.
An array of all Formula names, which the tap formulae have as the fully-qualified name.
2756 2757 2758 |
# File 'formula.rb', line 2756 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.
2850 2851 2852 2853 2854 |
# File 'formula.rb', line 2850 def self.fuzzy_search(name) @spell_checker ||= T.let(DidYouMean::SpellChecker.new(dictionary: Set.new(names + full_names).to_a), T.nilable(DidYouMean::SpellChecker)) T.cast(@spell_checker.correct(name), T::Array[String]) end |
.head(val = nil, specs = {}, &block) ⇒ T.untyped
Adds a head SoftwareSpec.
This can be installed by passing the --HEAD option to allow
installing software directly from a branch of a version-control repository.
If called as a method this provides just the url for the SoftwareSpec.
If a block is provided you can also add depends_on and Patches just to the head SoftwareSpec.
The download strategies (e.g. :using =>) are the same as for url.
Git repositories must always specify branch:.
Example
head "https://we.prefer.https.over.git.example.com/.git", branch: "main"
head "https://example.com/.git", branch: "name_of_branch"
or (if autodetect fails):
head "https://hg.is.awesome.but.git.has.won.example.com/", using: :hg
4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 |
# File 'formula.rb', line 4619 def head(val = nil, specs = {}, &block) return @head if block.nil? && val.nil? head = @head raise ArgumentError, "#{self} has no head spec" if head.nil? if block head.instance_eval(&block) else head.url(val, specs) end end |
.homepage(val = nil, browsed: 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", browsed: "2026-07-26"
browsed is the date when a human last checked the homepage in a browser.
Automated homepage availability audits are skipped for one year.
4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 |
# File 'formula.rb', line 4325 def homepage(val = nil, browsed: nil) if val.nil? raise ArgumentError, "`browsed` requires a homepage URL" if browsed return @homepage end @homepage_browsed = Date.parse(browsed) if browsed @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.
4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 |
# File 'formula.rb', line 4045 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 = [] @skip_clean_paths = Set.new @link_overwrite_paths = Set.new @post_install_steps = T.let([], T.nilable(Homebrew::InstallSteps::Steps)) @post_install_steps_defined = T.let(false, T.nilable(T::Boolean)) @loaded_from_api = T.let(false, T.nilable(T::Boolean)) @loaded_from_internal_api = T.let(false, T.nilable(T::Boolean)) @api_source = T.let(nil, T.nilable(T::Hash[String, T.untyped])) @on_system_blocks_exist = T.let(false, T.nilable(T::Boolean)) @homepage_browsed = T.let(nil, T.nilable(Date)) @network_access_allowed = SUPPORTED_NETWORK_ACCESS_PHASES.to_h do |phase| [phase, DEFAULT_NETWORK_ACCESS_ALLOWED] end @preserve_rpath = T.let(false, T.nilable(T::Boolean)) @pypi_packages_info = T.let(nil, T.nilable(PypiPackages)) end end |
.installed ⇒ 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 installed Formulae.
2807 2808 2809 2810 2811 2812 2813 |
# File 'formula.rb', line 2807 def self.installed Formula.cache[:installed] ||= racks.flat_map do |rack| Formulary.from_rack(rack) rescue [] end.uniq(&:name) end |
.installed_formula_names ⇒ 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.
An array of all currently installed formula names.
2801 2802 2803 |
# File 'formula.rb', line 2801 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.
2816 2817 2818 2819 2820 |
# File 'formula.rb', line 2816 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"
5005 5006 5007 |
# File 'formula.rb', line 5005 def keg_only(reason, explanation = "") @keg_only_reason = T.let(KegOnlyReason.new(reason, explanation), T.nilable(KegOnlyReason)) end |
.license(args = nil) ⇒ SPDX::LicenseExpression?
The SPDX ID of the open-source license that the formula uses.
Shows when running brew info.
Use :any_of, :all_of or :with to describe complex license expressions.
:any_of should be used when the user can choose which license to use.
:all_of should be used when the user must use all licenses.
:with should be used to specify a valid SPDX exception.
Add + to an identifier to indicate that the formula can be
licensed under later versions of the same license.
Examples
license "BSD-2-Clause"
license "EPL-1.0+"
license any_of: ["MIT", "GPL-2.0-only"]
license all_of: ["MIT", "GPL-2.0-only"]
license "GPL-2.0-only" => { with: "LLVM-exception" }
license :public_domain
license any_of: [
"MIT",
:public_domain,
all_of: ["0BSD", "Zlib", "Artistic-1.0+"],
"Apache-2.0" => { with: "LLVM-exception" },
]
4183 4184 4185 4186 4187 4188 4189 |
# File 'formula.rb', line 4183 def license(args = nil) if args.nil? @licenses else @licenses = T.let(args, T.nilable(SPDX::LicenseExpression)) end end |
.link_overwrite(*paths) ⇒ Set<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.
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-*"
5480 5481 5482 5483 |
# File 'formula.rb', line 5480 def link_overwrite(*paths) paths.flatten! 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
5101 5102 5103 5104 5105 5106 |
# File 'formula.rb', line 5101 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.
4344 4345 4346 |
# File 'formula.rb', line 4344 def livecheck_defined? @livecheck_defined == true end |
.loaded_from_api? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this formula was loaded using the formulae.brew.sh API.
4087 |
# File 'formula.rb', line 4087 def loaded_from_api? = !!@loaded_from_api |
.loaded_from_internal_api? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this formula was loaded using the internal formulae.brew.sh API.
4091 |
# File 'formula.rb', line 4091 def loaded_from_internal_api? = !!@loaded_from_internal_api |
.loaded_from_metadata? ⇒ 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 from installed metadata.
4095 |
# File 'formula.rb', line 4095 def = !!formula_namespace&.const_defined?(:LOADED_FROM_METADATA, false) |
.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
4493 |
# File 'formula.rb', line 4493 def mirror(val) = stable.mirror(val) |
.names ⇒ 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.
An array of all Formula names.
2748 2749 2750 2751 2752 |
# File 'formula.rb', line 2748 def self.names @names ||= T.let((core_names + tap_names.map do |name| Utils.name_from_full_name(name) end).uniq.sort, T.nilable(T::Array[String])) end |
.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.
4262 4263 4264 4265 4266 4267 |
# File 'formula.rb', line 4262 def network_access_allowed?(phase) raise ArgumentError, "Unknown phase: #{phase}" unless SUPPORTED_NETWORK_ACCESS_PHASES.include?(phase) env_var = Homebrew::EnvConfig.public_send(:"formula_#{phase}_network") env_var.nil? ? network_access_allowed[phase] : env_var == "allow" end |
.no_autobump!(because:) ⇒ void
This method returns an undefined value.
Exclude the formula from the autobump list.
5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 |
# File 'formula.rb', line 5112 def no_autobump!(because:) caller_path = caller_locations(1, 1)&.first&.path if caller_path tap = Tap.from_path(caller_path) raise ArgumentError, "no_autobump! can only be used in official Homebrew taps." if tap && !tap.official? end if because.is_a?(Symbol) && !NO_AUTOBUMP_REASONS_LIST.key?(because) && ! raise ArgumentError, "'because' argument should use valid symbol or a string!" end @no_autobump_defined = T.let(true, T.nilable(T::Boolean)) @no_autobump_message = T.let(because, T.nilable(T.any(String, Symbol))) @autobump = T.let(false, T.nilable(T::Boolean)) end |
.on_arch_conditional(arm: nil, intel: nil) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
308 |
# File 'sorbet/rbi/dsl/formula.rbi', line 308 def on_arch_conditional(arm: nil, intel: nil); end |
.on_arm(&block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
316 |
# File 'sorbet/rbi/dsl/formula.rbi', line 316 def on_arm(&block); end |
.on_big_sur(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
325 |
# File 'sorbet/rbi/dsl/formula.rbi', line 325 def on_big_sur(or_condition = nil, &block); end |
.on_golden_gate(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
334 |
# File 'sorbet/rbi/dsl/formula.rbi', line 334 def on_golden_gate(or_condition = nil, &block); end |
.on_intel(&block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
342 |
# File 'sorbet/rbi/dsl/formula.rbi', line 342 def on_intel(&block); end |
.on_linux(&block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
350 |
# File 'sorbet/rbi/dsl/formula.rbi', line 350 def on_linux(&block); end |
.on_macos(&block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
358 |
# File 'sorbet/rbi/dsl/formula.rbi', line 358 def on_macos(&block); end |
.on_monterey(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
367 |
# File 'sorbet/rbi/dsl/formula.rbi', line 367 def on_monterey(or_condition = nil, &block); end |
.on_sequoia(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
376 |
# File 'sorbet/rbi/dsl/formula.rbi', line 376 def on_sequoia(or_condition = nil, &block); end |
.on_sonoma(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
385 |
# File 'sorbet/rbi/dsl/formula.rbi', line 385 def on_sonoma(or_condition = nil, &block); end |
.on_system(linux, macos:, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
395 |
# File 'sorbet/rbi/dsl/formula.rbi', line 395 def on_system(linux, macos:, &block); end |
.on_system_blocks_exist? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
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).
4104 |
# File 'formula.rb', line 4104 def on_system_blocks_exist? = !!@on_system_blocks_exist |
.on_system_conditional(macos: nil, linux: nil) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
404 |
# File 'sorbet/rbi/dsl/formula.rbi', line 404 def on_system_conditional(macos: nil, linux: nil); end |
.on_tahoe(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
413 |
# File 'sorbet/rbi/dsl/formula.rbi', line 413 def on_tahoe(or_condition = nil, &block); end |
.on_ventura(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
422 |
# File 'sorbet/rbi/dsl/formula.rbi', line 422 def on_ventura(or_condition = nil, &block); end |
.option(name, description = "") ⇒ void
This method returns an undefined value.
Options can be used as arguments to brew install.
To switch features on/off: "with-something" or "with-otherthing".
To use other software: "with-other-software" or "without-foo".
Note that for depends_on that are :optional or :recommended, options
are generated automatically.
Examples
option "with-spam", "The description goes here without a dot at the end"
option "with-qt", "Text here overwrites what's autogenerated by 'depends_on "qt" => :optional'"
4826 4827 4828 |
# File 'formula.rb', line 4826 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, "..."
4903 4904 4905 |
# File 'formula.rb', line 4903 def patch(strip = :p1, src = nil, &block) specs.each { |spec| spec.patch(strip, src, &block) } end |
.post_install_steps(*steps, &block) ⇒ Homebrew::InstallSteps::Steps
Declarative steps to run after bottle installation.
Example
post_install_steps do
mkdir_p "log/foo", base: :var
end
4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 |
# File 'formula.rb', line 4291 def post_install_steps(*steps, &block) current_steps = @post_install_steps || [] return current_steps if steps.empty? && block.nil? @post_install_steps_defined = T.let(true, T.nilable(T::Boolean)) current_steps.concat( if block Homebrew::InstallSteps::DSL.build( default_source_base: :prefix, default_target_base: :prefix, &block ) else Homebrew::InstallSteps::DSL.normalise_steps(steps) end, ) end |
.post_install_steps_defined? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
4270 |
# File 'formula.rb', line 4270 def post_install_steps_defined? = @post_install_steps_defined == true |
.pour_bottle?(only_if: nil, &block) ⇒ void
This method returns an undefined value.
Defines whether the Formula's bottle can be used on the given Homebrew installation.
Examples
If the bottle requires the Xcode CLT to be installed a Formula would declare:
pour_bottle? do
reason "The bottle needs the Xcode CLT to be installed."
satisfy { MacOS::CLT.installed? }
end
If satisfy returns false then a bottle will not be used and instead
the Formula will be built from source and reason will be printed.
Alternatively, a preset reason can be passed as a symbol:
pour_bottle? only_if: :clt_installed
5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 |
# File 'formula.rb', line 5199 def pour_bottle?(only_if: nil, &block) pour_bottle_check = PourBottleCheck.new(self) @pour_bottle_check = T.let(pour_bottle_check, 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 bottle_check_block = 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 raise ArgumentError, "`pour_bottle?` requires a preset condition or a block" if bottle_check_block.nil? pour_bottle_check.instance_exec(pour_bottle_check, &bottle_check_block) end |
.preserve_rpath(value: true) ⇒ Boolean
Preserve @rpath install names when fixing dynamic linkage on macOS.
By default, Homebrew rewrites library install names (including those starting
with @rpath) to use absolute paths. This can break tools like macdeployqt
that expect @rpath-based install names to remain unchanged.
Call this method to skip rewriting install names that start with @rpath.
Example
preserve_rpath
4968 4969 4970 |
# File 'formula.rb', line 4968 def preserve_rpath(value: true) @preserve_rpath = value end |
.preserve_rpath? ⇒ Boolean
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Check if @rpath install names should be preserved.
4976 4977 4978 |
# File 'formula.rb', line 4976 def preserve_rpath? @preserve_rpath == true end |
.pypi_packages(package_name: nil, extra_packages: nil, exclude_packages: nil, dependencies: nil) ⇒ void
This method returns an undefined value.
Adds information about PyPI formula mapping as PypiPackages object. It provides a way to specify package name in PyPI repository, define extra packages, or remove them (e.g. if formula installs them as a dependency).
Examples of usage:
# It will use information about the PyPI package `foo` to update resources
pypi_packages package_name: "foo"
Add "extra" packages and remove unneeded ones
depends_on "numpy"
pypi_packages extra_packages: "setuptools", exclude_packages: "numpy"
# Special case: empty `package_name` allows to skip resource updates for non-extra packages
pypi_packages package_name: "", extra_packages: "setuptools"
4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 |
# File 'formula.rb', line 4659 def pypi_packages( package_name: nil, extra_packages: nil, exclude_packages: nil, dependencies: nil ) if [package_name, extra_packages, exclude_packages, dependencies].all?(&:nil?) raise ArgumentError, "must provide at least one argument" end # Sadly `v1, v2, v3 = [v1, v2, v3].map { |x| Array(x) }` does not work # for typechecker extra_packages = Array(extra_packages) exclude_packages = Array(exclude_packages) dependencies = Array(dependencies) @pypi_packages_info = PypiPackages.new(package_name:, extra_packages:, exclude_packages:, dependencies:) end |
.python_major_minor_version(python) ⇒ Version?
Returns the major.minor Version for the given Python executable,
as a shorthand for Language::Python.major_minor_version in the formula DSL.
5492 5493 5494 |
# File 'formula.rb', line 5492 def python_major_minor_version(python) Language::Python.major_minor_version(python) end |
.rack_installed?(name) ⇒ 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 rack for a formula name, with or without a tap prefix, holds a keg.
2794 2795 2796 2797 |
# File 'formula.rb', line 2794 def self.rack_installed?(name) rack = HOMEBREW_CELLAR/Utils.name_from_full_name(name) rack.directory? && !rack.subdirs.empty? end |
.racks ⇒ Array<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.
2782 2783 2784 2785 2786 2787 2788 2789 2790 |
# File 'formula.rb', line 2782 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.
Pass :test as the second argument for resources only needed by test.
These are fetched by brew fetch --test or before the test sandbox starts.
Example
resource "additional_files" do
url "https://example.com/additional-stuff.tar.gz"
sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
end
4698 4699 4700 4701 4702 |
# File 'formula.rb', line 4698 def resource(name, klass = Resource, &block) specs.each do |spec| spec.resource(name, klass, &block) unless spec.resource_defined?(name) end end |
.revision(val = 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
4388 4389 4390 |
# File 'formula.rb', line 4388 def revision(val = nil) val.nil? ? @revision : @revision = T.let(val, T.nilable(Integer)) end |
.service(&block) ⇒ T.proc.void?
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
5162 5163 5164 5165 5166 |
# File 'formula.rb', line 5162 def service(&block) return @service_block unless block @service_block = T.let(block, T.nilable(T.proc.void)) 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.
4353 4354 4355 |
# File 'formula.rb', line 4353 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"
4509 |
# File 'formula.rb', line 4509 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
4946 4947 4948 4949 4950 |
# File 'formula.rb', line 4946 def skip_clean(*paths) paths.flatten! # Specifying :all is deprecated and will become an error skip_clean_paths.merge(paths) end |
.spec_syms ⇒ Array<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.
4431 |
# File 'formula.rb', line 4431 def spec_syms = [:stable, :head].freeze |
.specs ⇒ Array<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.
4435 |
# File 'formula.rb', line 4435 def specs = [stable, head].freeze |
.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
4577 4578 4579 4580 4581 4582 4583 |
# File 'formula.rb', line 4577 def stable(&block) stable = @stable raise ArgumentError, "#{self} has no stable spec" if stable.nil? return stable unless block stable.instance_eval(&block) end |
.tap_aliases ⇒ 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.
An array of all tap aliases.
2830 2831 2832 |
# File 'formula.rb', line 2830 def self.tap_aliases @tap_aliases ||= T.let(Tap.reject(&:core_tap?).flat_map(&:aliases).sort, T.nilable(T::Array[String])) end |
.tap_files ⇒ Array<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.
2742 2743 2744 |
# File 'formula.rb', line 2742 def self.tap_files @tap_files ||= T.let(Tap.reject(&:core_tap?).flat_map(&:formula_files), T.nilable(T::Array[Pathname])) end |
.tap_names ⇒ 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.
An array of all tap Formula names.
2736 2737 2738 |
# File 'formula.rb', line 2736 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) ⇒ void
This method returns an undefined value.
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.
5081 |
# File 'formula.rb', line 5081 def test(&block) = define_method(:test, &block) |
.url(val = 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,:fossil,:cvs,:curl(normal file download, will also extract):homebrew_curl(use brewedcurl):nounzip(without extracting):post(download via an HTTP POST request)
Examples
url "https://packed.sources.and.we.prefer.https.example.com/archive-1.2.3.tar.bz2"
url "https://some.dont.provide.archives.example.com",
using: :git,
tag: "1.2.3",
revision: "db8e4de5b2d6653f66aea53094624468caad15d2"
4462 |
# File 'formula.rb', line 4462 def url(val = 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.
4804 4805 4806 |
# File 'formula.rb', line 4804 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"
4476 |
# File 'formula.rb', line 4476 def version(val = nil) = stable.version(val) |
.version_scheme(val = 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
4408 4409 4410 |
# File 'formula.rb', line 4408 def version_scheme(val = nil) val.nil? ? @version_scheme : @version_scheme = T.let(val, T.nilable(Integer)) end |
Instance Method Details
#active_log_prefix ⇒ 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.
The prefix, if any, to use in filenames for logging current activity.
1496 1497 1498 1499 1500 1501 1502 |
# File 'formula.rb', line 1496 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?
2122 2123 2124 |
# File 'formula.rb', line 2122 def alias_changed? installed_alias_target_changed? || supersedes_an_installed_formula? end |
#aliases ⇒ Array<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.
922 923 924 925 926 927 928 929 930 |
# File 'formula.rb', line 922 def aliases @aliases ||= T.let( if (tap = self.tap) tap.alias_reverse_table.fetch(full_name, []).map { Utils.name_from_full_name(it) } else [] end, T.nilable(T::Array[String]) ) end |
#allow_network_access!(*args, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
10 |
# File 'sorbet/rbi/dsl/formula.rbi', line 10 def allow_network_access!(*args, &block); end |
#any_installed_keg ⇒ 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.
Returns a Keg for the opt_prefix or installed_prefix if they exist.
If not, return nil.
2966 2967 2968 2969 2970 2971 |
# File 'formula.rb', line 2966 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_prefix ⇒ Pathname?
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.
2977 2978 2979 2980 2981 2982 2983 |
# File 'formula.rb', line 2977 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_version ⇒ PkgVersion?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the PkgVersion for this formula if it is installed.
If not, return nil.
2988 2989 2990 |
# File 'formula.rb', line 2988 def any_installed_version any_installed_keg&.version end |
#any_version_installed? ⇒ Boolean
If at least one version of Formula is installed.
1002 1003 1004 |
# File 'formula.rb', line 1002 def any_version_installed? installed_prefixes.any? { |keg| (keg/AbstractTab::FILENAME).file? } end |
#api_source ⇒ 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.
The API source data used to load this formula.
Returns nil if the formula was not loaded from the API.
671 |
# File 'formula.rb', line 671 delegate api_source: :"self.class" |
#autobump? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Is the formula in the autobump list?
635 |
# File 'formula.rb', line 635 delegate autobump?: :"self.class" |
#bash_completion ⇒ Pathname
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.
1455 |
# File 'formula.rb', line 1455 def bash_completion = prefix/"etc/bash_completion.d" |
#bin ⇒ Pathname
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"
1153 |
# File 'formula.rb', line 1153 def bin = prefix/"bin" |
#bottle ⇒ 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 the currently active SoftwareSpec.
581 582 583 584 |
# File 'formula.rb', line 581 def bottle bottle = @bottle_candidate ||= T.let(bottle_for_tag(Utils::Bottles.tag), T.nilable(Bottle)) bottle if bottle && (force_bottle || bottle.compatible_locations?) 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.
19 |
# File 'sorbet/rbi/dsl/formula.rbi', line 19 def bottle_defined?(*args, &block); end |
#bottle_for_tag(tag = nil) ⇒ Bottle?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The Bottle object for given tag.
588 589 590 |
# File 'formula.rb', line 588 def bottle_for_tag(tag = nil) Bottle.new(self, bottle_specification, tag) if bottled?(tag) end |
#bottle_hash ⇒ 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 the bottle information for a formula.
3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 |
# File 'formula.rb', line 3286 def bottle_hash hash = {} stable_spec = stable return hash unless stable_spec return hash unless bottle_defined? bottle_spec = stable_spec.bottle_specification hash["rebuild"] = bottle_spec.rebuild hash["root_url"] = bottle_spec.root_url hash["files"] = {} bottle_spec.collector.each_tag do |tag| tag_spec = bottle_spec.collector.specification_for(tag, no_older_versions: true) odie "Specification for tag #{tag} is nil" if tag_spec.nil? os_cellar = tag_spec.cellar os_cellar = os_cellar.inspect if os_cellar.is_a?(Symbol) checksum = tag_spec.checksum.hexdigest file_hash = {} file_hash["cellar"] = os_cellar filename = Bottle::Filename.create(self, tag, bottle_spec.rebuild) path, = Utils::Bottles.path_resolved_basename(bottle_spec.root_url, name, checksum, filename) file_hash["url"] = "#{bottle_spec.root_url}/#{path}" file_hash["sha256"] = checksum hash["files"][tag.to_sym] = file_hash end hash end |
#bottle_prefix ⇒ 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 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.
1488 |
# File 'formula.rb', line 1488 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.
22 |
# File 'sorbet/rbi/dsl/formula.rbi', line 22 def bottle_specification(*args, &block); end |
#bottle_tab_attributes ⇒ 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.
3920 3921 3922 |
# File 'formula.rb', line 3920 def bottle_tab_attributes 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.
25 |
# File 'sorbet/rbi/dsl/formula.rbi', line 25 def bottle_tag?(*args, &block); end |
#bottled?(*args, &block) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
28 |
# File 'sorbet/rbi/dsl/formula.rbi', line 28 def bottled?(*args, &block); end |
#brew(fetch: true, keep_tmp: false, debug_symbols: false, interactive: false, staging_path: nil, staged: 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.
With staging_path, the tarball is uncompressed into that directory rather
than a fresh temporary one and, with staged, its already uncompressed and
patched contents are reused so the fetch and build phases share it.
1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 |
# File 'formula.rb', line 1982 def brew(fetch: true, keep_tmp: false, debug_symbols: false, interactive: false, staging_path: nil, staged: false, &_blk) @prefix_returns_versioned_prefix = T.let(true, T.nilable(T::Boolean)) active_spec.fetch if fetch stage(interactive:, debug_symbols:, staging_path:, staged:) 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.
31 |
# File 'sorbet/rbi/dsl/formula.rbi', line 31 def cached_download(*args, &block); end |
#caveats ⇒ 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.
Warn the user about any Homebrew-specific issues or quirks for this package. These should not contain setup instructions that would apply to installation through a different package manager on a different OS.
Example
def caveats
<<~EOS
Are optional. Something the user must be warned about?
EOS
end
def caveats
s = <<~EOS
Print some important notice to the user when `brew info [formula]` is
called or when brewing a formula.
This is optional. You can use all the vars like #{version} here.
EOS
s += "Some issue only on older systems" if MacOS.version < :monterey
s
end
1804 |
# File 'formula.rb', line 1804 def caveats = nil |
#caveats_with_placeholders ⇒ 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.
3393 3394 3395 3396 |
# File 'formula.rb', line 3393 def caveats_with_placeholders caveats&.gsub(HOMEBREW_PREFIX, HOMEBREW_PREFIX_PLACEHOLDER) &.gsub(HOMEBREW_CELLAR, HOMEBREW_CELLAR_PLACEHOLDER) end |
#change_dylib_id(file, id, resolve_source: false) ⇒ void
This method returns an undefined value.
Changes the dynamic library ID of one Mach-O file and codesigns it on
Apple Silicon. The source and new ID are both explicit. Set
resolve_source: true to edit the target of a source symlink.
Examples
change_dylib_id lib/"libfoo.dylib", opt_lib/"libfoo.dylib"
change_dylib_id lib/"libfoo.dylib", "@rpath/libfoo.1.dylib", resolve_source: true
2509 2510 2511 |
# File 'formula.rb', line 2509 def change_dylib_id(file, id, resolve_source: false) Homebrew::InstallSteps.change_dylib_id(file, id, resolve_source:) 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.
34 |
# File 'sorbet/rbi/dsl/formula.rbi', line 34 def clear_cache(*args, &block); end |
#common_sandbox_env(home) ⇒ Hash{Symbol => 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.
Common environment variables used by sandboxed fetch, build, test and postinstall phases.
3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 |
# File 'formula.rb', line 3926 def common_sandbox_env(home) env = Homebrew::PackageManagerCache.env env.merge( _JAVA_OPTIONS: [env[:_JAVA_OPTIONS], "-Djava.io.tmpdir=#{HOMEBREW_TEMP}"].compact.join(" "), HOME: home.to_s, TMPDIR: HOMEBREW_TEMP.to_s, TEMP: HOMEBREW_TEMP.to_s, TMP: HOMEBREW_TEMP.to_s, GIT_CONFIG_GLOBAL: Utils::Git.no_global_config_file, GIT_TERMINAL_PROMPT: "0", GOENV: "off", # TODO: Enable when `min-publish-age` stabilises in Cargo 1.100, # expected with Rust 1.100 on 2026-11-12. # https://github.com/rust-lang/cargo/pull/17335 # CARGO_REGISTRY_GLOBAL_MIN_PUBLISH_AGE: Utils.pluralize("day", Homebrew::RELEASE_COOLDOWN_DAYS, # include_count: true), BUNDLE_COOLDOWN: Homebrew::RELEASE_COOLDOWN_DAYS.to_s, PIP_CONFIG_FILE: File::NULL, NPM_CONFIG_USERCONFIG: File::NULL, CURL_HOME: ENV.fetch("CURL_HOME") { home.to_s }, PYTHONDONTWRITEBYTECODE: "1", XDG_CONFIG_HOME: "#{home}/.config", ) 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.
37 |
# File 'sorbet/rbi/dsl/formula.rbi', line 37 def compiler_failures(*args, &block); end |
#conflicts ⇒ Array<FormulaConflict>
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns a list of FormulaConflict objects indicating any formulae that conflict with this one and why.
2916 |
# File 'formula.rb', line 2916 def conflicts = self.class.conflicts |
#core_formula? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
True if this formula is provided by Homebrew itself.
2863 2864 2865 |
# File 'formula.rb', line 2863 def core_formula? !!tap&.core_tap? end |
#current_installed_alias_target ⇒ 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.
2100 2101 2102 2103 |
# File 'formula.rb', line 2100 def current_installed_alias_target alias_name = full_installed_alias_name Formulary.factory(alias_name) if alias_name 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.
40 |
# File 'sorbet/rbi/dsl/formula.rbi', line 40 def declared_deps(*args, &block); end |
#deny_network_access!(*args, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
43 |
# File 'sorbet/rbi/dsl/formula.rbi', line 43 def deny_network_access!(*args, &block); end |
#dependencies_hash ⇒ 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.
3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 |
# File 'formula.rb', line 3399 def dependencies_hash # Create a hash of spec names (stable/head) to the list of dependencies under each dependencies = { stable: stable&.declared_deps, head: head&.declared_deps } # 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 dep_hash["no_linkage_dependencies"] = spec_deps.select(&:no_linkage?) .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..length >= 2 { dep.name => dep. } elsif dep..present? { dep.name => dep..first } else dep.name end end dep_hash["uses_from_macos_bounds"] = uses_from_macos_deps.map(&:bounds) end hash end |
#deprecate_args ⇒ 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.
The arguments that were used to deprecate this Formula.
Returns nil if deprecate! was not called.
1903 |
# File 'formula.rb', line 1903 delegate deprecate_args: :"self.class" |
#deprecated? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this Formula is deprecated (i.e. warns on installation). Defaults to false.
1868 |
# File 'formula.rb', line 1868 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.
52 |
# File 'sorbet/rbi/dsl/formula.rbi', line 52 def deprecated_flags(*args, &block); end |
#deprecated_options(*args, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
55 |
# File 'sorbet/rbi/dsl/formula.rbi', line 55 def (*args, &block); end |
#deprecation_date ⇒ 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.
The date that this Formula was or becomes deprecated.
Returns nil if no date is specified.
1875 |
# File 'formula.rb', line 1875 delegate deprecation_date: :"self.class" |
#deprecation_reason ⇒ 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.
The reason this Formula is deprecated.
Returns nil if no reason is specified or the formula is not deprecated.
1882 |
# File 'formula.rb', line 1882 delegate deprecation_reason: :"self.class" |
#deprecation_replacement_cask ⇒ 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.
The replacement cask for this deprecated Formula.
Returns nil if no replacement is specified or the formula is not deprecated.
1896 |
# File 'formula.rb', line 1896 delegate deprecation_replacement_cask: :"self.class" |
#deprecation_replacement_formula ⇒ 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.
The replacement formula for this deprecated Formula.
Returns nil if no replacement is specified or the formula is not deprecated.
1889 |
# File 'formula.rb', line 1889 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.
70 |
# File 'sorbet/rbi/dsl/formula.rbi', line 70 def deps(*args, &block); end |
#desc ⇒ 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.
The description of the software.
595 |
# File 'formula.rb', line 595 delegate desc: :"self.class" |
#deuniversalize_machos(*targets) ⇒ void
2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 |
# File 'formula.rb', line 2522 def deuniversalize_machos(*targets) if targets.none? # Prefer `prefix` to `any_installed_keg`: during an upgrade the latter # is the old opt-linked keg rather than the keg being installed. keg = prefix.directory? ? Keg.new(prefix) : any_installed_keg targets = keg&.mach_o_files&.select do |file| file.arch == :universal && file.archs.include?(Hardware::CPU.arch) end end raise "No universal binaries found to deuniversalize" if targets.blank? targets.compact.each do |target| target = MachOPathname.wrap(target) extract_macho_slice_from(target, Hardware::CPU.arch) end end |
#disable_args ⇒ 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.
The arguments that were used to disable this Formula.
Returns nil if disable! was not called.
1945 |
# File 'formula.rb', line 1945 delegate disable_args: :"self.class" |
#disable_date ⇒ 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.
The date that this Formula was or becomes disabled.
Returns nil if no date is specified.
1917 |
# File 'formula.rb', line 1917 delegate disable_date: :"self.class" |
#disable_reason ⇒ 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.
The reason this Formula is disabled.
Returns nil if no reason is specified or the formula is not disabled.
1924 |
# File 'formula.rb', line 1924 delegate disable_reason: :"self.class" |
#disable_replacement_cask ⇒ 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.
The replacement cask for this disabled Formula.
Returns nil if no replacement is specified or the formula is not disabled.
1938 |
# File 'formula.rb', line 1938 delegate disable_replacement_cask: :"self.class" |
#disable_replacement_formula ⇒ 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.
The replacement formula for this disabled Formula.
Returns nil if no replacement is specified or the formula is not disabled.
1931 |
# File 'formula.rb', line 1931 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.
1910 |
# File 'formula.rb', line 1910 delegate disabled?: :"self.class" |
#doc ⇒ Pathname
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.
1161 |
# File 'formula.rb', line 1161 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.
94 |
# File 'sorbet/rbi/dsl/formula.rbi', line 94 def downloader(*args, &block); end |
#eligible_kegs_for_cleanup(quiet: false) ⇒ Array<Keg>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 |
# File 'formula.rb', line 3811 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? } stable = stable.sort_by(&:scheme_and_version) # Remove newest head and stable kegs. stable.pop head - [Keg.new(head_prefix)] + stable 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(resolved_path(@pin.path)) opoo "Skipping (old) #{keg} due to it being pinned" unless quiet elsif (keepme_refs = keg.keepme_refs.presence) opoo "Skipping #{keg} as it is needed by #{keepme_refs.join(", ")}" unless quiet else eligible_for_cleanup << keg end end end elsif !installed_prefixes.empty? && !pinned? # If the rack only has one version installed, don't complain # that we can't tell which one to keep. Don't complain at all if the # only installed version is a pinned formula. opoo "Skipping #{full_name}: most recent version #{pkg_version} not installed" unless quiet end eligible_for_cleanup end |
#elisp ⇒ Pathname
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"
1383 |
# File 'formula.rb', line 1383 def elisp = prefix/"share/emacs/site-lisp"/name |
#enqueue_resources_and_patches(download_queue:, test: 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.
3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 |
# File 'formula.rb', line 3897 def enqueue_resources_and_patches(download_queue:, test: false) resources.each do |resource| next if resource.test? != test download_queue.enqueue(resource) resource.patches.select(&:external?).each { |patch| download_queue.enqueue(patch.resource) } end return if test patchlist.select(&:external?).each { |patch| download_queue.enqueue(patch.resource) } end |
#ensure_installed!(reason: "", latest: false, output_to_stderr: true, quiet: false, executable: nil, version_args: ["--version"]) ⇒ T.self_type, Pathname
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Ensure the given formula is installed.
This is useful for installing a utility formula (e.g. shellcheck for brew style).
When executable is provided, a matching system executable in ORIGINAL_PATHS
can satisfy the request without installing the formula. When latest is true,
the system executable's version is checked with version_args first.
Returns the executable path if executable is provided, otherwise the formula.
381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 |
# File 'formula.rb', line 381 def ensure_installed!(reason: "", latest: false, output_to_stderr: true, quiet: false, executable: nil, version_args: ["--version"]) if output_to_stderr || quiet file = if quiet File::NULL else $stderr end # Call this method itself with redirected stdout Utils::Output.redirect_stdout(file) do return ensure_installed!(latest:, reason:, output_to_stderr: false, executable:, version_args:) end end if executable && (system_executable = which(executable, ORIGINAL_PATHS)) return system_executable unless latest require "system_command" result = SystemCommand.run(system_executable, args: version_args, print_stderr: false) return system_executable if result.success? && result.stdout[/\d+(?:\.\d+)+/] == version.to_s end reason = " for #{reason}" if reason.present? unless any_version_installed? ohai "Installing `#{name}`#{reason}..." Utils::BrewCommand.run! "install", "--formula", full_name end if latest && !latest_version_installed? ohai "Upgrading `#{name}`#{reason}..." Utils::BrewCommand.run! "upgrade", "--formula", full_name elsif missing_dependencies.present? ohai "Reinstalling `#{name}`#{reason}..." Utils::BrewCommand.run! "reinstall", "--formula", full_name end executable ? opt_bin/executable : self end |
#env(*args, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
97 |
# File 'sorbet/rbi/dsl/formula.rbi', line 97 def env(*args, &block); end |
#etc ⇒ Pathname
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.
1411 |
# File 'formula.rb', line 1411 def etc = (HOMEBREW_PREFIX/"etc").extend(InstallRenamed) |
#fetch ⇒ void
This method returns an undefined value.
Downloads what #install needs from the network, e.g. with a language
package manager, before building from source. It runs after the source has
been unpacked and patched into #buildpath, with the same build
environment as #install and with network access, and may write to
#buildpath and the package manager caches in HOMEBREW_CACHE. When it
is defined, #install runs in the same #buildpath without network
access and with the rest of HOMEBREW_CACHE read-only, so it must use the
package manager's offline mode. brew fetch --build-from-source also runs
it once the dependencies are installed. It is never run when installing a
bottle.
Example
def fetch
system "cargo", "fetch", *std_cargo_fetch_args
end
def install
system "cargo", "install", *std_cargo_args
end
1691 |
# File 'formula.rb', line 1691 def fetch; 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.
3915 3916 3917 |
# File 'formula.rb', line 3915 def fetch_bottle_tab(quiet: false) bottle&.fetch_tab(quiet:) end |
#fetch_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.
1694 1695 1696 |
# File 'formula.rb', line 1694 def fetch_defined? method(:fetch).owner != Formula end |
#fetch_patches ⇒ 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.
3910 3911 3912 |
# File 'formula.rb', line 3910 def fetch_patches patchlist.select(&:external?).each(&:fetch) end |
#fish_completion ⇒ Pathname
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.
1473 |
# File 'formula.rb', line 1473 def fish_completion = share/"fish/vendor_completions.d" |
#fish_function ⇒ Pathname
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.
1446 |
# File 'formula.rb', line 1446 def fish_function = share/"fish/vendor_functions.d" |
#frameworks ⇒ Pathname
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.
1392 |
# File 'formula.rb', line 1392 def frameworks = prefix/"Frameworks" |
#full_formulae_names ⇒ 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 the sibling -full or non--full formula names for any Formula.
765 766 767 768 769 770 771 772 773 |
# File 'formula.rb', line 765 def full_formulae_names sibling_name = if name.end_with?("-full") name.delete_suffix("-full") else "#{name}-full" end formula_names_for_glob("#{sibling_name}.rb") end |
#full_installed_alias_name ⇒ 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.
499 500 501 502 |
# File 'formula.rb', line 499 def full_installed_alias_name installed_alias_name = self.installed_alias_name full_name_with_optional_tap(installed_alias_name) if installed_alias_name end |
#full_installed_specified_name ⇒ 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.
The name (including tap) specified to install this formula.
549 550 551 |
# File 'formula.rb', line 549 def full_installed_specified_name full_installed_alias_name || full_name end |
#full_specified_name ⇒ 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.
The name (including tap) specified to find this formula.
543 544 545 |
# File 'formula.rb', line 543 def full_specified_name full_alias_name || full_name end |
#generate_completions_from_executable(*commands, base_name: nil, shell_parameter_format: nil, shells: Utils::ShellCompletion.default_completion_shells(shell_parameter_format)) ⇒ void
This method returns an undefined value.
Generate shell completions for a formula for bash, zsh, fish, and
optionally pwsh using the formula's executable.
Examples
Using default values for optional arguments.
generate_completions_from_executable(bin/"foo", "completions")
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions", "bash")
(zsh_completion/"_foo").write Utils.safe_popen_read({ "SHELL" => "zsh" }, bin/"foo", "completions", "zsh")
(fish_completion/"foo.fish").write Utils.safe_popen_read({ "SHELL" => "fish" }, bin/"foo",
"completions", "fish")
If your executable can generate completions for PowerShell, you must pass ":pwsh" explicitly along with any other supported shells. This will pass "powershell" as the completion argument.
generate_completions_from_executable(bin/"foo", "completions", shells: [:bash, :pwsh])
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions", "bash")
(pwsh_completion/"_foo.ps1").write Utils.safe_popen_read({ "SHELL" => "pwsh" }, bin/"foo",
"completions", "powershell")
Selecting shells and using a different base_name.
generate_completions_from_executable(bin/"foo", "completions", shells: [:bash, :zsh], base_name: "bar")
# translates to
(bash_completion/"bar").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions", "bash")
(zsh_completion/"_bar").write Utils.safe_popen_read({ "SHELL" => "zsh" }, bin/"foo", "completions", "zsh")
Using predefined shell_parameter_format :arg.
generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: :arg, shells: [:bash])
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo",
"completions", "--shell=bash")
Using predefined shell_parameter_format :clap.
generate_completions_from_executable(bin/"foo", shell_parameter_format: :clap, shells: [:zsh])
# translates to
(zsh_completion/"_foo").write Utils.safe_popen_read({ "SHELL" => "zsh", "COMPLETE" => "zsh" }, bin/"foo")
Using predefined shell_parameter_format :click.
generate_completions_from_executable(bin/"foo", shell_parameter_format: :click, shells: [:zsh])
# translates to
(zsh_completion/"_foo").write Utils.safe_popen_read({ "SHELL" => "zsh", "_FOO_COMPLETE" => "zsh_source" },
bin/"foo")
Using predefined shell_parameter_format :cobra.
generate_completions_from_executable(bin/"foo", shell_parameter_format: :cobra, shells: [:bash])
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completion", "bash")
Using predefined shell_parameter_format :flag.
generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: :flag, shells: [:bash])
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions", "--bash")
Using predefined shell_parameter_format :none.
generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: :none, shells: [:bash])
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions")
Using predefined shell_parameter_format :typer.
generate_completions_from_executable(bin/"foo", shell_parameter_format: :typer, shells: [:zsh])
# translates to
(zsh_completion/"_foo").write Utils.safe_popen_read(
{ "SHELL" => "zsh", "_TYPER_COMPLETE_TEST_DISABLE_SHELL_DETECTION" => "1" },
bin/"foo", "--show-completion", "zsh"
)
Using custom shell_parameter_format.
generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: "--selected-shell=",
shells: [:bash])
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo",
"completions", "--selected-shell=bash")
2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 |
# File 'formula.rb', line 2697 def generate_completions_from_executable(*commands, base_name: nil, shell_parameter_format: nil, shells: Utils::ShellCompletion.default_completion_shells(shell_parameter_format)) executable = commands.first.to_s base_name ||= File.basename(executable) if executable.start_with?(bin.to_s, sbin.to_s) base_name ||= name completion_script_path_map = { bash: bash_completion/base_name, zsh: zsh_completion/"_#{base_name}", fish: fish_completion/"#{base_name}.fish", pwsh: pwsh_completion/"_#{base_name}.ps1", } shells.each do |shell| popen_read_env = { "SHELL" => shell.to_s } script_path = completion_script_path_map[shell] shell_parameter = Utils::ShellCompletion.completion_shell_parameter( shell_parameter_format, shell, executable, popen_read_env, ) script_path.dirname.mkpath script_path.write Utils::ShellCompletion.generate_completion_output(commands, shell_parameter, popen_read_env) end end |
#head? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Is the currently active SoftwareSpec a #head build?
561 562 563 |
# File 'formula.rb', line 561 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?
567 568 569 |
# File 'formula.rb', line 567 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.
1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 |
# File 'formula.rb', line 1036 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 stable_spec = stable return true if stable_spec && tab_stable_version && tab_stable_version < stable_spec.version return false unless fetch_head downloader = head&.downloader return false unless downloader.is_a?(VCSDownloadStrategy) with_context quiet: true do downloader.commit_outdated?(version.version.commit) end end |
#homepage ⇒ 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.
The homepage for the software.
605 |
# File 'formula.rb', line 605 delegate homepage: :"self.class" |
#homepage_browsed ⇒ 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.
The date when a human last browsed the homepage.
610 |
# File 'formula.rb', line 610 delegate homepage_browsed: :"self.class" |
#implied_link_overwrite?(keg_name, overwrite_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.
853 854 855 856 857 858 859 860 861 862 863 864 865 866 |
# File 'formula.rb', line 853 def implied_link_overwrite?(keg_name, overwrite_formulae) return false if overwrite_formulae.empty? return false if keg_name.nil? case keg_name when :missing # File doesn't belong to any keg, so implied overwrites do not apply. false else overwrite_formulae.any? do |formula| formula.possible_names.include?(keg_name) end end end |
#include ⇒ Pathname
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"
1177 |
# File 'formula.rb', line 1177 def include = prefix/"include" |
#info ⇒ Pathname
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.
1185 |
# File 'formula.rb', line 1185 def info = share/"info" |
#inreplace(paths, before = nil, after = nil, audit_result: true, global: true, &block) ⇒ void
This method returns an undefined value.
Sometimes we have to change a bit before we install. Mostly we
prefer a patch, but if you need the prefix of
this formula in the patch you have to resort to inreplace,
because in the patch you don't have access to any variables
defined by the formula, as only HOMEBREW_PREFIX is available
in the embedded patch.
Examples
inreplace supports regular expressions:
inreplace "somefile.cfg", /look[for]what?/, "replace by #{bin}/tool"
inreplace supports blocks:
inreplace "Makefile" do |s|
s.gsub! "/usr/local", HOMEBREW_PREFIX.to_s
end
3593 3594 3595 3596 3597 3598 |
# File 'formula.rb', line 3593 def inreplace(paths, before = nil, after = nil, audit_result: true, global: true, &block) Utils::Inreplace.inreplace(paths, before, after, audit_result:, global:, &block) rescue Utils::Inreplace::Error => e onoe e.to_s raise BuildError.new(self, "inreplace", Array(paths), {}) end |
#install ⇒ void
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
3556 |
# File 'formula.rb', line 3556 def install; end |
#install_etc_var ⇒ 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.
1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 |
# File 'formula.rb', line 1710 def install_etc_var etc_var_dirs = [bottle_prefix/"etc", bottle_prefix/"var"] Find.find(*etc_var_dirs.select(&:directory?)) do |path| path = Pathname.new(path) # Bottle installs and test-bot cleanup both restore `.bottle` files # through `InstallRenamed`, matching formula-level `etc.install` handling. path.extend(InstallRenamed) InstallRenamed.cp_path_sub(path, bottle_prefix, HOMEBREW_PREFIX) path end end |
#installed_alias_name ⇒ 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.
496 |
# File 'formula.rb', line 496 def installed_alias_name = installed_alias_path&.basename&.to_s |
#installed_alias_path ⇒ 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 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.
483 484 485 486 487 488 489 490 491 492 493 |
# File 'formula.rb', line 483 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.
2108 2109 2110 2111 2112 2113 |
# File 'formula.rb', line 2108 def installed_alias_target_changed? target = current_installed_alias_target return false unless target target.name != name end |
#installed_kegs ⇒ 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.
All currently installed kegs.
1129 1130 1131 |
# File 'formula.rb', line 1129 def installed_kegs installed_prefixes.map { |dir| Keg.new(dir) } end |
#installed_prefixes ⇒ Array<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.
1125 |
# File 'formula.rb', line 1125 def installed_prefixes = Utils::Path.formula_installed_prefixes(possible_names) |
#installed_runtime_formula_dependencies(read_from_tab: true, undeclared: true) ⇒ Array<Formula>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns a list of installed Formula objects that are required at runtime.
3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 |
# File 'formula.rb', line 3039 def installed_runtime_formula_dependencies(read_from_tab: true, undeclared: true) cache_key = "#{full_name}-#{read_from_tab}-#{undeclared}" Formula.cache[:installed_runtime_formula_dependencies] ||= {} Formula.cache[:installed_runtime_formula_dependencies][cache_key] ||= runtime_dependencies( read_from_tab:, undeclared:, ).filter_map do |d| d.to_installed_formula rescue FormulaUnavailableError nil end end |
#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.
1812 1813 1814 1815 1816 |
# File 'formula.rb', line 1812 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.
106 |
# File 'sorbet/rbi/dsl/formula.rbi', line 106 def keg_only_reason(*args, &block); end |
#kext_prefix ⇒ Pathname
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.
1401 |
# File 'formula.rb', line 1401 def kext_prefix = prefix/"Library/Extensions" |
#latest_formula ⇒ 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.
If the alias has changed value, return the new formula. Otherwise, return the latest version of the current formula.
2129 2130 2131 2132 |
# File 'formula.rb', line 2129 def latest_formula target = current_installed_alias_target if installed_alias_target_changed? target || self end |
#latest_head_pkg_version(fetch_head: false) ⇒ PkgVersion
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 |
# File 'formula.rb', line 1055 def latest_head_pkg_version(fetch_head: false) return pkg_version unless (latest_version = latest_head_version) return latest_version unless head_version_outdated?(latest_version, fetch_head:) head_spec = head raise FormulaSpecificationError, "#{full_name} has a HEAD version installed but no head spec" if head_spec.nil? downloader = head_spec.downloader return latest_version unless downloader.is_a?(VCSDownloadStrategy) with_context quiet: true do PkgVersion.new(Version.new("HEAD-#{downloader.last_commit}"), revision) end end |
#latest_head_prefix ⇒ 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.
1030 1031 1032 1033 |
# File 'formula.rb', line 1030 def latest_head_prefix head_version = latest_head_version prefix(head_version) if head_version end |
#latest_head_version ⇒ PkgVersion?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 |
# File 'formula.rb', line 1018 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_prefix ⇒ 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 latest prefix for this formula. Checks for #head and then #stable's #prefix.
1072 1073 1074 1075 1076 1077 1078 1079 1080 |
# File 'formula.rb', line 1072 def latest_installed_prefix if head && (head_version = latest_head_version) && !head_version_outdated?(head_version) prefix(head_version) elsif (stable_spec = stable) && (stable_prefix = prefix(PkgVersion.new(stable_spec.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.
994 995 996 |
# File 'formula.rb', line 994 def latest_version_installed? (dir = latest_installed_prefix).directory? && !dir.empty? end |
#launchd_service_path ⇒ 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 generated launchd plist file path.
1545 |
# File 'formula.rb', line 1545 def launchd_service_path = launchd_service_paths.fetch(0) |
#launchd_service_paths ⇒ Array<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 generated launchd plist file paths, including compatible defaults.
1549 1550 1551 1552 |
# File 'formula.rb', line 1549 def launchd_service_paths prefix = any_installed_prefix || opt_prefix plist_names.map { |name| prefix/"#{name}.plist" } end |
#lib ⇒ Pathname
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"
1201 |
# File 'formula.rb', line 1201 def lib = prefix/"lib" |
#libexec ⇒ Pathname
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"
1218 |
# File 'formula.rb', line 1218 def libexec = prefix/"libexec" |
#license ⇒ 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.
The SPDX ID of the software license.
600 |
# File 'formula.rb', line 600 delegate license: :"self.class" |
#link_overwrite?(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.
Explicit link_overwrite paths may also be implied for related formula families.
1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 |
# File 'formula.rb', line 1832 def link_overwrite?(path) # Don't overwrite files that belong to another keg except when that # keg's formula is deleted. case keg_name = link_overwrite_keg_name(path) when String begin f = Formulary.factory(keg_name) rescue FormulaUnavailableError # formula for this keg is deleted, so defer to allowlist rescue TapFormulaAmbiguityError return false # this keg belongs to another formula else # Ensure `keg_name` maps cleanly to the resolved formula via `possible_names`. return false unless f.possible_names.include?(keg_name) end when :missing # File doesn't belong to any keg, so defer to overwrite checks below. else return false end to_check = path.relative_path_from(HOMEBREW_PREFIX).to_s return true if self.class.link_overwrite_paths.any? do |p| p.to_s == to_check || to_check.start_with?("#{p.to_s.chomp("/")}/") || /^#{Regexp.escape(p.to_s).gsub('\*', ".*?")}$/.match?(to_check) end implied_link_overwrite?(keg_name, link_overwrite_formulae) end |
#link_overwrite_formulae ⇒ 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 sibling Formulae whose prefix links should be replaced when this Formula is linked.
827 828 829 830 831 832 833 |
# File 'formula.rb', line 827 def link_overwrite_formulae link_overwrite_formulae_names.filter_map do |formula_name| Formula[formula_name] rescue FormulaUnavailableError nil end.uniq(&:full_name) end |
#link_overwrite_formulae_names ⇒ 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 sibling Formula names whose prefix links should be replaced when this Formula is linked.
799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 |
# File 'formula.rb', line 799 def link_overwrite_formulae_names formula_names = T.let(Set.new, T::Set[String]) pending_formula_names = T.let([name], T::Array[String]) pending_formula_names.each do |current_name| current_formula = begin if current_name == name self else Formula[current_name] end rescue FormulaUnavailableError next end current_formula..each do || next if == name next unless formula_names.add?() pending_formula_names << end end formula_names.to_a.sort end |
#link_overwrite_keg_name(path) ⇒ 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.
836 837 838 839 840 841 842 843 844 845 846 847 848 |
# File 'formula.rb', line 836 def link_overwrite_keg_name(path) # Don't overwrite files not created by Homebrew. return if path.stat.uid != HOMEBREW_BREW_FILE.stat.uid keg = Keg.for(path) # This keg doesn't belong to any current core/tap formula, most likely coming from a DIY install. return if keg.tab.tap.nil? keg.name rescue NotAKegError, Errno::ENOENT # File doesn't belong to any keg. :missing end |
#link_overwrite_reason ⇒ 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.
776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 |
# File 'formula.rb', line 776 def link_overwrite_reason installed_overwrite_formulae = link_overwrite_formulae.select(&:any_version_installed?) return if installed_overwrite_formulae.empty? reason_formulae = installed_overwrite_formulae.select(&:linked?) status = if reason_formulae.empty? reason_formulae = installed_overwrite_formulae "installed" else "linked" end "#{Utils::Text.to_sentence(reason_formulae.map(&:full_name))} " \ "#{reason_formulae.one? ? "is" : "are"} already #{status}" end |
#link_overwrite_related_formula_names ⇒ 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.
793 794 795 |
# File 'formula.rb', line 793 def [*versioned_formulae_names, *full_formulae_names, unversioned_formula_name].compact end |
#linked? ⇒ Boolean
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Is the formula linked?
1104 |
# File 'formula.rb', line 1104 def linked? = linked_keg.exist? |
#linked_keg ⇒ Pathname
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.
1011 1012 1013 1014 1015 |
# File 'formula.rb', line 1011 def linked_keg linked_keg = possible_names.map { |name| HOMEBREW_LINKED_KEGS/name } .find(&:directory?) linked_keg || (HOMEBREW_LINKED_KEGS/name) end |
#linked_version ⇒ PkgVersion?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
PkgVersion of the linked keg for the formula.
1112 1113 1114 1115 1116 |
# File 'formula.rb', line 1112 def linked_version return unless linked? Keg.for(linked_keg).version end |
#livecheck ⇒ 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.
The livecheck specification for the software.
615 |
# File 'formula.rb', line 615 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?
620 |
# File 'formula.rb', line 620 delegate livecheck_defined?: :"self.class" |
#livecheckable? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This is a legacy alias for #livecheck_defined?.
625 |
# File 'formula.rb', line 625 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.
660 |
# File 'formula.rb', line 660 delegate loaded_from_api?: :"self.class" |
#loaded_from_internal_api? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this formula was loaded using the internal formulae.brew.sh API.
665 |
# File 'formula.rb', line 665 delegate loaded_from_internal_api?: :"self.class" |
#loader_path ⇒ String
Linker variable for the directory containing the program or shared object.
2476 |
# File 'formula.rb', line 2476 def loader_path = "@loader_path" |
#local_patch_checksums ⇒ Hash{String => 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.
API generation requires every patch checksum; other metadata consumers can omit unreadable patches.
3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 |
# File 'formula.rb', line 3112 def local_patch_checksums [stable, head].compact.flat_map do |spec| (spec.patches + spec.resources.values.flat_map(&:patches)).grep(LocalPatch).filter_map do |patch| [patch.file.to_s, Digest::SHA256.hexdigest(patch.contents)] rescue ArgumentError, SystemCallError => e raise if Formula. opoo "#{full_name}: cannot checksum #{patch.file}: #{e}" nil end end.to_h end |
#lock ⇒ 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.
2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 |
# File 'formula.rb', line 2017 def lock formula_lock = FormulaLock.new(name) @lock = T.let(formula_lock, T.nilable(FormulaLock)) formula_lock.lock oldnames.each do |oldname| next unless (oldname_rack = HOMEBREW_CELLAR/oldname).exist? next if resolved_path(oldname_rack) != rack oldname_lock = FormulaLock.new(oldname) oldname_lock.lock @oldname_locks << oldname_lock end end |
#logs ⇒ 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 where the formula's installation or test logs will be written.
1492 |
# File 'formula.rb', line 1492 def logs = HOMEBREW_LOGS + name |
#man ⇒ Pathname
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.
1228 |
# File 'formula.rb', line 1228 def man = share/"man" |
#man1 ⇒ Pathname
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"
1244 |
# File 'formula.rb', line 1244 def man1 = man/"man1" |
#man2 ⇒ Pathname
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.
1252 |
# File 'formula.rb', line 1252 def man2 = man/"man2" |
#man3 ⇒ Pathname
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"
1268 |
# File 'formula.rb', line 1268 def man3 = man/"man3" |
#man4 ⇒ Pathname
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.
1276 |
# File 'formula.rb', line 1276 def man4 = man/"man4" |
#man5 ⇒ Pathname
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.
1284 |
# File 'formula.rb', line 1284 def man5 = man/"man5" |
#man6 ⇒ Pathname
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.
1292 |
# File 'formula.rb', line 1292 def man6 = man/"man6" |
#man7 ⇒ Pathname
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.
1300 |
# File 'formula.rb', line 1300 def man7 = man/"man7" |
#man8 ⇒ Pathname
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.
1308 |
# File 'formula.rb', line 1308 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.
2050 2051 2052 |
# File 'formula.rb', line 2050 def migration_needed? !oldnames_to_migrate.empty? && !rack.exist? end |
#missing_dependencies(hide: []) ⇒ Array<Dependency>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns a list of formulae depended on by this formula that aren't installed. Only trusts tab data for dependency information; when the tab has no runtime dependency data (nil or empty), returns empty rather than falling back to formula definitions. This prevents stale or missing tab data from incorrectly blocking uninstalls.
3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 |
# File 'formula.rb', line 3078 def missing_dependencies(hide: []) tab_deps = any_installed_keg&.runtime_dependencies return [] if tab_deps.blank? tab_deps.filter_map do |d| full_name = d["full_name"] next if full_name.blank? # Use base name to check the cellar directly, avoiding Formulary.resolve. # A dep is "missing" if it's in the hide list (pretend uninstalled) or # genuinely not installed in the cellar. base_name = Utils.name_from_full_name(full_name) next if hide.exclude?(base_name) && ((HOMEBREW_CELLAR/base_name).directory? || (HOMEBREW_PREFIX/"opt"/base_name).directory?) Dependency.new(full_name) end end |
#missing_library_linkage ⇒ Array<(Array<String>, Set<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.
3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 |
# File 'formula.rb', line 3647 def missing_library_linkage keg = any_installed_keg return [[], Set.new] unless keg&.directory? CacheStoreDatabase.use(:linkage) do |db| typed_db = T.cast(db, CacheStoreDatabase[String, T::Hash[T.any(String, Symbol), T.anything]]) linkage_checker = LinkageChecker.new(keg, self, cache_db: typed_db) own_libraries = (linkage_checker.broken_deps.fetch(name, []) + linkage_checker.broken_dylibs.to_a).uniq.sort dependency_names = linkage_checker.broken_deps.keys.reject { |dep| dep == name }.to_set [own_libraries, dependency_names] end end |
#mkdir(name, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
A version of FileUtils.mkdir that also changes to that folder in
a block.
3875 3876 3877 3878 3879 3880 |
# File 'formula.rb', line 3875 def mkdir(name, &block) result = FileUtils.mkdir_p(name) return result unless block FileUtils.chdir(name, &block) end |
#mktemp(prefix = name, retain: false, retain_in_cache: false, &block) ⇒ T.type_parameter(:U)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Create a temporary directory then yield. When the block returns,
recursively delete the temporary directory. Passing opts[:retain]
or calling do |staging| ... staging.retain! in the block will skip
the deletion and retain the temporary directory's contents.
3868 3869 3870 |
# File 'formula.rb', line 3868 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.
127 |
# File 'sorbet/rbi/dsl/formula.rbi', line 127 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.
2095 2096 2097 |
# File 'formula.rb', line 2095 def new_formula_available? installed_alias_target_changed? && !latest_formula.latest_version_installed? end |
#no_autobump! ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Exclude the formula from the autobump list.
630 |
# File 'formula.rb', line 630 delegate no_autobump!: :"self.class" |
#no_autobump_message(*args, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
133 |
# File 'sorbet/rbi/dsl/formula.rbi', line 133 def (*args, &block); end |
#old_installed_formulae ⇒ 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.
2135 2136 2137 2138 2139 2140 2141 2142 |
# File 'formula.rb', line 2135 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 |
#oldnames_to_migrate ⇒ 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.
2039 2040 2041 2042 2043 2044 2045 2046 2047 |
# File 'formula.rb', line 2039 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_arch_conditional(arm: nil, intel: nil) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
142 |
# File 'sorbet/rbi/dsl/formula.rbi', line 142 def on_arch_conditional(arm: nil, intel: nil); end |
#on_arm(&block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
150 |
# File 'sorbet/rbi/dsl/formula.rbi', line 150 def on_arm(&block); end |
#on_big_sur(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
159 |
# File 'sorbet/rbi/dsl/formula.rbi', line 159 def on_big_sur(or_condition = nil, &block); end |
#on_golden_gate(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
168 |
# File 'sorbet/rbi/dsl/formula.rbi', line 168 def on_golden_gate(or_condition = nil, &block); end |
#on_intel(&block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
176 |
# File 'sorbet/rbi/dsl/formula.rbi', line 176 def on_intel(&block); end |
#on_linux(&block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
184 |
# File 'sorbet/rbi/dsl/formula.rbi', line 184 def on_linux(&block); end |
#on_macos(&block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
192 |
# File 'sorbet/rbi/dsl/formula.rbi', line 192 def on_macos(&block); end |
#on_monterey(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
201 |
# File 'sorbet/rbi/dsl/formula.rbi', line 201 def on_monterey(or_condition = nil, &block); end |
#on_sequoia(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
210 |
# File 'sorbet/rbi/dsl/formula.rbi', line 210 def on_sequoia(or_condition = nil, &block); end |
#on_sonoma(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
219 |
# File 'sorbet/rbi/dsl/formula.rbi', line 219 def on_sonoma(or_condition = nil, &block); end |
#on_system(linux, macos:, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
229 |
# File 'sorbet/rbi/dsl/formula.rbi', line 229 def on_system(linux, macos:, &block); end |
#on_system_blocks_exist? ⇒ Boolean?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
3466 3467 3468 |
# File 'formula.rb', line 3466 def on_system_blocks_exist? self.class.on_system_blocks_exist? || @on_system_blocks_exist end |
#on_system_conditional(macos: nil, linux: nil) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
238 |
# File 'sorbet/rbi/dsl/formula.rbi', line 238 def on_system_conditional(macos: nil, linux: nil); end |
#on_tahoe(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
247 |
# File 'sorbet/rbi/dsl/formula.rbi', line 247 def on_tahoe(or_condition = nil, &block); end |
#on_ventura(or_condition = nil, &block) ⇒ T.type_parameter(:U)?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
256 |
# File 'sorbet/rbi/dsl/formula.rbi', line 256 def on_ventura(or_condition = nil, &block); end |
#opt_bin ⇒ Pathname
Same as #bin, but relative to #opt_prefix instead of #prefix.
1605 |
# File 'formula.rb', line 1605 def opt_bin = opt_prefix/"bin" |
#opt_elisp ⇒ Pathname
Same as #elisp, but relative to #opt_prefix instead of #prefix.
1647 |
# File 'formula.rb', line 1647 def opt_elisp = opt_prefix/"share/emacs/site-lisp"/name |
#opt_frameworks ⇒ Pathname
Same as #frameworks, but relative to #opt_prefix instead of #prefix.
1653 |
# File 'formula.rb', line 1653 def opt_frameworks = opt_prefix/"Frameworks" |
#opt_include ⇒ Pathname
Same as #include, but relative to #opt_prefix instead of #prefix.
1611 |
# File 'formula.rb', line 1611 def opt_include = opt_prefix/"include" |
#opt_lib ⇒ Pathname
Same as #lib, but relative to #opt_prefix instead of #prefix.
1617 |
# File 'formula.rb', line 1617 def opt_lib = opt_prefix/"lib" |
#opt_libexec ⇒ Pathname
Same as #libexec, but relative to #opt_prefix instead of #prefix.
1623 |
# File 'formula.rb', line 1623 def opt_libexec = opt_prefix/"libexec" |
#opt_pkgshare ⇒ Pathname
Same as #pkgshare, but relative to #opt_prefix instead of #prefix.
1641 |
# File 'formula.rb', line 1641 def opt_pkgshare = opt_prefix/"share"/name |
#opt_prefix ⇒ Pathname
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"
1599 |
# File 'formula.rb', line 1599 def opt_prefix = formula_opt_prefix(name) |
#opt_sbin ⇒ Pathname
Same as #sbin, but relative to #opt_prefix instead of #prefix.
1629 |
# File 'formula.rb', line 1629 def opt_sbin = opt_prefix/"sbin" |
#opt_share ⇒ Pathname
Same as #share, but relative to #opt_prefix instead of #prefix.
1635 |
# File 'formula.rb', line 1635 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.
985 |
# File 'formula.rb', line 985 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.
262 |
# File 'sorbet/rbi/dsl/formula.rbi', line 262 def (*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?
1108 |
# File 'formula.rb', line 1108 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.
2148 2149 2150 2151 2152 |
# File 'formula.rb', line 2148 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.
2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 |
# File 'formula.rb', line 2055 def outdated_kegs(fetch_head: false) raise Migrator::MigrationNeededError.new(oldnames_to_migrate.fetch(0), name) if migration_needed? cache_key = "#{full_name}-#{fetch_head}" Formula.cache[:outdated_kegs] ||= {} Formula.cache[:outdated_kegs][cache_key] ||= begin all_kegs = [] current_version = T.let(false, T::Boolean) latest = latest_formula installed_kegs.each do |keg| all_kegs << keg version = keg.version next if version.head? next if latest.version_scheme > keg.version_scheme && latest.pkg_version != version next if latest.version_scheme == keg.version_scheme && latest.pkg_version > version # don't consider this keg current if there's a newer formula available next if follow_installed_alias? && new_formula_available? # this keg is the current version of the formula, but only consider it current # if it's actually linked - an unlinked current version means we're outdated next if !keg.optlinked? && !keg.linked? && !pinned? current_version = true break end if current_version || ((head_version = latest_head_version) && !head_version_outdated?(head_version, fetch_head:)) [] else all_kegs += old_installed_formulae.flat_map(&:installed_kegs) all_kegs.sort_by(&:scheme_and_version) end end end |
#patch ⇒ void
This method returns an undefined value.
Applies all patches in the #patchlist to the source tree.
1951 1952 1953 1954 1955 1956 |
# File 'formula.rb', line 1951 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.
265 |
# File 'sorbet/rbi/dsl/formula.rbi', line 265 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.
268 |
# File 'sorbet/rbi/dsl/formula.rbi', line 268 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.
271 |
# File 'sorbet/rbi/dsl/formula.rbi', line 271 def pinnable?(*args, &block); end |
#pinned_version(*args, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
277 |
# File 'sorbet/rbi/dsl/formula.rbi', line 277 def pinned_version(*args, &block); end |
#pkg_version ⇒ PkgVersion
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The PkgVersion for this formula with version and #revision information.
698 |
# File 'formula.rb', line 698 def pkg_version = PkgVersion.new(version, revision) |
#pkgetc ⇒ Pathname
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.
1420 |
# File 'formula.rb', line 1420 def pkgetc = (HOMEBREW_PREFIX/"etc"/name).extend(InstallRenamed) |
#pkgshare ⇒ Pathname
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"
1368 |
# File 'formula.rb', line 1368 def pkgshare = prefix/"share"/name |
#plist_name ⇒ 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.
The generated launchd plist service name.
1521 |
# File 'formula.rb', line 1521 def plist_name = service.plist_name |
#plist_names ⇒ 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.
The generated launchd plist service names, including compatible defaults.
1525 1526 1527 1528 1529 |
# File 'formula.rb', line 1525 def plist_names return [plist_name] if plist_name != service.plist_name service.plist_names end |
#possible_names ⇒ 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.
2179 2180 2181 |
# File 'formula.rb', line 2179 def possible_names [name, *oldnames, *aliases].compact end |
#post_install ⇒ 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.
1699 |
# File 'formula.rb', line 1699 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.
1702 1703 1704 |
# File 'formula.rb', line 1702 def post_install_defined? method(:post_install).owner != Formula end |
#post_install_steps ⇒ 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.
The post-install steps.
676 |
# File 'formula.rb', line 676 delegate post_install_steps: :"self.class" |
#post_install_steps_defined? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
1707 |
# File 'formula.rb', line 1707 def post_install_steps_defined? = self.class.post_install_steps_defined? |
#pour_bottle? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Indicates that this formula supports bottles. (Not necessarily that one
should be used in the current installation run.)
Can be overridden to selectively disable bottles from formulae.
Defaults to true so overridden version does not have to check if bottles
are supported.
Replaced by pour_bottle?'s satisfy method if it is specified.
1662 |
# File 'formula.rb', line 1662 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.
283 |
# File 'sorbet/rbi/dsl/formula.rbi', line 283 def pour_bottle_check_unsatisfied_reason(*args, &block); end |
#prefix(version = pkg_version) ⇒ Pathname
The directory in the Cellar that the formula is installed to. This directory points to #opt_prefix if it exists and if #prefix is not called from within the same formula's #install or #post_install methods. Otherwise, return the full path to the formula's keg (versioned Cellar path).
1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 |
# File 'formula.rb', line 1089 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 |
#preserve_rpath? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
422 |
# File 'formula.rb', line 422 def preserve_rpath? = self.class.preserve_rpath? |
#print_tap_action(options = {}) ⇒ 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.
2895 2896 2897 2898 2899 2900 |
# File 'formula.rb', line 2895 def print_tap_action( = {}) return unless tap? verb = [:verb] || "Installing" ohai "#{verb} #{name} from #{tap}" end |
#pwsh_completion ⇒ Pathname
The directory where the formula's PowerShell completion files should be
installed.
This is symlinked into HOMEBREW_PREFIX after installation or with
brew link for formulae that are not keg-only.
1482 |
# File 'formula.rb', line 1482 def pwsh_completion = share/"pwsh/completions" |
#python3 ⇒ Pathname
The stable path to the executable provided by this formula's direct Python 3 dependency.
946 947 948 949 950 951 952 953 954 955 956 957 |
# File 'formula.rb', line 946 def python3 return @python3 if @python3 python_deps = Language::Python.direct_dependency_paths(self, pattern: /\Apython@3\.\d+\z/) if python_deps.length != 1 found = python_deps.empty? ? "none" : python_deps.keys.join(", ") raise "`#{full_name}` must have exactly one `python@3.x` dependency to use `python3`; found #{found}." end @python3 = python_deps.values.fetch(0) end |
#rack ⇒ 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 parent of the prefix; the named directory in the Cellar containing all installed versions of this software.
1121 |
# File 'formula.rb', line 1121 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.
2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 |
# File 'formula.rb', line 2933 def recursive_dependencies(&block) cache_key = "Formula#recursive_dependencies" if block cache_key += "-#{full_name}" = Time.now end Dependency.(self, cache_key:, cache_timestamp:, &block) ensure Dependency.(cache_key, ) if block end |
#recursive_requirements(&block) ⇒ Requirements
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The full set of Requirements for this formula's dependency tree.
2958 2959 2960 2961 |
# File 'formula.rb', line 2958 def recursive_requirements(&block) cache_key = "Formula#recursive_requirements" unless block Requirement.(self, cache_key:, &block) end |
#reloadable_ref ⇒ String, 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.
533 |
# File 'formula.rb', line 533 def reloadable_ref = loaded_from_api? ? full_name : path |
#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.
286 |
# File 'sorbet/rbi/dsl/formula.rbi', line 286 def requirements(*args, &block); end |
#resource(name = nil, klass = Resource, &block) ⇒ Resource?
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" }
895 896 897 898 899 |
# File 'formula.rb', line 895 def resource(name = nil, klass = Resource, &block) return active_spec.resource(&block) if name.nil? active_spec.resource(name, klass, &block) end |
#resources ⇒ 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.
The Resources for the currently active SoftwareSpec.
934 |
# File 'formula.rb', line 934 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"
2464 2465 2466 2467 2468 2469 2470 |
# File 'formula.rb', line 2464 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_checksum ⇒ Checksum?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
3106 3107 3108 |
# File 'formula.rb', line 3106 def ruby_source_checksum Checksum.new(Digest::SHA256.file(path).hexdigest) if path.exist? end |
#ruby_source_path ⇒ 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.
3098 3099 3100 3101 3102 3103 |
# File 'formula.rb', line 3098 def ruby_source_path return unless (t = tap) return unless path.exist? path.relative_path_from(t.path).to_s end |
#run_post_install ⇒ 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.
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 |
# File 'formula.rb', line 1739 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 = { HOMEBREW_PATH: nil, PATH: PATH.new(ORIGINAL_PATHS), } # Formula post-install creates its isolated HOME inside the child because # the entire `postinstall.rb` process is already sandboxed by its parent. Dir.mktmpdir("#{name}-postinstall-", HOMEBREW_TEMP) do |home| postinstall_home = Pathname(home) new_env.merge!(common_sandbox_env(postinstall_home)) setup_home postinstall_home with_env(new_env) do ENV.clear_sensitive_environment! ENV.activate_extensions! with_logging("post_install") do run_post_install_steps if post_install_steps_defined? if post_install_defined? # When removing this, remove `Formula#post_install` too. odeprecated "`post_install`", "`post_install_steps`" post_install end end end end ensure self.build = build @prefix_returns_versioned_prefix = T.let(false, T.nilable(T::Boolean)) end end |
#run_post_install_steps ⇒ 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.
1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 |
# File 'formula.rb', line 1723 def run_post_install_steps return if post_install_steps.empty? prefix_returns_versioned_prefix = @prefix_returns_versioned_prefix @prefix_returns_versioned_prefix = T.let(true, T.nilable(T::Boolean)) begin with_logging("post_install_steps") do Homebrew::InstallSteps::Runner.new(context: self).run(post_install_steps) end ensure @prefix_returns_versioned_prefix = prefix_returns_versioned_prefix end end |
#run_test(keep_tmp: 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.
3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 |
# File 'formula.rb', line 3471 def run_test(keep_tmp: false) @prefix_returns_versioned_prefix = T.let(true, T.nilable(T::Boolean)) test_env = { TERM: "dumb", PATH: PATH.new(ENV.fetch("PATH"), HOMEBREW_PREFIX/"bin"), HOMEBREW_TERM: ENV.fetch("TERM", nil), HOMEBREW_PATH: nil, } ENV.clear_sensitive_environment! Utils::Git.set_name_email! test_path = ENV.delete("HOMEBREW_TEST_PATH") staging = Mktemp.new("#{name}-test", retain: keep_tmp || !test_path.nil?, path: (Pathname(test_path) if test_path)) staging.quiet! if test_path staging.run do testpath = staging.tmpdir raise "Test path is unexpectedly unset." if testpath.nil? @testpath = T.let(testpath, T.nilable(Pathname)) test_env.merge!(test_sandbox_env(testpath)) setup_home testpath # Sandboxed `git commit` cannot auto-detect an identity from the hostname # without network access, so provide one that `HOMEBREW_GIT_NAME`, # `HOMEBREW_GIT_EMAIL` or a repository config can still override. (testpath/".gitconfig").write <<~GITCONFIG [user] name = Homebrew email = brew@example.com GITCONFIG 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.
2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 |
# File 'formula.rb', line 2996 def runtime_dependencies(read_from_tab: true, undeclared: true) cache_key = "#{full_name}-#{read_from_tab}-#{undeclared}" Formula.cache[:runtime_dependencies] ||= {} Formula.cache[:runtime_dependencies][cache_key] ||= begin deps = if read_from_tab && undeclared && (tab_deps = any_installed_keg&.runtime_dependencies) tab_deps.filter_map do |d| full_name = d["full_name"] next unless full_name Dependency.new full_name end end begin deps ||= declared_runtime_dependencies unless undeclared deps ||= (declared_runtime_dependencies | undeclared_runtime_dependencies) rescue FormulaUnavailableError onoe "Could not get runtime dependencies from #{path}!" deps ||= [] end deps end end |
#runtime_formula_dependencies(read_from_tab: true, undeclared: true) ⇒ Array<Formula>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns a list of Formula objects that are required at runtime.
3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 |
# File 'formula.rb', line 3023 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_dependents ⇒ 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.
3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 |
# File 'formula.rb', line 3054 def runtime_installed_formula_dependents # `any_installed_keg` and `runtime_dependencies` `select`s ensure # that we don't end up with something `Formula#runtime_dependencies` can't # read from a `Tab`. Formula.cache[:runtime_installed_formula_dependents] ||= {} Formula.cache[:runtime_installed_formula_dependents][full_name] ||= Formula.installed .select(&:any_installed_keg) .select(&:runtime_dependencies) .select do |f| f.installed_runtime_formula_dependencies.any? do |dep| full_name == dep.full_name rescue name == dep.name end end end |
#sbin ⇒ Pathname
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.
1317 |
# File 'formula.rb', line 1317 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.
1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 |
# File 'formula.rb', line 1959 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_patches ⇒ Array<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.
3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 |
# File 'formula.rb', line 3344 def serialized_patches patchlist.map do |p| h = { "strip" => p.strip.to_s } if p.external? external = T.cast(p, ExternalPatch) h["url"] = external.url h["sha256"] = external.resource.checksum&.hexdigest h["apply"] = external.resource.patch_files.map(&:to_s) if external.resource.patch_files.any? h["directory"] = external.resource.directory.to_s if external.resource.directory.present? h["type"] = external.type.to_s.tr("_", "-") if external.type resolves = external.resolves h["resolves"] = resolves.map { |id| { "type" => Patch.resolves_type(id), "id" => id } } if resolves.any? elsif p.is_a?(LocalPatch) h["file"] = p.file.to_s h["type"] = p.type.to_s.tr("_", "-") if p.type resolves = p.resolves h["resolves"] = resolves.map { |id| { "type" => Patch.resolves_type(id), "id" => id } } if resolves.any? else h["data"] = true end h end end |
#serialized_requirements ⇒ Array<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.
3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 |
# File 'formula.rb', line 3369 def serialized_requirements requirements = { stable: stable&.requirements, head: head&.requirements } 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., "specs" => data[:specs], } end end |
#service ⇒ Homebrew::Service
The service specification for the software.
1580 1581 1582 |
# File 'formula.rb', line 1580 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?
642 |
# File 'formula.rb', line 642 delegate service?: :"self.class" |
#service_name ⇒ 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.
The generated service name.
1533 |
# File 'formula.rb', line 1533 def service_name = service.service_name |
#service_names ⇒ 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.
The generated systemd service names, including compatible defaults.
1537 1538 1539 1540 1541 |
# File 'formula.rb', line 1537 def service_names return [service_name] if service_name != service.service_name service.service_names end |
#share ⇒ Pathname
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"
1351 |
# File 'formula.rb', line 1351 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
2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 |
# File 'formula.rb', line 2438 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.
1822 1823 1824 1825 1826 1827 |
# File 'formula.rb', line 1822 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 |
#specified_name ⇒ 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.
The name specified to find this formula.
537 538 539 |
# File 'formula.rb', line 537 def specified_name alias_name || name end |
#specified_path ⇒ 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 path that was specified to find this formula.
520 521 522 523 524 525 526 527 528 529 530 |
# File 'formula.rb', line 520 def specified_path return Homebrew::API::Internal.cached_packages_json_file_path if loaded_from_internal_api? return Homebrew::API::Formula.cached_json_file_path if loaded_from_api? return alias_path if alias_path&.exist? return @unresolved_path if @unresolved_path.exist? return local_bottle_path if local_bottle_path&.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?
555 556 557 |
# File 'formula.rb', line 555 def stable? active_spec == stable end |
#std_cabal_v2_args(installdir: bin) ⇒ Array<String>
Standard parameters for Cabal-v2 builds.
2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 |
# File 'formula.rb', line 2199 def std_cabal_v2_args(installdir: bin) # 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. args = ["--jobs=#{ENV.make_jobs}", "--max-backjumps=100000"] args += ["--install-method=copy", "--installdir=#{installdir}"] if installdir args end |
#std_cargo_args(root: prefix, path: ".", features: nil) ⇒ Array<String>
Standard parameters for Cargo builds.
2229 2230 2231 2232 2233 2234 |
# File 'formula.rb', line 2229 def std_cargo_args(root: prefix, path: ".", features: nil) args = ["--jobs", ENV.make_jobs.to_s, "--locked", "--root=#{root}", "--path=#{path}"] args += ["--features=#{Array(features).join(",")}"] if features args << "--offline" if fetch_defined? args end |
#std_cargo_fetch_args ⇒ Array<String>
Standard parameters for Cargo dependency fetches.
2215 2216 2217 |
# File 'formula.rb', line 2215 def std_cargo_fetch_args ["--locked", "--target", "host-tuple"] 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.
2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 |
# File 'formula.rb', line 2250 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-author -DBUILD_TESTING=OFF -DCCACHE_FOUND=OFF ] end |
#std_configure_args(prefix: self.prefix, libdir: "lib") ⇒ Array<String>
Standard parameters for configure builds.
2273 2274 2275 2276 |
# File 'formula.rb', line 2273 def std_configure_args(prefix: self.prefix, libdir: "lib") libdir = Pathname(libdir).(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.
Example
A special ldflags value of :goreleaser will output ldflags similar to GoReleaser's
defaults listed at https://goreleaser.com/customization/builds/builders/go/#options.
This uses formula metadata so it should not be used inside staged resources.
std_go_args(ldflags: :goreleaser)
2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 |
# File 'formula.rb', line 2299 def std_go_args(output: bin/name, ldflags: nil, gcflags: nil, tags: nil) case ldflags when :goreleaser built_by = tap&.user || "Homebrew" commit = if (revision = active_spec.specs[:revision]) revision elsif cached_download.basename.to_s.end_with?(".tar", ".tar.gz", ".tgz") Utils::Git.get_tar_commit_id(cached_download) elsif (repo = buildpath) Utils.git_head(repo, safe: false) end # If unable to find a commit, we use the tap owner as a placeholder. # This can help upstream identify the exact code that was used in binary. commit ||= built_by ldflags = %W[ -X 'main.version=#{version}' -X 'main.commit=#{commit}' -X 'main.date=#{time.iso8601}' -X 'main.builtBy=#{built_by}' ] when Symbol raise ArgumentError, "Invalid ldflags: #{ldflags.inspect}" end ldflags = ["-s", "-w"].concat(Array(ldflags)) unless ENV.debug_symbols? args = ["-trimpath", "-o=#{output}"] args << "-tags=#{Array().join(",")}" if args << "-ldflags=#{Array(ldflags).join(" ")}" if ldflags args << "-gcflags=#{Array(gcflags).join(" ")}" if gcflags args end |
#std_meson_args(prefix: self.prefix, libdir: "lib") ⇒ Array<String>
Standard parameters for Meson builds.
2337 2338 2339 |
# File 'formula.rb', line 2337 def std_meson_args(prefix: self.prefix, libdir: "lib") ["--prefix=#{prefix}", "--libdir=#{libdir}", "--buildtype=release", "--wrap-mode=nofallback"] end |
#std_npm_args(prefix: libexec, ignore_scripts: true) ⇒ Array<String>
Standard parameters for npm builds.
2347 2348 2349 2350 2351 2352 2353 |
# File 'formula.rb', line 2347 def std_npm_args(prefix: libexec, ignore_scripts: true) require "language/node" return Language::Node.std_npm_install_args(Pathname(prefix), ignore_scripts:) if prefix Language::Node.local_npm_install_args(ignore_scripts:) end |
#std_pip_args(prefix: self.prefix, build_isolation: false) ⇒ Array<String>
Standard parameters for pip builds.
2362 2363 2364 2365 2366 2367 2368 2369 2370 |
# File 'formula.rb', line 2362 def std_pip_args(prefix: self.prefix, build_isolation: false) args = ["--verbose", "--no-deps", "--no-binary=:all:", "--ignore-installed", "--no-compile"] # Delay packages published in the last day so builds are less likely to # install a freshly compromised PyPI release. args << "--uploaded-prior-to=P#{Homebrew::RELEASE_COOLDOWN_DAYS}D" args << "--prefix=#{prefix}" if prefix args << "--no-build-isolation" unless build_isolation args end |
#std_shards_args ⇒ Array<String>
Standard parameters for Shards builds.
2376 2377 2378 2379 2380 2381 2382 |
# File 'formula.rb', line 2376 def std_shards_args [ "--production", "--release", ENV.debug_symbols? ? "--debug" : "--no-debug", ] end |
#std_swift_args ⇒ Array<String>
Standard parameters for Swift builds.
2388 2389 2390 |
# File 'formula.rb', line 2388 def std_swift_args ["--configuration", "release", "--jobs", ENV.make_jobs.to_s] end |
#std_zig_args(prefix: self.prefix, release_mode: :fast, cpu: nil) ⇒ Array<String>
Standard parameters for Zig builds.
release_mode can be set to either :safe, :fast or :small,
with :fast being the default value.
2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 |
# File 'formula.rb', line 2405 def std_zig_args(prefix: self.prefix, release_mode: :fast, cpu: nil) raise ArgumentError, "Invalid Zig release mode: #{release_mode}" if [:safe, :fast, :small].exclude?(release_mode) cpu ||= Hardware.zig_cpu(ENV.effective_arch) 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", "-Dcpu=#{cpu}" ] 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?
2117 |
# File 'formula.rb', line 2117 def supersedes_an_installed_formula? = old_installed_formulae.any? |
#supports_linux? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2888 2889 2890 2891 2892 |
# File 'formula.rb', line 2888 def supports_linux? return true if active_spec.depends_on_linux_set_top_level? !active_spec.depends_on_macos_set_top_level? end |
#supports_macos? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2883 2884 2885 |
# File 'formula.rb', line 2883 def supports_macos? !active_spec.depends_on_linux_set_top_level? end |
#synced_with_other_formulae? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this Formula is version-synced with other formulae.
869 870 871 872 873 |
# File 'formula.rb', line 869 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", "-S", ".", "-B", "build", *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"
3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 |
# File 'formula.rb', line 3703 def system(cmd, *args) verbose_using_dots = Homebrew::EnvConfig.verbose_using_dots? # remove "boring" arguments so that the important ones are more likely to # be shown considering that we trim long ohai lines to the terminal width pretty_args = args.dup unless verbose? case cmd when "./configure" pretty_args -= std_configure_args when "cabal" pretty_args -= std_cabal_v2_args when "cargo" pretty_args -= std_cargo_args when "cmake" pretty_args -= std_cmake_args when "go" pretty_args -= std_go_args when "meson" pretty_args -= std_meson_args when "zig" pretty_args -= std_zig_args when %r{(?:^|/)(?:pip|python)(?:[23](?:\.\d{1,2})?)?$} pretty_args -= std_pip_args end end pretty_args.each_index do |i| pretty_args[i] = "import setuptools..." if pretty_args[i].to_s.start_with? "import setuptools" end ohai "#{cmd} #{pretty_args * " "}".strip @exec_count ||= T.let(0, T.nilable(Integer)) @exec_count += 1 log_filename = format("#{logs}/#{active_log_prefix}%02<exec_count>d.%<cmd_base>s.log", exec_count: @exec_count, cmd_base: File.basename(cmd).split.first) logs.mkpath File.open(log_filename, "w") do |log| log.puts Time.now, "", cmd, args, "" log.flush if verbose? rd, wr = IO.pipe begin pid = fork do rd.close log.close exec_cmd(cmd, args, wr, log_filename) end wr.close if verbose_using_dots last_dot = Time.at(0) while (buf = rd.gets) log.puts buf # make sure dots printed with interval of at least 1 min. next if (Time.now - last_dot) <= 60 print "." $stdout.flush last_dot = Time.now end puts else while (buf = rd.gets) log.puts buf puts buf end end ensure rd.close end else pid = fork do exec_cmd(cmd, args, log, log_filename) end end Process.wait(pid) $stdout.flush unless $CHILD_STATUS.success? log_lines = Homebrew::EnvConfig.fail_log_lines log.flush if !verbose? || verbose_using_dots puts "Last #{log_lines} lines from #{log_filename}:" Kernel.system "/usr/bin/tail", "-n", log_lines.to_s, log_filename end log.puts require "system_config" require "build_environment" env = ENV.to_hash SystemConfig.dump_verbose_config(log) log.puts BuildEnvironment.dump env, log raise BuildError.new(self, cmd, args, env) end end end |
#systemd_service_path ⇒ 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 generated systemd service file path.
1556 |
# File 'formula.rb', line 1556 def systemd_service_path = systemd_service_paths.fetch(0) |
#systemd_service_paths ⇒ Array<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 generated systemd service file paths, including compatible defaults.
1560 1561 1562 1563 |
# File 'formula.rb', line 1560 def systemd_service_paths prefix = any_installed_prefix || opt_prefix service_names.map { |name| prefix/"#{name}.service" } end |
#systemd_timer_path ⇒ 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 generated systemd timer file path.
1567 |
# File 'formula.rb', line 1567 def systemd_timer_path = systemd_timer_paths.fetch(0) |
#systemd_timer_paths ⇒ Array<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 generated systemd timer file paths, including compatible defaults.
1571 1572 1573 1574 |
# File 'formula.rb', line 1571 def systemd_timer_paths prefix = any_installed_prefix || opt_prefix service_names.map { |name| prefix/"#{name}.timer" } end |
#tap! ⇒ Tap
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
505 506 507 |
# File 'formula.rb', line 505 def tap! tap || raise("Formula tap is nil") end |
#tap? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
True if this formula is provided by an external Tap.
2869 2870 2871 2872 2873 |
# File 'formula.rb', line 2869 def tap? return false unless (t = tap) !t.core_tap? end |
#tap_git_head ⇒ 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.
2903 2904 2905 2906 2907 |
# File 'formula.rb', line 2903 def tap_git_head tap&.git_head rescue TapUnavailableError nil end |
#tap_path ⇒ 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.
510 511 512 513 514 515 516 |
# File 'formula.rb', line 510 def tap_path return path unless (t = tap) return Formulary.core_path(name) if t.core_tap? return path unless t.installed? t.formula_files_by_name[name] || path end |
#test ⇒ void
This method returns an undefined value.
This method is overridden in Formula subclasses to provide the
test instructions. Called by brew test.
3530 |
# File 'formula.rb', line 3530 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.
3521 3522 3523 |
# File 'formula.rb', line 3521 def test_defined? method(:test).owner != Formula end |
#test_fixtures(file) ⇒ Pathname
Returns the path to a fixture file for use in formula tests.
3536 3537 3538 |
# File 'formula.rb', line 3536 def test_fixtures(file) HOMEBREW_LIBRARY_PATH/"test/support/fixtures"/file end |
#test_sandbox_env(testpath) ⇒ Hash{Symbol => 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.
Environment variables for the sandboxed test phase, on top of #common_sandbox_env.
3953 3954 3955 |
# File 'formula.rb', line 3953 def test_sandbox_env(testpath) common_sandbox_env(testpath).merge(GIT_CONFIG_GLOBAL: (testpath/".gitconfig").to_s) end |
#time ⇒ Time
This method is part of a private API. This method may only be 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.
2482 2483 2484 2485 2486 2487 2488 |
# File 'formula.rb', line 2482 def time if ENV["SOURCE_DATE_EPOCH"].present? Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc else Time.now.utc end end |
#to_hash ⇒ 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.
3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 |
# File 'formula.rb', line 3142 def to_hash hsh = { "name" => name, "full_name" => full_name, "tap" => tap&.name, "oldnames" => oldnames, "aliases" => aliases.sort, "versioned_formulae" => versioned_formulae.map(&:name), "desc" => desc, "license" => SPDX.license_expression_to_string(license), "homepage" => homepage, "versions" => { "stable" => stable&.version&.to_s, "head" => head&.version&.to_s, "bottle" => bottle_defined?, }, "urls" => urls_hash, "patches" => serialized_patches, "local_patch_checksums" => local_patch_checksums, "revision" => revision, "version_scheme" => version_scheme, "compatibility_version" => compatibility_version, "autobump" => autobump?, "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" => [], "no_linkage_dependencies" => [], "uses_from_macos" => [], "uses_from_macos_bounds" => [], "requirements" => serialized_requirements, "conflicts_with" => conflicts.map(&:name), "conflicts_with_reasons" => conflicts.map(&:reason), "link_overwrite" => self.class.link_overwrite_paths.to_a, "caveats" => caveats_with_placeholders, "installed" => T.let([], T::Array[T::Hash[String, T.untyped]]), "linked_keg" => linked_version&.to_s, "pinned" => pinned?, "outdated" => outdated?, "deprecated" => deprecated?, "deprecation_date" => deprecation_date, "deprecation_reason" => deprecation_reason, "deprecation_replacement_formula" => deprecation_replacement_formula, "deprecation_replacement_cask" => deprecation_replacement_cask, "deprecate_args" => deprecate_args, "disabled" => disabled?, "disable_date" => disable_date, "disable_reason" => disable_reason, "disable_replacement_formula" => disable_replacement_formula, "disable_replacement_cask" => disable_replacement_cask, "disable_args" => disable_args, "post_install_steps" => post_install_steps, "post_install_defined" => post_install_defined?, "service" => (service.to_hash if service?), "tap_git_head" => tap_git_head, "ruby_source_path" => ruby_source_path, "ruby_source_checksum" => {}, } hsh["bottle"]["stable"] = bottle_hash if stable && bottle_defined? hsh["options"] = .map do |opt| { "option" => opt.flag, "description" => opt.description } end hsh.merge!(dependencies_hash) require "sbom" hsh["installed"] = installed_kegs.sort_by(&:scheme_and_version).map do |keg| tab = keg.tab sbom_path = keg/SBOM::FILENAME { "sbom" => sbom_path.file? ? sbom_path.to_s : nil, "version" => keg.version.to_s, "used_options" => tab..as_flags, "built_as_bottle" => tab.built_as_bottle, "poured_from_bottle" => tab.poured_from_bottle, "time" => tab.time, "runtime_dependencies" => tab.runtime_dependencies, "installed_on_request" => tab.installed_on_request, } end if (source_checksum = ruby_source_checksum) hsh["ruby_source_checksum"] = { "sha256" => source_checksum.hexdigest, } end hsh end |
#to_hash_with_variations ⇒ 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.
3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 |
# File 'formula.rb', line 3244 def to_hash_with_variations if loaded_from_internal_api? raise UsageError, "Cannot call #to_hash_with_variations on formulae loaded from the internal API" end hash = to_hash # Take from API, merging in local install status. if loaded_from_api? && (json_formula = api_source) && !Homebrew::EnvConfig.no_install_from_api? return json_formula.dup.merge( hash.slice("name", "installed", "linked_keg", "pinned", "outdated"), ) end variations = {} if path.exist? && on_system_blocks_exist? formula_contents = path.read OnSystem::VALID_OS_ARCH_TAGS.each do |bottle_tag| Homebrew::SimulateSystem.with_tag(bottle_tag) do variations_namespace = Formulary.class_s("Variations#{bottle_tag.to_sym.capitalize}") variations_formula_class = Formulary.load_formula(name, path, formula_contents, variations_namespace, flags: self.class.build_flags, ignore_errors: true) variations_formula = variations_formula_class.new(name, path, :stable, alias_path:, force_bottle:) variations_formula.to_hash.each do |key, value| next if value.to_s == hash[key].to_s variations[bottle_tag.to_sym] ||= {} variations[bottle_tag.to_sym][key] = value end end end end hash["variations"] = variations hash end |
#unlock ⇒ Array<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.
2033 2034 2035 2036 |
# File 'formula.rb', line 2033 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.
295 |
# File 'sorbet/rbi/dsl/formula.rbi', line 295 def unpin(*args, &block); end |
#unversioned_formula_name ⇒ 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.
737 738 739 740 741 |
# File 'formula.rb', line 737 def unversioned_formula_name return unless versioned_formula? name.sub(/@[\d.]+(?=-full$|$)/, "") end |
#update_head_version ⇒ 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.
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 |
# File 'formula.rb', line 679 def update_head_version return unless head? return unless (head_spec = 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_hash ⇒ Hash{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.
3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 |
# File 'formula.rb', line 3319 def urls_hash hash = {} if (stable_spec = 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_spec = head) hash["head"] = { "url" => head_spec.url, "branch" => head_spec.specs[:branch], "using" => (head_spec.using if head_spec.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.
2878 2879 2880 |
# File 'formula.rb', line 2878 def valid_platform? supports_macos? && supports_linux? end |
#var ⇒ Pathname
The directory where the formula's variable files should be installed.
This directory is not inside the HOMEBREW_CELLAR so it persists
across upgrades.
1428 |
# File 'formula.rb', line 1428 def var = HOMEBREW_PREFIX/"var" |
#version ⇒ 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.
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.
649 |
# File 'formula.rb', line 649 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.
702 |
# File 'formula.rb', line 702 def versioned_formula? = name.include?("@") |
#versioned_formulae ⇒ 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 any @-versioned Formula objects for any Formula (including versioned formulae).
728 729 730 731 732 733 734 |
# File 'formula.rb', line 728 def versioned_formulae versioned_formulae_names.filter_map do |name| Formula[name] rescue FormulaUnavailableError nil end.sort_by(&:version).reverse end |
#versioned_formulae_names ⇒ 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 any other @-versioned formulae names for any Formula (including versioned formulae).
706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 |
# File 'formula.rb', line 706 def versioned_formulae_names name_prefix = unversioned_formula_name || name versioned_names = if (formula_tap = tap) formula_tap.prefix_to_versioned_formulae_names.fetch(name_prefix, []) else versioned_formula_glob = if name_prefix.end_with?("-full") "#{name_prefix.delete_suffix("-full")}@*-full.rb" else "#{name_prefix}@*.rb" end formula_names_for_glob(versioned_formula_glob) end versioned_names.reject do |versioned_name| versioned_name == name end end |
#with_logging(log_type, &_block) ⇒ T.type_parameter(:U)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Runs a block with the given log type in effect for its duration.
1511 1512 1513 1514 1515 1516 1517 |
# File 'formula.rb', line 1511 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 returns an undefined value.
Runs xcodebuild without Homebrew's compiler environment variables set.
3886 3887 3888 3889 3890 3891 3892 3893 3894 |
# File 'formula.rb', line 3886 def xcodebuild(*args) removed = ENV.remove_cc_etc begin self.system("xcodebuild", *args) ensure ENV.update(removed) end end |
#zsh_completion ⇒ Pathname
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.
1464 |
# File 'formula.rb', line 1464 def zsh_completion = share/"zsh/site-functions" |
#zsh_function ⇒ Pathname
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.
1437 |
# File 'formula.rb', line 1437 def zsh_function = share/"zsh/site-functions" |