Class: Formula Private
- Extended by:
- APIHashable, Attrable, BuildEnvironment::DSL, Cachable, Forwardable, OnSystem::MacOSAndLinux
- Includes:
- Context, FileUtils, Homebrew::Livecheck::Constants, OnSystem::MacOSAndLinux, Utils::Shebang, Utils::Shell
- Defined in:
- extend/os/mac/formula.rb,
extend/os/linux/formula.rb,
formula.rb,
formula.rbi,
sorbet/rbi/parlour.rbi
Overview
This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.
This file provides definitions for Forwardable#delegate, which is currently not supported by Sorbet.
Constant Summary
Constants included from Homebrew::Livecheck::Constants
Homebrew::Livecheck::Constants::LATEST_VERSION
Constants included from Utils::Shell
Utils::Shell::SHELL_PROFILE_MAP, Utils::Shell::UNSAFE_SHELL_CHAR
Class Attribute Summary collapse
-
.allow_network_access!(phases = []) ⇒ void
private
The phases for which network access is allowed.
- .conflicts ⇒ Array<FormulaConflict> readonly private
-
.deny_network_access!(phases = []) ⇒ void
private
The phases for which network access is denied.
-
.deprecated_option(hash) ⇒ Object
private
Deprecated options are used to rename options and migrate users who used them to newer ones.
-
.deprecation_date ⇒ Object
readonly
private
The date that this Formula was or becomes deprecated.
-
.deprecation_reason ⇒ nil, ...
readonly
private
The reason for deprecation of a Formula.
- .desc(arg = T.unsafe(nil)) ⇒ T.untyped private
-
.disable_date ⇒ Object
readonly
private
The date that this Formula was or becomes disabled.
-
.disable_reason ⇒ String, Symbol
readonly
private
The reason this Formula is disabled.
-
.head(val = nil, specs = {}, &block) ⇒ Object
private
Adds a Formula.head SoftwareSpec.
- .homepage(arg = T.unsafe(nil)) ⇒ T.untyped private
-
.keg_only_reason ⇒ Object
readonly
private
The reason for why this software is not linked (by default) to HOMEBREW_PREFIX.
-
.license(args = nil) ⇒ Object
private
The SPDX ID of the open-source license that the formula uses.
- .link_overwrite_paths ⇒ Object readonly private
-
.livecheck(&block) ⇒ Object
private
Livecheck can be used to check for newer versions of the software.
-
.mirror(val) ⇒ Object
private
Additional URLs for the Formula.stable version of the formula.
-
.option(name, description = "") ⇒ Object
private
Options can be used as arguments to
brew install
. -
.pour_bottle_check_unsatisfied_reason ⇒ Object
private
If
pour_bottle?
returnsfalse
the user-visible reason to display for why they cannot use the bottle. - .pour_bottle_only_if ⇒ Object readonly private
- .revision(arg = T.unsafe(nil)) ⇒ T.untyped private
-
.service(&block) ⇒ Object
private
Service can be used to define services.
-
.sha256(val) ⇒ Object
private
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 ⇒ Object readonly private
-
.stable(&block) ⇒ Object
private
Allows adding Formula.depends_on and Patches just to the Formula.stable SoftwareSpec.
-
.url(val, specs = {}) ⇒ Object
private
The URL used to download the source for the Formula.stable version of the formula.
-
.version(val = nil) ⇒ Object
private
The version string for the Formula.stable version of the formula.
- .version_scheme(arg = T.unsafe(nil)) ⇒ T.untyped 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 ⇒ Object writeonly private
-
#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?
readonly
private
The current working directory during builds.
-
#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
private
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.
-
#path ⇒ Pathname
readonly
The full path to this Formula.
-
#revision ⇒ Integer
readonly
private
Used for creating new Homebrew versions of software without new upstream versions.
-
#source_modified_time ⇒ Time?
readonly
private
most recent modified time for source files.
-
#stable ⇒ SoftwareSpec?
readonly
internal
The stable (and default) SoftwareSpec for this Formula.
- #tap ⇒ Tap? readonly internal
-
#testpath ⇒ Pathname?
readonly
private
The current working directory during tests.
-
#version_scheme ⇒ Integer
readonly
private
Used to change version schemes for packages.
Class Method Summary collapse
- .[](name) ⇒ Object private
-
.alias_full_names ⇒ Object
private
an array of all aliases as fully-qualified names.
-
.aliases ⇒ Object
private
an array of all aliases.
-
.all(eval_all: false) ⇒ Object
private
an array of all Formula this should only be used when users specify
--all
to a command. -
.bottle(&block) ⇒ void
Adds a Formula.bottle SoftwareSpec.
- .build ⇒ Object private
-
.build_flags ⇒ Object
private
Get the
BUILD_FLAGS
from the formula's namespace set inFormulary::load_formula
. -
.conflicts_with(*names) ⇒ Object
One or more formulae that conflict with this one and why.
-
.core_alias_files ⇒ Object
private
an array of all alias files of core Formula.
-
.core_aliases ⇒ Object
private
an array of all core aliases.
-
.core_names ⇒ Object
private
an array of all core Formula names.
-
.cxxstdlib_check(check_type) ⇒ Object
Pass
:skip
to this method to disable post-install stdlib checking. -
.depends_on(dep) ⇒ Object
The dependencies for this formula.
-
.deprecate!(date:, because:) ⇒ Object
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).
-
.disable!(date:, because:) ⇒ Object
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) ⇒ Object
Marks the Formula as failing with a particular compiler so it will fall back to others.
- .freeze ⇒ Object private
-
.full_names ⇒ Object
private
an array of all Formula names, which the tap formulae have the fully-qualified name.
-
.fuzzy_search(name) ⇒ Object
private
Returns a list of approximately matching formula names, but not the complete match.
-
.go_resource(name, &block) ⇒ Object
deprecated
Deprecated.
Use Go modules instead.
-
.inherited(child) ⇒ Object
private
Initialise instance variables for each subclass.
-
.installed ⇒ Object
private
An array of all installed Formula.
-
.installed_formula_names ⇒ Array<String>
private
An array of all currently installed formula names.
- .installed_with_alias_path(alias_path) ⇒ Object private
-
.keg_only(reason, explanation = "") ⇒ Object
Software that will not be symlinked into the
brew --prefix
and will only live in its Cellar. -
.link_overwrite(*paths) ⇒ Object
private
Permit overwriting certain files while linking.
-
.livecheckable? ⇒ Boolean
private
Checks whether a
livecheck
specification is defined or not. - .loaded_from_api? ⇒ Boolean private
-
.names ⇒ Object
private
an array of all Formula names.
-
.needs(*standards) ⇒ Object
Marks the Formula as needing a certain standard, so Homebrew will fall back to other compilers if the default compiler does not implement that standard.
-
.network_access_allowed?(phase) ⇒ Boolean
private
Whether the specified phase should be forced offline.
-
.on_macos(&block) ⇒ Object
private
This method is included by
OnSystem
. - .on_system_blocks_exist? ⇒ Boolean private
-
.patch(strip = :p1, src = nil, &block) ⇒ Object
External patches can be declared using resource-style blocks.
-
.pour_bottle?(only_if: nil, &block) ⇒ Boolean
Defines whether the Formula's bottle can be used on the given Homebrew installation.
-
.racks ⇒ Object
private
An array of all racks currently installed.
-
.resource(name, klass = Resource, &block) ⇒ Object
Additional downloads can be defined as Formula.resources and accessed in the install method.
-
.service? ⇒ Boolean
private
Checks whether a service specification is defined or not.
-
.skip_clean(*paths) ⇒ Object
Skip cleaning paths in a formula.
- .spec_syms ⇒ Object private
-
.specs ⇒ Object
private
A list of the Formula.stable and Formula.head SoftwareSpecs.
-
.tap_aliases ⇒ Object
private
an array of all tap aliases.
-
.tap_files ⇒ Object
private
an array of all tap Formula files.
-
.tap_names ⇒ Object
private
an array of all tap Formula names.
-
.test(&block) ⇒ Boolean
A test is required for new formulae and makes us happy.
-
.uses_from_macos(dep, bounds = {}) ⇒ void
Indicates use of dependencies provided by macOS.
Instance Method Summary collapse
-
#active_log_prefix ⇒ String
private
The prefix, if any, to use in filenames for logging current activity.
- #add_global_deps_to_spec(spec) ⇒ void private
-
#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, **options, &block) ⇒ T.untyped private
-
#any_installed_keg ⇒ Keg?
private
Returns a Keg for the opt_prefix or installed_prefix if they exist.
-
#any_installed_prefix ⇒ Pathname?
internal
Get the path of any installed prefix.
-
#any_installed_version ⇒ Object
private
Returns the PkgVersion for this formula if it is installed.
-
#any_version_installed? ⇒ Boolean
private
If at least one version of Formula is installed.
-
#bash_completion ⇒ Pathname
The directory where the formula's Bash completion 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, **options, &block) ⇒ Boolean private
-
#bottle_for_tag(tag = nil) ⇒ Bottle?
private
The Bottle object for given tag.
-
#bottle_hash(compact_for_api: false) ⇒ Object
private
Returns the bottle information for a formula.
- #bottle_prefix ⇒ Pathname private
- #bottle_specification(*args, **options, &block) ⇒ T.untyped private
- #bottle_tab_attributes ⇒ Hash private
- #bottle_tag?(*args, **options, &block) ⇒ Boolean private
- #bottled?(*args, **options, &block) ⇒ Boolean private
-
#brew(fetch: true, keep_tmp: false, debug_symbols: false, interactive: false) ⇒ Object
private
Yields |self,staging| with current working directory set to the uncompressed tarball where staging is a Mktemp staging context.
- #cached_download(*args, **options, &block) ⇒ T.untyped private
-
#caveats ⇒ String?
private
Warn the user about any Homebrew-specific issues or quirks for this package.
- #caveats_with_placeholders ⇒ Object private
- #clear_cache(*args, **options, &block) ⇒ T.untyped private
- #compiler_failures(*args, **options, &block) ⇒ T.untyped private
-
#conflicts ⇒ Array<FormulaConflict>
internal
!attr[r] conflicts.
-
#core_formula? ⇒ Boolean
private
True if this formula is provided by Homebrew itself.
- #current_installed_alias_target ⇒ Object private
- #declared_deps(*args, **options, &block) ⇒ T.untyped private
- #deny_network_access!(*args, **options, &block) ⇒ T.untyped private
- #dependencies_hash ⇒ Object private
-
#deprecated? ⇒ Boolean
private
Whether this Formula is deprecated (i.e. warns on installation).
- #deprecated_flags(*args, **options, &block) ⇒ T.untyped private
- #deprecated_options(*args, **options, &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.
- #deps(*args, **options, &block) ⇒ T.untyped private
-
#desc ⇒ T.untyped
private
The description of the software.
-
#deuniversalize_machos(*targets) ⇒ void
private
Replaces a universal binary with its native slice.
-
#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.
-
#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, **options, &block) ⇒ T.untyped private
- #eligible_kegs_for_cleanup(quiet: false) ⇒ Object private
-
#elisp ⇒ Pathname
The directory where Emacs Lisp files should be installed, with the formula name appended to avoid linking conflicts.
- #env(*args, **options, &block) ⇒ T.untyped private
-
#etc ⇒ Pathname
The directory where the formula's configuration files should be installed.
- #fetch(verify_download_integrity: true) ⇒ Object private
- #fetch_bottle_tab ⇒ void private
- #fetch_patches ⇒ Object private
-
#fish_completion ⇒ Pathname
The directory where the formula's fish completion files should be installed.
-
#fish_function ⇒ Pathname
The directory where the formula's fish function files should be installed.
-
#frameworks ⇒ Pathname
The directory where the formula's Frameworks should be installed.
- #full_installed_alias_name ⇒ Object private
-
#full_installed_specified_name ⇒ Object
private
The name (including tap) specified to install this formula.
-
#full_specified_name ⇒ Object
private
The name (including tap) specified to find this formula.
-
#generate_completions_from_executable(*commands, base_name: name, shells: [:bash, :zsh, :fish], shell_parameter_format: nil) ⇒ void
private
Generate shell completions for a formula for
bash
,zsh
andfish
, using 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.
-
#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, &block) ⇒ void
Sometimes we have to change a bit before we install.
-
#install ⇒ Object
private
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 ⇒ Object
private
All currently installed prefix directories.
-
#installed_specified_name ⇒ Object
private
The name specified to install this formula.
- #internal_dependencies_hash(spec_symbol) ⇒ Object private
-
#keg_only? ⇒ Boolean
internal
Rarely, you don't want your library symlinked into the main prefix.
- #keg_only_reason(*args, **options, &block) ⇒ T.untyped private
-
#kext_prefix ⇒ Pathname
The directory where the formula's kernel extensions should be installed.
-
#latest_formula ⇒ Object
private
If the alias has changed value, return the new formula.
- #latest_head_prefix ⇒ Object private
- #latest_head_version ⇒ Object private
-
#latest_installed_prefix ⇒ Object
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 Formula.service file path.
-
#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
-
#linked? ⇒ Boolean
internal
Is the formula linked?.
-
#linked_keg ⇒ Object
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 livecheck specification for the software.
-
#livecheckable? ⇒ Boolean
private
Is a livecheck specification defined for the software?.
-
#loaded_from_api? ⇒ Boolean
private
Whether this formula was loaded using the formulae.brew.sh API.
- #loader_path ⇒ String private
- #lock ⇒ Object 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: nil) ⇒ Object
private
Returns a list of formulae depended on by this formula that aren't installed.
-
#mkdir(name, &block) ⇒ Object
private
A version of
FileUtils.mkdir
that also changes to that folder in a block. -
#mktemp(prefix = name, opts = {}, &block) ⇒ Object
private
Create a temporary directory then yield.
- #network_access_allowed?(*args, **options, &block) ⇒ Boolean private
- #new_formula_available? ⇒ Boolean private
- #old_installed_formulae ⇒ Object private
-
#oldname ⇒ String?
deprecated
private
Deprecated.
Use #oldnames instead.
-
#oldnames ⇒ Array<String>
internal
Old names for the formula.
- #oldnames_to_migrate ⇒ Array<String> private
- #on_system_blocks_exist? ⇒ Boolean 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, **options, &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) ⇒ Object private
- #patch ⇒ Object private
- #pin(*args, **options, &block) ⇒ T.untyped private
- #pinnable?(*args, **options, &block) ⇒ Boolean private
- #pinned?(*args, **options, &block) ⇒ Boolean private
- #pinned_version(*args, **options, &block) ⇒ T.untyped private
-
#pkg_version ⇒ PkgVersion
private
The PkgVersion for this formula with Formula.version and #revision information.
-
#pkgetc ⇒ Pathname
A subdirectory of
etc
with the formula name suffixed. -
#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 ⇒ Object
deprecated
private
Deprecated.
Use Homebrew::Service instead.
-
#plist_name ⇒ String
private
The generated launchd #plist service name.
- #possible_names ⇒ Object private
-
#post_install ⇒ void
private
Can be overridden to run commands on both source and bottle installation.
- #post_install_defined? ⇒ Boolean private
-
#pour_bottle? ⇒ Boolean
private
Indicates that this formula supports bottles.
- #pour_bottle_check_unsatisfied_reason(*args, **options, &block) ⇒ T.untyped private
-
#prefix(version = pkg_version) ⇒ Object
private
The directory in the cellar that the formula is installed to.
-
#prefix_linked?(version = pkg_version) ⇒ Boolean
private
If a formula's linked keg points to the prefix.
- #print_tap_action(options = {}) ⇒ Object private
-
#rack ⇒ Pathname
private
The parent of the prefix; the named directory in the cellar containing all installed versions of this software.
-
#recursive_dependencies(&block) ⇒ Object
internal
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.
-
#recursive_requirements(&block) ⇒ Object
internal
The full set of Requirements for this formula's dependency tree.
- #require_universal_deps? ⇒ Boolean private
- #requirements(*args, **options, &block) ⇒ T.untyped private
-
#resources ⇒ Object
private
The Resources for the currently active SoftwareSpec.
-
#rpath(source: bin, target: lib) ⇒ String
private
Executable/Library RPATH according to platform conventions.
- #ruby_source_checksum ⇒ Checksum? private
- #ruby_source_path ⇒ String? private
- #run_post_install ⇒ void private
- #run_test(keep_tmp: false) ⇒ Object private
-
#runtime_dependencies(read_from_tab: true, undeclared: true) ⇒ Object
internal
Returns a list of Dependency objects that are required at runtime.
-
#runtime_formula_dependencies(read_from_tab: true, undeclared: true) ⇒ Object
private
Returns a list of Formula objects that are required at runtime.
- #runtime_installed_formula_dependents ⇒ Object private
-
#sbin ⇒ Pathname
The directory where the formula's
sbin
binaries should be installed. - #serialized_requirements ⇒ Object private
-
#service ⇒ Object
private
The service specification of the software.
-
#service? ⇒ Boolean
private
Is a service specification defined for the software?.
-
#service_name ⇒ String
private
The generated service name.
-
#share ⇒ Pathname
The directory where the formula's shared files should be installed.
-
#shared_library(name, version = nil) ⇒ String
private
Shared library names according to platform conventions.
- #skip_clean?(path) ⇒ Boolean private
- #skip_cxxstdlib_check? ⇒ Boolean private
-
#specified_name ⇒ Object
private
The name specified to find this formula.
-
#specified_path ⇒ Object
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 ⇒ Array<String>
private
Standard parameters for cabal-v2 builds.
-
#std_cargo_args(root: prefix, path: ".") ⇒ Array<String>
private
Standard parameters for cargo builds.
-
#std_cmake_args(install_prefix: prefix, install_libdir: "lib", find_framework: "LAST") ⇒ Array<String>
(also: #generic_std_cmake_args)
private
Standard parameters for CMake builds.
-
#std_configure_args(prefix: self.prefix, libdir: "lib") ⇒ Array<String>
private
Standard parameters for configure builds.
-
#std_go_args(output: bin/name, ldflags: nil) ⇒ Array<String>
private
Standard parameters for Go builds.
-
#std_meson_args ⇒ Array<String>
private
Standard parameters for meson builds.
-
#std_pip_args(prefix: self.prefix, build_isolation: false) ⇒ Array<String>
private
Standard parameters for pip builds.
-
#supersedes_an_installed_formula? ⇒ Boolean
private
Is this formula the target of an alias used to install an old formula?.
-
#synced_with_other_formulae? ⇒ Boolean
private
Whether this Formula is version-synced with other formulae.
-
#system(cmd, *args) ⇒ void
private
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. -
#systemd_service_path ⇒ Pathname
private
The generated systemd Formula.service file path.
-
#systemd_timer_path ⇒ Pathname
private
The generated systemd timer file path.
-
#tap? ⇒ Boolean
private
True if this formula is provided by external Tap.
- #tap_git_head ⇒ Object private
- #test ⇒ Object private
- #test_defined? ⇒ Boolean private
- #test_fixtures(file) ⇒ Object private
-
#time ⇒ Time
private
Creates a new
Time
object for use in the formula as the build time. - #to_hash ⇒ Object private
- #to_hash_with_variations(hash_method: :to_hash) ⇒ Object private
- #to_internal_api_hash ⇒ Object private
- #unlock ⇒ Object private
- #unpin(*args, **options, &block) ⇒ T.untyped private
- #update_head_version ⇒ void private
- #urls_hash ⇒ Object private
-
#uses_from_macos_elements ⇒ Object
deprecated
private
Deprecated.
Use #declared_deps instead.
-
#uses_from_macos_names ⇒ Object
deprecated
private
Deprecated.
Use #declared_deps instead.
-
#valid_platform? ⇒ Boolean
private
True if this formula can be installed on this platform Redefined in extend/os.
-
#var ⇒ Pathname
The directory where the formula's variable files should be installed.
- #verify_download_integrity(filename) ⇒ Object private
-
#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) ⇒ Object
private
Runs a block with the given log type in effect for its duration.
-
#xcodebuild(*args) ⇒ void
private
Runs
xcodebuild
without Homebrew's compiler environment variables set. -
#zsh_completion ⇒ Pathname
The directory where the formula's zsh completion files should be installed.
-
#zsh_function ⇒ Pathname
The directory where the formula's zsh function files should be installed.
Methods included from OnSystem::MacOSAndLinux
Methods included from BuildEnvironment::DSL
Methods included from Cachable
Methods included from Attrable
Methods included from APIHashable
generated_hash!, generating_hash!, generating_hash?
Methods included from Context
current, current=, #debug?, #quiet?, #verbose?, #with_context
Methods included from Utils::Shell
csh_quote, export_value, from_path, parent, preferred, preferred_path, prepend_path_in_profile, profile, set_variable_in_profile, sh_quote
Methods included from Kernel
#disk_usage_readable, #ensure_executable!, #ensure_formula_installed!, #exec_browser, #exec_editor, #ignore_interrupts, #interactive_shell, #number_readable, #odebug, #odeprecated, #odie, #odisabled, #ofail, #oh1, #oh1_title, #ohai, #ohai_title, #onoe, #opoo, #paths, #pretty_duration, #pretty_installed, #pretty_outdated, #pretty_uninstalled, #quiet_system, #redact_secrets, #redirect_stdout, #require?, #safe_system, #tap_and_name_comparison, #truncate_text_to_approximate_size, #which, #which_all, #which_editor, #with_custom_locale, #with_env, #with_homebrew_path
Methods included from Utils::Shebang
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.
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 |
# File 'formula.rb', line 216 def initialize(name, path, spec, alias_path: nil, tap: nil, force_bottle: false) # Only allow instances of subclasses. The base class does not hold any spec information (URLs etc). raise "Do not call `Formula.new' directly without a subclass." unless self.class < Formula # Stop any subsequent modification of a formula's definition. # Changes do not propagate to existing instances of formulae. # Now that we have an instance, it's too late to make any changes to the class-level definition. self.class.freeze @name = name @unresolved_path = path @path = path.resolved_path @alias_path = alias_path @alias_name = (File.basename(alias_path) if alias_path) @revision = self.class.revision || 0 @version_scheme = self.class.version_scheme || 0 @force_bottle = force_bottle @tap = tap @tap ||= if path == Formulary.core_path(name) CoreTap.instance else Tap.from_path(path) end @full_name = full_name_with_optional_tap(name) @full_alias_name = full_name_with_optional_tap(@alias_name) self.class.spec_syms.each do |sym| spec_eval sym end @active_spec = determine_active_spec(spec) @active_spec_sym = if head? :head else :stable end validate_attributes! @build = active_spec.build @pin = FormulaPin.new(self) @follow_installed_alias = true @prefix_returns_versioned_prefix = false @oldname_locks = [] end |
Class Attribute Details
.allow_network_access!(phases = []) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
The phases for which network access is allowed. By default, network
access is allowed for all phases. Valid phases are :build
, :test
,
and :postinstall
. When no argument is passed, network access will be
allowed for all phases.
Examples
allow_network_access!
allow_network_access! :build
allow_network_access! [:build, :test]
3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 |
# File 'formula.rb', line 3375 def allow_network_access!(phases = []) phases_array = Array(phases) if phases_array.empty? @network_access_allowed.each_key { |phase| @network_access_allowed[phase] = true } else phases_array.each do |phase| raise ArgumentError, "Unknown phase: #{phase}" unless SUPPORTED_NETWORK_ACCESS_PHASES.include?(phase) @network_access_allowed[phase] = true end end end |
.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.
3465 3466 3467 |
# File 'formula.rb', line 3465 def conflicts @conflicts end |
.deny_network_access!(phases = []) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
The phases for which network access is denied. By default, network
access is allowed for all phases. Valid phases are :build
, :test
,
and :postinstall
. When no argument is passed, network access will be
denied for all phases.
Examples
deny_network_access!
deny_network_access! :build
deny_network_access! [:build, :test]
3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 |
# File 'formula.rb', line 3409 def deny_network_access!(phases = []) phases_array = Array(phases) if phases_array.empty? @network_access_allowed.each_key { |phase| @network_access_allowed[phase] = false } else phases_array.each do |phase| raise ArgumentError, "Unknown phase: #{phase}" unless SUPPORTED_NETWORK_ACCESS_PHASES.include?(phase) @network_access_allowed[phase] = false end end end |
.deprecated_option(hash) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Deprecated options are used to rename options and migrate users who used
them to newer ones. They are mostly used for migrating non-with
options
(e.g. enable-debug
) to with
options (e.g. with-debug
).
Example
deprecated_option "enable-debug" => "with-debug"
3853 3854 3855 |
# File 'formula.rb', line 3853 def deprecated_option(hash) specs.each { |spec| spec.deprecated_option(hash) } end |
.deprecation_date ⇒ Object (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The date that this Formula was or becomes deprecated.
Returns nil
if no date is specified.
4220 4221 4222 |
# File 'formula.rb', line 4220 def deprecation_date @deprecation_date end |
.deprecation_reason ⇒ 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 reason for deprecation of a Formula.
4227 4228 4229 |
# File 'formula.rb', line 4227 def deprecation_reason @deprecation_reason end |
.desc(arg = T.unsafe(nil)) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
162 |
# File 'sorbet/rbi/parlour.rbi', line 162 def self.desc(arg = T.unsafe(nil)); end |
.disable_date ⇒ Object (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.
4273 4274 4275 |
# File 'formula.rb', line 4273 def disable_date @disable_date end |
.disable_reason ⇒ 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.
The reason this Formula is disabled.
Returns nil
if no reason was provided or the formula is not disabled.
4280 4281 4282 |
# File 'formula.rb', line 4280 def disable_reason @disable_reason end |
.head(val = nil, specs = {}, &block) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Adds a head SoftwareSpec.
This can be installed by passing the --HEAD
option to allow
installing software directly from a branch of a version-control repository.
If called as a method this provides just the url for the SoftwareSpec.
If a block is provided you can also add depends_on and Patches just to the head SoftwareSpec.
The download strategies (e.g. :using =>
) are the same as for url.
master
is the default branch and doesn't need stating with a branch:
parameter.
Example
head "https://we.prefer.https.over.git.example.com/.git"
head "https://example.com/.git", branch: "name_of_branch"
or (if autodetect fails):
head "https://hg.is.awesome.but.git.has.won.example.com/", using: :hg
3689 3690 3691 3692 3693 3694 3695 3696 3697 |
# File 'formula.rb', line 3689 def head(val = nil, specs = {}, &block) if block @head.instance_eval(&block) elsif val @head.url(val, specs) else @head end end |
.homepage(arg = T.unsafe(nil)) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
165 |
# File 'sorbet/rbi/parlour.rbi', line 165 def self.homepage(arg = T.unsafe(nil)); end |
.keg_only_reason ⇒ Object (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.
3280 3281 3282 |
# File 'formula.rb', line 3280 def keg_only_reason @keg_only_reason end |
.license(args = nil) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The SPDX ID of the open-source license that the formula uses.
Shows when running brew info
.
Use :any_of
, :all_of
or :with
to describe complex license expressions.
:any_of
should be used when the user can choose which license to use.
:all_of
should be used when the user must use all licenses.
:with
should be used to specify a valid SPDX exception.
Add +
to an identifier to indicate that the formulae can be
licensed under later versions of the same license.
Examples
license "BSD-2-Clause"
license "EPL-1.0+"
license any_of: ["MIT", "GPL-2.0-only"]
license all_of: ["MIT", "GPL-2.0-only"]
license "GPL-2.0-only" => { with: "LLVM-exception" }
license :public_domain
license any_of: [
"MIT",
:public_domain,
all_of: ["0BSD", "Zlib", "Artistic-1.0+"],
"Apache-2.0" => { with: "LLVM-exception" },
]
3346 3347 3348 3349 3350 3351 3352 |
# File 'formula.rb', line 3346 def license(args = nil) if args.nil? @licenses else @licenses = args end end |
.link_overwrite_paths ⇒ Object (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.
3467 3468 3469 |
# File 'formula.rb', line 3467 def link_overwrite_paths @link_overwrite_paths end |
.livecheck(&block) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Livecheck can be used to check for newer versions of the software.
This method evaluates the DSL specified in the livecheck block of the
Formula (if it exists) and sets the instance variables of a Livecheck
object accordingly. This is used by brew livecheck
to check for newer
versions of the software.
Example
livecheck do
skip "Not maintained"
url "https://example.com/foo/releases"
regex /foo-(\d+(?:\.\d+)+)\.tar/
end
4093 4094 4095 4096 4097 4098 |
# File 'formula.rb', line 4093 def livecheck(&block) return @livecheck unless block @livecheckable = true @livecheck.instance_eval(&block) end |
.mirror(val) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Additional URLs for the stable version of the formula. These are only used if the url fails to download. It's optional and there can be more than one. Generally we add them when the main url is unreliable. If url is really unreliable then we may swap the mirror and url.
Example
mirror "https://in.case.the.host.is.down.example.com"
mirror "https://in.case.the.mirror.is.down.example.com
3577 3578 3579 |
# File 'formula.rb', line 3577 def mirror(val) stable.mirror(val) end |
.option(name, description = "") ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Options can be used as arguments to brew install
.
To switch features on/off: "with-something"
or "with-otherthing"
.
To use other software: "with-other-software"
or "without-foo"
.
Note that for depends_on that are :optional
or :recommended
, options
are generated automatically.
There are also some special options:
:universal
: build a universal binary/library (e.g. on newer Intel Macs this means a combined x86_64/x86 binary/library).
Examples
option "with-spam", "The description goes here without a dot at the end"
option "with-qt", "Text here overwrites what's autogenerated by 'depends_on "qt" => :optional'"
option :universal
3837 3838 3839 |
# File 'formula.rb', line 3837 def option(name, description = "") specs.each { |spec| spec.option(name, description) } end |
.pour_bottle_check_unsatisfied_reason ⇒ 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.
If pour_bottle?
returns false
the user-visible reason to display for
why they cannot use the bottle.
3471 3472 3473 |
# File 'formula.rb', line 3471 def pour_bottle_check_unsatisfied_reason @pour_bottle_check_unsatisfied_reason end |
.pour_bottle_only_if ⇒ Object (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.
3467 3468 3469 |
# File 'formula.rb', line 3467 def pour_bottle_only_if @pour_bottle_only_if end |
.revision(arg = T.unsafe(nil)) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
168 |
# File 'sorbet/rbi/parlour.rbi', line 168 def self.revision(arg = T.unsafe(nil)); end |
.service(&block) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Service can be used to define services.
This method evaluates the DSL specified in the service block of the
Formula (if it exists) and sets the instance variables of a Service
object accordingly. This is used by brew install
to generate a service file.
Example
service do
run [opt_bin/"foo"]
end
4115 4116 4117 4118 4119 |
# File 'formula.rb', line 4115 def service(&block) return @service_block unless block @service_block = block end |
.sha256(val) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
To verify the cached download's integrity and security we verify the
SHA-256 hash matches what we've declared in the Formula. To quickly fill
this value you can leave it blank and run brew fetch --force
and it'll
tell you the currently valid value.
Example
sha256 "2a2ba417eebaadcb4418ee7b12fe2998f26d6e6f7fda7983412ff66a741ab6f7"
3595 3596 3597 |
# File 'formula.rb', line 3595 def sha256(val) stable.sha256(val) end |
.skip_clean_paths ⇒ Object (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.
3467 3468 3469 |
# File 'formula.rb', line 3467 def skip_clean_paths @skip_clean_paths end |
.stable(&block) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Allows adding depends_on and Patches just to the stable SoftwareSpec. This is required instead of using a conditional. It is preferable to also pull the url and sha256 into the block if one is added.
Example
stable do
url "https://example.com/foo-1.0.tar.gz"
sha256 "2a2ba417eebaadcb4418ee7b12fe2998f26d6e6f7fda7983412ff66a741ab6f7"
depends_on "libxml2"
depends_on "libffi"
end
3659 3660 3661 3662 3663 |
# File 'formula.rb', line 3659 def stable(&block) return @stable unless block @stable.instance_eval(&block) end |
.url(val, specs = {}) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The URL used to download the source for the stable version of the formula.
We prefer https
for security and proxy reasons.
If not inferable, specify the download strategy with using: ...
.
:git
,:hg
,:svn
,:bzr
,:fossil
,:cvs
,:curl
(normal file download, will also extract):nounzip
(without extracting):post
(download via an HTTP POST)
Examples
url "https://packed.sources.and.we.prefer.https.example.com/archive-1.2.3.tar.bz2"
url "https://some.dont.provide.archives.example.com",
using: :git,
tag: "1.2.3",
revision: "db8e4de5b2d6653f66aea53094624468caad15d2"
3542 3543 3544 |
# File 'formula.rb', line 3542 def url(val, specs = {}) stable.url(val, specs) end |
.version(val = nil) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The version string for the stable version of the formula. The version is autodetected from the URL and/or tag so only needs to be declared if it cannot be autodetected correctly.
Example
version "1.2-final"
3558 3559 3560 |
# File 'formula.rb', line 3558 def version(val = nil) stable.version(val) end |
.version_scheme(arg = T.unsafe(nil)) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
171 |
# File 'sorbet/rbi/parlour.rbi', line 171 def self.version_scheme(arg = T.unsafe(nil)); 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.
191 192 193 |
# File 'formula.rb', line 191 def active_log_type @active_log_type end |
#active_spec=(spec_sym) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 |
# File 'formula.rb', line 263 def active_spec=(spec_sym) spec = send(spec_sym) raise FormulaSpecificationError, "#{spec_sym} spec is not available for #{full_name}" unless spec old_spec_sym = @active_spec_sym @active_spec = spec @active_spec_sym = spec_sym validate_attributes! @build = active_spec.build return if spec_sym == old_spec_sym Dependency.clear_cache Requirement.clear_cache end |
#active_spec_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
156 157 158 |
# File 'formula.rb', line 156 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
97 98 99 |
# File 'formula.rb', line 97 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
92 93 94 |
# File 'formula.rb', line 92 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 the result of state that we're trying to eliminate.
198 199 200 |
# File 'formula.rb', line 198 def build @build end |
#buildpath ⇒ 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 current working directory during builds.
Will only be non-nil
inside #install.
176 177 178 |
# File 'formula.rb', line 176 def buildpath @buildpath 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.
204 205 206 |
# File 'formula.rb', line 204 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.
210 211 212 |
# File 'formula.rb', line 210 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
111 112 113 |
# File 'formula.rb', line 111 def full_alias_name @full_alias_name end |
#full_name ⇒ String (readonly)
105 106 107 |
# File 'formula.rb', line 105 def full_name @full_name end |
#head ⇒ SoftwareSpec? (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The HEAD SoftwareSpec for this Formula.
Installed when using brew install --HEAD
.
This is always installed with the version HEAD
and taken from the latest
commit in the version control system.
nil
if there is no HEAD version.
143 144 145 |
# File 'formula.rb', line 143 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
.
186 187 188 |
# File 'formula.rb', line 186 def local_bottle_path @local_bottle_path end |
#name ⇒ String (readonly)
The name of this Formula.
e.g. this-formula
87 88 89 |
# File 'formula.rb', line 87 def name @name end |
#path ⇒ Pathname (readonly)
The full path to this Formula.
e.g. /usr/local/Library/Taps/homebrew/homebrew-core/Formula/t/this-formula.rb
118 119 120 |
# File 'formula.rb', line 118 def path @path end |
#revision ⇒ Integer (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Used for creating new Homebrew versions of software without new upstream versions.
166 167 168 |
# File 'formula.rb', line 166 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.
most recent modified time for source files
160 161 162 |
# File 'formula.rb', line 160 def source_modified_time @source_modified_time end |
#stable ⇒ SoftwareSpec? (readonly)
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The stable (and default) SoftwareSpec for this Formula. This contains all the attributes (e.g. URL, checksum) that apply to the stable version of this formula.
133 134 135 |
# File 'formula.rb', line 133 def stable @stable end |
#tap ⇒ Tap? (readonly)
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The Tap instance associated with this Formula.
If it's nil
, then this formula is loaded from a path or URL.
125 126 127 |
# File 'formula.rb', line 125 def tap @tap end |
#testpath ⇒ 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 current working directory during tests.
Will only be non-nil
inside test.
181 182 183 |
# File 'formula.rb', line 181 def testpath @testpath end |
#version_scheme ⇒ Integer (readonly)
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Used to change version schemes for packages.
171 172 173 |
# File 'formula.rb', line 171 def version_scheme @version_scheme end |
Class Method Details
.[](name) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2208 2209 2210 |
# File 'formula.rb', line 2208 def self.[](name) Formulary.factory(name) end |
.alias_full_names ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
an array of all aliases as fully-qualified names
2198 2199 2200 |
# File 'formula.rb', line 2198 def self.alias_full_names @alias_full_names ||= core_aliases + tap_aliases end |
.aliases ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
an array of all aliases
2193 2194 2195 |
# File 'formula.rb', line 2193 def self.aliases @aliases ||= (core_aliases + tap_aliases.map { |name| name.split("/").last }).uniq.sort end |
.all(eval_all: false) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
an array of all Formula
this should only be used when users specify --all
to a command
2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 |
# File 'formula.rb', line 2129 def self.all(eval_all: false) if !eval_all && !Homebrew::EnvConfig.eval_all? raise ArgumentError, "Formula#all without `--eval-all` or HOMEBREW_EVAL_ALL" end (core_names + tap_files).filter_map do |name_or_file| Formulary.factory(name_or_file) rescue FormulaUnavailableError, FormulaUnreadableError => e # Don't let one broken formula break commands. But do complain. onoe "Failed to import: #{name_or_file}" $stderr.puts e nil end end |
.bottle(&block) ⇒ void
This method returns an undefined value.
Adds a bottle SoftwareSpec. This provides a pre-built binary package built by the Homebrew maintainers for you. It will be installed automatically if there is a binary package for your platform and you haven't passed or previously used any options on this formula.
If you maintain your own repository, you can add your own bottle links. You can ignore this block entirely if submitting to Homebrew/homebrew-core. It'll be handled for you by the Brew Test Bot.
bottle do
root_url "https://example.com" # Optional root to calculate bottle URLs.
rebuild 1 # Marks the old bottle as outdated without bumping the version/revision of the formula.
# Optionally specify the HOMEBREW_CELLAR in which the bottles were built.
sha256 cellar: "/brew/Cellar", catalina: "ef65c759c5097a36323fa9c77756468649e8d1980a3a4e05695c05e39568967c"
sha256 cellar: :any, mojave: "28f4090610946a4eb207df102d841de23ced0d06ba31cb79e040d883906dcd4f"
sha256 high_sierra: "91dd0caca9bd3f38c439d5a7b6f68440c4274945615fae035ff0a369264b8a2f"
end
Homebrew maintainers aim to bottle all formulae.
3624 3625 3626 |
# File 'formula.rb', line 3624 def bottle(&block) stable.bottle(&block) end |
.build ⇒ 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.
3628 3629 3630 |
# File 'formula.rb', line 3628 def build stable.build end |
.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.
Get the BUILD_FLAGS
from the formula's namespace set in Formulary::load_formula
.
3633 3634 3635 3636 3637 3638 3639 |
# File 'formula.rb', line 3633 def build_flags namespace = T.must(to_s.split("::")[0..-2]).join("::") return [] if namespace.empty? mod = const_get(namespace) mod.const_get(:BUILD_FLAGS) end |
.conflicts_with(*names) ⇒ Object
One or more formulae that conflict with this one and why.
Example
conflicts_with "imagemagick", because: "both install `convert` binaries"
3920 3921 3922 3923 |
# File 'formula.rb', line 3920 def conflicts_with(*names) opts = names.last.is_a?(Hash) ? names.pop : {} names.each { |name| conflicts << FormulaConflict.new(name, opts[:because]) } end |
.core_alias_files ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
an array of all alias files of core Formula
2178 2179 2180 |
# File 'formula.rb', line 2178 def self.core_alias_files CoreTap.instance.alias_files end |
.core_aliases ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
an array of all core aliases
2183 2184 2185 |
# File 'formula.rb', line 2183 def self.core_aliases CoreTap.instance.aliases end |
.core_names ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
an array of all core Formula names
2103 2104 2105 |
# File 'formula.rb', line 2103 def self.core_names CoreTap.instance.formula_names end |
.cxxstdlib_check(check_type) ⇒ Object
Pass :skip
to this method to disable post-install stdlib checking.
3981 3982 3983 |
# File 'formula.rb', line 3981 def cxxstdlib_check(check_type) define_method(:skip_cxxstdlib_check?) { true } if check_type == :skip end |
.depends_on(dep) ⇒ Object
The dependencies for this formula. Use strings for the names of other
formulae. Homebrew provides some :special
Requirements for stuff
that needs extra handling (often changing some ENV vars or
deciding whether to use the system provided version).
Examples
:build
means this dependency is only needed during build.
depends_on "cmake" => :build
:test
means this dependency is only needed during testing.
depends_on "node" => :test
:recommended
dependencies are built by default.
But a --without-...
option is generated to opt-out.
depends_on "readline" => :recommended
:optional
dependencies are NOT built by default unless the
auto-generated --with-...
option is passed.
depends_on "glib" => :optional
If you need to specify that another formula has to be built with/out
certain options (note, no --
needed before the option):
depends_on "zeromq" => "with-pgm"
depends_on "qt" => ["with-qtdbus", "developer"] # Multiple options.
Optional and enforce that "boost" is built using --with-c++11
.
depends_on "boost" => [:optional, "with-c++11"]
If a dependency is only needed in certain cases:
depends_on "sqlite" if MacOS.version >= :catalina
depends_on xcode: :build # If the formula really needs full Xcode to compile.
depends_on macos: :mojave # Needs at least macOS Mojave (10.14) to run.
It is possible to only depend on something if
build.with?
or build.without? "another_formula"
:
depends_on "postgresql" if build.without? "sqlite"
3790 3791 3792 |
# File 'formula.rb', line 3790 def depends_on(dep) specs.each { |spec| spec.depends_on(dep) } end |
.deprecate!(date:, because:) ⇒ Object
Deprecates a Formula (on the given date) so a warning is shown on each installation. If the date has not yet passed the formula will not be deprecated.
Examples
deprecate! date: "2020-08-27", because: :unmaintained
deprecate! date: "2020-08-27", because: "has been replaced by foo"
4199 4200 4201 4202 4203 4204 4205 |
# File 'formula.rb', line 4199 def deprecate!(date:, because:) @deprecation_date = Date.parse(date) return if @deprecation_date > Date.today @deprecation_reason = because @deprecated = true end |
.deprecated? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this Formula is deprecated (i.e. warns on installation). Defaults to false.
4211 4212 4213 |
# File 'formula.rb', line 4211 def deprecated? @deprecated == true end |
.disable!(date:, because:) ⇒ Object
Disables a Formula (on the given date) so it cannot be installed. If the date has not yet passed the formula will be deprecated instead of disabled.
Examples
disable! date: "2020-08-27", because: :does_not_build
disable! date: "2020-08-27", because: "has been replaced by foo"
4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 |
# File 'formula.rb', line 4246 def disable!(date:, because:) @disable_date = Date.parse(date) if @disable_date > Date.today @deprecation_reason = because @deprecated = true return end @disable_reason = because @disabled = true end |
.disabled? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this Formula is disabled (i.e. cannot be installed). Defaults to false.
4264 4265 4266 |
# File 'formula.rb', line 4264 def disabled? @disabled == true end |
.fails_with(compiler, &block) ⇒ Object
Marks the Formula as failing with a particular compiler so it will fall back to others.
Examples
For Apple compilers, this should be in the format:
fails_with :clang do
build 600
cause "multiple configure and compile errors"
end
The block may be omitted and if present, the build may be omitted; if so, then the compiler will not be allowed for all versions.
major_version
should be the major release number only, for instance
'7' for the GCC 7 series (7.0, 7.1, etc.).
If version
or the block is omitted, then the compiler will
not be allowed for all compilers in that series.
For example, if a bug is only triggered on GCC 7.1 but is not encountered on 7.2:
fails_with :gcc => '7' do
version '7.1'
end
4016 4017 4018 |
# File 'formula.rb', line 4016 def fails_with(compiler, &block) specs.each { |spec| spec.fails_with(compiler, &block) } end |
.freeze ⇒ 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.
3263 3264 3265 3266 3267 3268 3269 3270 |
# File 'formula.rb', line 3263 def freeze specs.each(&:freeze) @livecheck.freeze @conflicts.freeze @skip_clean_paths.freeze @link_overwrite_paths.freeze super end |
.full_names ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
an array of all Formula names, which the tap formulae have the fully-qualified name
2123 2124 2125 |
# File 'formula.rb', line 2123 def self.full_names @full_names ||= core_names + tap_names end |
.fuzzy_search(name) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns a list of approximately matching formula names, but not the complete match
2203 2204 2205 2206 |
# File 'formula.rb', line 2203 def self.fuzzy_search(name) @spell_checker ||= DidYouMean::SpellChecker.new(dictionary: Set.new(names + full_names).to_a) @spell_checker.correct(name) end |
.go_resource(name, &block) ⇒ Object
Use Go modules instead.
Specify a Go resource.
3722 3723 3724 3725 |
# File 'formula.rb', line 3722 def go_resource(name, &block) # odeprecated "`Formula.go_resource`", "Go modules" specs.each { |spec| spec.go_resource(name, &block) } end |
.inherited(child) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Initialise instance variables for each subclass. These need to be initialised before the class is frozen, and some DSL may never be called so it can't be done lazily.
3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 |
# File 'formula.rb', line 3235 def inherited(child) super child.instance_eval do # Ensure this is synced with `freeze` @stable = SoftwareSpec.new(flags: build_flags) @head = HeadSoftwareSpec.new(flags: build_flags) @livecheck = Livecheck.new(self) @conflicts = [] @skip_clean_paths = Set.new @link_overwrite_paths = Set.new @loaded_from_api = false @network_access_allowed = SUPPORTED_NETWORK_ACCESS_PHASES.to_h do |phase| [phase, DEFAULT_NETWORK_ACCESS_ALLOWED] end end end |
.installed ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
An array of all installed Formula
2163 2164 2165 2166 2167 2168 2169 |
# File 'formula.rb', line 2163 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.
2158 2159 2160 |
# File 'formula.rb', line 2158 def self.installed_formula_names racks.map { |rack| rack.basename.to_s } end |
.installed_with_alias_path(alias_path) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2171 2172 2173 2174 2175 |
# File 'formula.rb', line 2171 def self.installed_with_alias_path(alias_path) return [] if alias_path.nil? installed.select { |f| f.installed_alias_path == alias_path } end |
.keg_only(reason, explanation = "") ⇒ Object
Software that will not be symlinked into the brew --prefix
and will
only live in its Cellar. Other formulae can depend on it and Homebrew
will add the necessary includes, libraries and other paths while
building that other formula.
Keg-only formulae are not in your PATH and are not seen by compilers if you build your own software outside of Homebrew. This way, we don't shadow software provided by macOS.
Examples
keg_only :provided_by_macos
keg_only :versioned_formulae
keg_only "because I want it so"
3974 3975 3976 |
# File 'formula.rb', line 3974 def keg_only(reason, explanation = "") @keg_only_reason = KegOnlyReason.new(reason, explanation) end |
.link_overwrite(*paths) ⇒ 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.
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-*"
4296 4297 4298 4299 |
# File 'formula.rb', line 4296 def link_overwrite(*paths) paths.flatten! link_overwrite_paths.merge(paths) end |
.livecheckable? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Checks whether a livecheck
specification is defined or not.
It returns true
when a livecheck
block is present in the Formula
and false
otherwise.
3451 3452 3453 |
# File 'formula.rb', line 3451 def livecheckable? @livecheckable == true end |
.loaded_from_api? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
156 |
# File 'sorbet/rbi/parlour.rbi', line 156 def self.loaded_from_api?; end |
.names ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
an array of all Formula names
2118 2119 2120 |
# File 'formula.rb', line 2118 def self.names @names ||= (core_names + tap_names.map { |name| name.split("/").last }).uniq.sort end |
.needs(*standards) ⇒ Object
Marks the Formula as needing a certain standard, so Homebrew will fall back to other compilers if the default compiler does not implement that standard.
We generally prefer to depends_on a desired compiler and to
explicitly use that compiler in a formula's #install block,
rather than implicitly finding a suitable compiler with needs
.
4031 4032 4033 |
# File 'formula.rb', line 4031 def needs(*standards) specs.each { |spec| spec.needs(*standards) } end |
.network_access_allowed?(phase) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether the specified phase should be forced offline.
3424 3425 3426 3427 3428 3429 |
# File 'formula.rb', line 3424 def network_access_allowed?(phase) raise ArgumentError, "Unknown phase: #{phase}" unless SUPPORTED_NETWORK_ACCESS_PHASES.include?(phase) env_var = Homebrew::EnvConfig.send(:"formula_#{phase}_network") env_var.nil? ? @network_access_allowed[phase] : env_var == "allow" end |
.on_macos(&block) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method is included by OnSystem
8 |
# File 'formula.rbi', line 8 def self.on_macos(&block); end |
.on_system_blocks_exist? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
6 |
# File 'formula.rbi', line 6 def self.on_system_blocks_exist?; end |
.patch(strip = :p1, src = nil, &block) ⇒ Object
External patches can be declared using resource-style blocks.
Examples
patch do
url "https://example.com/example_patch.diff"
sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
end
A strip level of -p1
is assumed. It can be overridden using a symbol
argument:
patch :p0 do
url "https://example.com/example_patch.diff"
sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
end
Patches can be declared in stable and head blocks. This form is preferred over using conditionals.
stable do
patch do
url "https://example.com/example_patch.diff"
sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
end
end
Embedded (__END__
) patches are declared like so:
patch :DATA
patch :p0, :DATA
Patches can also be embedded by passing a string. This makes it possible to provide multiple embedded patches while making only some of them conditional.
patch :p0, "..."
3907 3908 3909 |
# File 'formula.rb', line 3907 def patch(strip = :p1, src = nil, &block) specs.each { |spec| spec.patch(strip, src, &block) } end |
.pour_bottle?(only_if: nil, &block) ⇒ Boolean
Defines whether the Formula's bottle can be used on the given Homebrew installation.
Examples
If the bottle requires the Xcode CLT to be installed a Formula would declare:
pour_bottle? do
reason "The bottle needs the Xcode CLT to be installed."
satisfy { MacOS::CLT.installed? }
end
If satisfy
returns false
then a bottle will not be used and instead
the Formula will be built from source and reason
will be printed.
Alternatively, a preset reason can be passed as a symbol:
pour_bottle? only_if: :clt_installed
4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 |
# File 'formula.rb', line 4146 def pour_bottle?(only_if: nil, &block) @pour_bottle_check = PourBottleCheck.new(self) @pour_bottle_only_if = only_if if only_if.present? && block.present? raise ArgumentError, "Do not pass both a preset condition and a block to `pour_bottle?`" end block ||= case only_if when :clt_installed lambda do |_| on_macos do T.bind(self, PourBottleCheck) reason(+<<~EOS) The bottle needs the Apple Command Line Tools to be installed. You can install them, if desired, with: xcode-select --install EOS satisfy { MacOS::CLT.installed? } end end when :default_prefix lambda do |_| T.bind(self, PourBottleCheck) reason(+<<~EOS) The bottle (and many others) needs to be installed into #{Homebrew::DEFAULT_PREFIX}. EOS satisfy { HOMEBREW_PREFIX.to_s == Homebrew::DEFAULT_PREFIX } end else raise ArgumentError, "Invalid preset `pour_bottle?` condition" if only_if.present? end @pour_bottle_check.instance_eval(&block) end |
.racks ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
An array of all racks currently installed.
2146 2147 2148 2149 2150 2151 2152 2153 2154 |
# File 'formula.rb', line 2146 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) ⇒ Object
Additional downloads can be defined as resources and accessed in the install method. Resources can also be defined inside a stable or head block. This mechanism replaces ad-hoc "subformula" classes.
Example
resource "additional_files" do
url "https://example.com/additional-stuff.tar.gz"
sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
end
3713 3714 3715 3716 3717 |
# File 'formula.rb', line 3713 def resource(name, klass = Resource, &block) specs.each do |spec| spec.resource(name, klass, &block) unless spec.resource_defined?(name) end end |
.service? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Checks whether a service specification is defined or not.
It returns true
when a service block is present in the Formula
and false
otherwise.
3460 3461 3462 |
# File 'formula.rb', line 3460 def service? @service_block.present? end |
.skip_clean(*paths) ⇒ Object
Skip cleaning paths in a formula.
Sometimes the formula cleaner breaks things.
Examples
Preserve cleaned paths with:
skip_clean "bin/foo", "lib/bar"
Keep .la files with:
skip_clean :la
3944 3945 3946 3947 3948 |
# File 'formula.rb', line 3944 def skip_clean(*paths) paths.flatten! # Specifying :all is deprecated and will become an error skip_clean_paths.merge(paths) end |
.spec_syms ⇒ 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.
3507 3508 3509 |
# File 'formula.rb', line 3507 def spec_syms [:stable, :head].freeze end |
.specs ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
A list of the stable and head SoftwareSpecs.
3512 3513 3514 3515 3516 |
# File 'formula.rb', line 3512 def specs spec_syms.map do |sym| send(sym) end.freeze end |
.tap_aliases ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
an array of all tap aliases
2188 2189 2190 |
# File 'formula.rb', line 2188 def self.tap_aliases @tap_aliases ||= Tap.reject(&:core_tap?).flat_map(&:aliases).sort end |
.tap_files ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
an array of all tap Formula files
2113 2114 2115 |
# File 'formula.rb', line 2113 def self.tap_files @tap_files ||= Tap.reject(&:core_tap?).flat_map(&:formula_files) end |
.tap_names ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
an array of all tap Formula names
2108 2109 2110 |
# File 'formula.rb', line 2108 def self.tap_names @tap_names ||= Tap.reject(&:core_tap?).flat_map(&:formula_names).sort end |
.test(&block) ⇒ Boolean
A test is required for new formulae and makes us happy.
The block will create, run in and delete a temporary directory.
We want tests that don't require any user input
and test the basic functionality of the application.
For example, foo build-foo input.foo
is a good test
and foo --version
or foo --help
are bad tests.
However, a bad test is better than no test at all.
Examples
(testpath/"test.file").write <<~EOS
writing some test file, if you need to
EOS
assert_equal "OK", shell_output("test_command test.file").strip
Need complete control over stdin, stdout?
require "open3"
Open3.popen3("#{bin}/example", "argument") do |stdin, stdout, _|
stdin.write("some text")
stdin.close
assert_equal "result", stdout.read
end
The test will fail if it returns false, or if an exception is raised.
Failed assertions and failed system
commands will raise exceptions.
4071 4072 4073 |
# File 'formula.rb', line 4071 def test(&block) define_method(:test, &block) end |
.uses_from_macos(dep, bounds = {}) ⇒ void
This method returns an undefined value.
Indicates use of dependencies provided by macOS.
On macOS this is a no-op (as we use the provided system libraries) unless
:since
specifies a minimum macOS version.
On Linux this will act as depends_on.
3806 3807 3808 |
# File 'formula.rb', line 3806 def uses_from_macos(dep, bounds = {}) specs.each { |spec| spec.uses_from_macos(dep, bounds) } 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.
1184 1185 1186 1187 1188 1189 1190 |
# File 'formula.rb', line 1184 def active_log_prefix if active_log_type "#{active_log_type}." else "" end end |
#add_global_deps_to_spec(spec) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'extend/os/linux/formula.rb', line 30 def add_global_deps_to_spec(spec) return unless DevelopmentTools.needs_build_formulae? @global_deps ||= begin dependency_collector = spec.dependency_collector = Set.new([ name, *aliases, *versioned_formulae_names, ]) [ dependency_collector.gcc_dep_if_needed(), dependency_collector.glibc_dep_if_needed(), ].compact.freeze end @global_deps.each { |dep| spec.dependency_collector.add(dep) } end |
#alias_changed? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Has the alias used to install the formula changed, or are different formulae already installed with this alias?
1709 1710 1711 |
# File 'formula.rb', line 1709 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.
582 583 584 |
# File 'formula.rb', line 582 def aliases @aliases ||= tap&.alias_reverse_table&.dig(full_name)&.map { _1.split("/").last } || [] end |
#allow_network_access!(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
72 |
# File 'sorbet/rbi/parlour.rbi', line 72 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
.
2271 2272 2273 2274 2275 2276 |
# File 'formula.rb', line 2271 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.
2282 2283 2284 2285 2286 2287 2288 |
# File 'formula.rb', line 2282 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 ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the PkgVersion for this formula if it is installed.
If not, return nil
.
2292 2293 2294 |
# File 'formula.rb', line 2292 def any_installed_version any_installed_keg&.version end |
#any_version_installed? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
If at least one version of Formula is installed.
646 647 648 |
# File 'formula.rb', line 646 def any_version_installed? installed_prefixes.any? { |keg| (keg/Tab::FILENAME).file? } end |
#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.
1142 1143 1144 |
# File 'formula.rb', line 1142 def bash_completion prefix/"etc/bash_completion.d" end |
#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"
788 789 790 |
# File 'formula.rb', line 788 def bin prefix/"bin" end |
#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.
420 421 422 |
# File 'formula.rb', line 420 def bottle @bottle ||= Bottle.new(self, bottle_specification) if bottled? end |
#bottle_defined?(*args, **options, &block) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
36 |
# File 'sorbet/rbi/parlour.rbi', line 36 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.
426 427 428 |
# File 'formula.rb', line 426 def bottle_for_tag(tag = nil) Bottle.new(self, bottle_specification, tag) if bottled?(tag) end |
#bottle_hash(compact_for_api: false) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns the bottle information for a formula.
2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 |
# File 'formula.rb', line 2590 def bottle_hash(compact_for_api: false) bottle_spec = T.must(stable).bottle_specification hash = {} hash["rebuild"] = bottle_spec.rebuild if !compact_for_api || !bottle_spec.rebuild.zero? hash["root_url"] = bottle_spec.root_url unless compact_for_api hash["files"] = {} bottle_spec.collector.each_tag do |tag| tag_spec = bottle_spec.collector.specification_for(tag, no_older_versions: true) os_cellar = tag_spec.cellar os_cellar = os_cellar.inspect if os_cellar.is_a?(Symbol) checksum = tag_spec.checksum.hexdigest file_hash = {} file_hash["cellar"] = os_cellar unless compact_for_api filename = Bottle::Filename.create(self, tag, bottle_spec.rebuild) path, = Utils::Bottles.path_resolved_basename(bottle_spec.root_url, name, checksum, filename) file_hash["url"] = "#{bottle_spec.root_url}/#{path}" end file_hash["sha256"] = checksum hash["files"][tag.to_sym] = file_hash end hash end |
#bottle_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.
1172 1173 1174 |
# File 'formula.rb', line 1172 def bottle_prefix prefix/".bottle" end |
#bottle_specification(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
45 |
# File 'sorbet/rbi/parlour.rbi', line 45 def bottle_specification(*args, **, &block); end |
#bottle_tab_attributes ⇒ Hash
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
3136 3137 3138 3139 3140 |
# File 'formula.rb', line 3136 def bottle_tab_attributes return {} unless bottled? T.must(bottle).tab_attributes end |
#bottle_tag?(*args, **options, &block) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
39 |
# File 'sorbet/rbi/parlour.rbi', line 39 def bottle_tag?(*args, **, &block); end |
#bottled?(*args, **options, &block) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
42 |
# File 'sorbet/rbi/parlour.rbi', line 42 def bottled?(*args, **, &block); end |
#brew(fetch: true, keep_tmp: false, debug_symbols: false, interactive: false) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Yields |self,staging| with current working directory set to the uncompressed tarball where staging is a Mktemp staging context.
1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 |
# File 'formula.rb', line 1577 def brew(fetch: true, keep_tmp: false, debug_symbols: false, interactive: false) @prefix_returns_versioned_prefix = true active_spec.fetch if fetch stage(interactive:, debug_symbols:) do |staging| staging.retain! if keep_tmp || debug_symbols prepare_patches fetch_patches if fetch begin yield self, staging rescue staging.retain! if interactive || debug? raise ensure %w[ config.log CMakeCache.txt CMakeOutput.log CMakeError.log meson-log.txt ].each do |logfile| Dir["**/#{logfile}"].each do |logpath| destdir = logs/File.dirname(logpath) mkdir_p destdir cp logpath, destdir end end end end ensure @prefix_returns_versioned_prefix = false end |
#cached_download(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
93 |
# File 'sorbet/rbi/parlour.rbi', line 93 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 < :el_capitan
s
end
1454 1455 1456 |
# File 'formula.rb', line 1454 def caveats nil end |
#caveats_with_placeholders ⇒ 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.
2668 2669 2670 2671 |
# File 'formula.rb', line 2668 def caveats_with_placeholders caveats&.gsub(HOMEBREW_PREFIX, HOMEBREW_PREFIX_PLACEHOLDER) &.gsub(HOMEBREW_CELLAR, HOMEBREW_CELLAR_PLACEHOLDER) end |
#clear_cache(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
96 |
# File 'sorbet/rbi/parlour.rbi', line 96 def clear_cache(*args, **, &block); end |
#compiler_failures(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
111 |
# File 'sorbet/rbi/parlour.rbi', line 111 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.
!attr[r] conflicts
2249 |
# File 'formula.rb', line 2249 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
2214 2215 2216 |
# File 'formula.rb', line 2214 def core_formula? !!tap&.core_tap? end |
#current_installed_alias_target ⇒ 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.
1686 1687 1688 |
# File 'formula.rb', line 1686 def current_installed_alias_target Formulary.factory(T.must(installed_alias_name)) if installed_alias_path end |
#declared_deps(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
87 |
# File 'sorbet/rbi/parlour.rbi', line 87 def declared_deps(*args, **, &block); end |
#deny_network_access!(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
75 |
# File 'sorbet/rbi/parlour.rbi', line 75 def deny_network_access!(*args, **, &block); end |
#dependencies_hash ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 |
# File 'formula.rb', line 2673 def dependencies_hash # Create a hash of spec names (stable/head) to the list of dependencies under each dependencies = self.class.spec_syms.to_h do |sym| [sym, send(sym)&.declared_deps] end # Implicit dependencies are only needed when installing from source # since they are only used to download and unpack source files. # @see DependencyCollector dependencies.transform_values! { |deps| deps&.reject(&:implicit?) } hash = {} dependencies.each do |spec_sym, spec_deps| next if spec_deps.nil? dep_hash = if spec_sym == :stable hash else next if spec_deps == dependencies[:stable] hash["#{spec_sym}_dependencies"] ||= {} end dep_hash["build_dependencies"] = spec_deps.select(&:build?) .reject(&:uses_from_macos?) .map(&:name) .uniq dep_hash["dependencies"] = spec_deps.reject(&:optional?) .reject(&:recommended?) .reject(&:build?) .reject(&:test?) .reject(&:uses_from_macos?) .map(&:name) .uniq dep_hash["test_dependencies"] = spec_deps.select(&:test?) .reject(&:uses_from_macos?) .map(&:name) .uniq dep_hash["recommended_dependencies"] = spec_deps.select(&:recommended?) .reject(&:uses_from_macos?) .map(&:name) .uniq dep_hash["optional_dependencies"] = spec_deps.select(&:optional?) .reject(&:uses_from_macos?) .map(&:name) .uniq uses_from_macos_deps = spec_deps.select(&:uses_from_macos?).uniq dep_hash["uses_from_macos"] = uses_from_macos_deps.map do |dep| if dep..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 |
#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.
1521 |
# File 'formula.rb', line 1521 delegate deprecated?: :"self.class" |
#deprecated_flags(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
105 |
# File 'sorbet/rbi/parlour.rbi', line 105 def deprecated_flags(*args, **, &block); end |
#deprecated_options(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
102 |
# File 'sorbet/rbi/parlour.rbi', line 102 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.
1528 |
# File 'formula.rb', line 1528 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.
1535 |
# File 'formula.rb', line 1535 delegate deprecation_reason: :"self.class" |
#deps(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
84 |
# File 'sorbet/rbi/parlour.rbi', line 84 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.
433 |
# File 'formula.rb', line 433 delegate desc: :"self.class" |
#deuniversalize_machos(*targets) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
Replaces a universal binary with its native slice.
If called with no parameters, does this with all compatible universal binaries in a Formula's Keg.
27 |
# File 'extend/os/linux/formula.rb', line 27 def deuniversalize_machos(*targets); end |
#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.
1549 |
# File 'formula.rb', line 1549 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.
1556 |
# File 'formula.rb', line 1556 delegate disable_reason: :"self.class" |
#disabled? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this Formula is disabled (i.e. cannot be installed). Defaults to false.
1542 |
# File 'formula.rb', line 1542 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.
798 799 800 |
# File 'formula.rb', line 798 def doc share/"doc"/name end |
#downloader(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
48 |
# File 'sorbet/rbi/parlour.rbi', line 48 def downloader(*args, **, &block); end |
#eligible_kegs_for_cleanup(quiet: false) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 |
# File 'formula.rb', line 3054 def eligible_kegs_for_cleanup(quiet: false) eligible_for_cleanup = [] if latest_version_installed? eligible_kegs = if head? && (head_prefix = latest_head_prefix) head, stable = installed_kegs.partition { |keg| keg.version.head? } # Remove newest head and stable kegs. head - [Keg.new(head_prefix)] + T.must(stable.sort_by(&:scheme_and_version).slice(0...-1)) else installed_kegs.select do |keg| tab = keg.tab if version_scheme > tab.version_scheme true elsif version_scheme == tab.version_scheme pkg_version > keg.version else false end end end unless eligible_kegs.empty? eligible_kegs.each do |keg| if keg.linked? opoo "Skipping (old) #{keg} due to it being linked" unless quiet elsif pinned? && keg == Keg.new(@pin.path.resolved_path) opoo "Skipping (old) #{keg} due to it being pinned" unless quiet else eligible_for_cleanup << keg end end end elsif !installed_prefixes.empty? && !pinned? # If the cellar only has one version installed, don't complain # that we can't tell which one to keep. Don't complain at all if the # only installed version is a pinned formula. opoo "Skipping #{full_name}: most recent version #{pkg_version} not installed" unless quiet end eligible_for_cleanup end |
#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"
1054 1055 1056 |
# File 'formula.rb', line 1054 def elisp prefix/"share/emacs/site-lisp"/name end |
#env(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
153 |
# File 'sorbet/rbi/parlour.rbi', line 153 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.
1088 1089 1090 |
# File 'formula.rb', line 1088 def etc (HOMEBREW_PREFIX/"etc").extend(InstallRenamed) end |
#fetch(verify_download_integrity: true) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2759 2760 2761 |
# File 'formula.rb', line 2759 def fetch(verify_download_integrity: true) active_spec.fetch(verify_download_integrity:) end |
#fetch_bottle_tab ⇒ 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.
3129 3130 3131 3132 3133 |
# File 'formula.rb', line 3129 def fetch_bottle_tab return unless bottled? T.must(bottle).fetch_tab end |
#fetch_patches ⇒ 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.
3124 3125 3126 |
# File 'formula.rb', line 3124 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.
1164 1165 1166 |
# File 'formula.rb', line 1164 def fish_completion share/"fish/vendor_completions.d" end |
#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.
1131 1132 1133 |
# File 'formula.rb', line 1131 def fish_function share/"fish/vendor_functions.d" end |
#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
.
1065 1066 1067 |
# File 'formula.rb', line 1065 def frameworks prefix/"Frameworks" end |
#full_installed_alias_name ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
356 357 358 |
# File 'formula.rb', line 356 def full_installed_alias_name full_name_with_optional_tap(installed_alias_name) end |
#full_installed_specified_name ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The name (including tap) specified to install this formula.
387 388 389 |
# File 'formula.rb', line 387 def full_installed_specified_name full_installed_alias_name || full_name end |
#full_specified_name ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The name (including tap) specified to find this formula.
377 378 379 |
# File 'formula.rb', line 377 def full_specified_name full_alias_name || full_name end |
#generate_completions_from_executable(*commands, base_name: name, shells: [:bash, :zsh, :fish], shell_parameter_format: nil) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
Generate shell completions for a formula for bash
, zsh
and fish
, using the formula's executable.
Examples
Using default values for optional arguments.
generate_completions_from_executable(bin/"foo", "completions")
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions", "bash")
(zsh_completion/"_foo").write Utils.safe_popen_read({ "SHELL" => "zsh" }, bin/"foo", "completions", "zsh")
(fish_completion/"foo.fish").write Utils.safe_popen_read({ "SHELL" => "fish" }, bin/"foo",
"completions", "fish")
Selecting shells and using a different base_name
.
generate_completions_from_executable(bin/"foo", "completions", shells: [:bash, :zsh], base_name: "bar")
# translates to
(bash_completion/"bar").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions", "bash")
(zsh_completion/"_bar").write Utils.safe_popen_read({ "SHELL" => "zsh" }, bin/"foo", "completions", "zsh")
Using predefined shell_parameter_format :flag
.
generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: :flag, shells: [:bash])
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions", "--bash")
Using predefined shell_parameter_format :arg
.
generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: :arg, shells: [:bash])
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo",
"completions", "--shell=bash")
Using predefined shell_parameter_format :none
.
generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: :none, shells: [:bash])
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo", "completions")
Using predefined shell_parameter_format :click
.
generate_completions_from_executable(bin/"foo", shell_parameter_format: :click, shells: [:zsh])
# translates to
(zsh_completion/"_foo").write Utils.safe_popen_read({ "SHELL" => "zsh", "_FOO_COMPLETE" => "zsh_source" },
bin/"foo")
Using custom shell_parameter_format
.
generate_completions_from_executable(bin/"foo", "completions", shell_parameter_format: "--selected-shell=",
shells: [:bash])
# translates to
(bash_completion/"foo").write Utils.safe_popen_read({ "SHELL" => "bash" }, bin/"foo",
"completions", "--selected-shell=bash")
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 2093 2094 2095 2096 2097 2098 2099 2100 |
# File 'formula.rb', line 2060 def generate_completions_from_executable(*commands, base_name: name, shells: [:bash, :zsh, :fish], shell_parameter_format: nil) completion_script_path_map = { bash: bash_completion/base_name, zsh: zsh_completion/"_#{base_name}", fish: fish_completion/"#{base_name}.fish", } shells.each do |shell| popen_read_env = { "SHELL" => shell.to_s } script_path = completion_script_path_map[shell] shell_parameter = if shell_parameter_format.nil? shell.to_s elsif shell_parameter_format == :flag "--#{shell}" elsif shell_parameter_format == :arg "--shell=#{shell}" elsif shell_parameter_format == :none nil elsif shell_parameter_format == :click prog_name = File.basename(commands.first.to_s).upcase.tr("-", "_") popen_read_env["_#{prog_name}_COMPLETE"] = "#{shell}_source" nil else "#{shell_parameter_format}#{shell}" end popen_read_args = %w[] popen_read_args << commands popen_read_args << shell_parameter if shell_parameter.present? popen_read_args.flatten! = {} [:err] = :err unless ENV["HOMEBREW_STDERR"] script_path.dirname.mkpath script_path.write Utils.safe_popen_read(popen_read_env, *popen_read_args, **) 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?
399 400 401 |
# File 'formula.rb', line 399 def head? active_spec == head end |
#head_only? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Is this formula HEAD-only?
405 406 407 |
# File 'formula.rb', line 405 def head_only? !!head && !stable end |
#head_version_outdated?(version, fetch_head: false) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
678 679 680 681 682 683 684 685 686 687 688 689 690 691 |
# File 'formula.rb', line 678 def head_version_outdated?(version, fetch_head: false) tab = Tab.for_keg(prefix(version)) return true if tab.version_scheme < version_scheme return true if stable && tab.stable_version && tab.stable_version < T.must(stable).version return false unless fetch_head return false unless head&.downloader.is_a?(VCSDownloadStrategy) downloader = T.must(head).downloader with_context quiet: true do downloader.commit_outdated?(version.version.commit) end end |
#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.
443 |
# File 'formula.rb', line 443 delegate homepage: :"self.class" |
#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"
816 817 818 |
# File 'formula.rb', line 816 def include prefix/"include" end |
#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.
826 827 828 |
# File 'formula.rb', line 826 def info share/"info" end |
#inreplace(paths, before = nil, after = nil, audit_result = true, &block) ⇒ void
This method returns an undefined value.
Sometimes we have to change a bit before we install. Mostly we
prefer a patch, but if you need the prefix of
this formula in the patch you have to resort to inreplace
,
because in the patch you don't have access to any variables
defined by the formula, as only HOMEBREW_PREFIX
is available
in the embedded patch.
Examples
inreplace
supports regular expressions:
inreplace "somefile.cfg", /look[for]what?/, "replace by #{bin}/tool"
inreplace
supports blocks:
inreplace "Makefile" do |s|
s.gsub! "/usr/local", HOMEBREW_PREFIX.to_s
end
2864 2865 2866 2867 2868 2869 |
# File 'formula.rb', line 2864 def inreplace(paths, before = nil, after = nil, audit_result = true, &block) # rubocop:disable Style/OptionalBooleanParameter Utils::Inreplace.inreplace(paths, before, after, audit_result:, &block) rescue Utils::Inreplace::Error => e onoe e.to_s raise BuildError.new(self, "inreplace", Array(paths), {}) end |
#install ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method is 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
2828 |
# File 'formula.rb', line 2828 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.
1388 1389 1390 1391 1392 1393 1394 1395 |
# File 'formula.rb', line 1388 def install_etc_var etc_var_dirs = [bottle_prefix/"etc", bottle_prefix/"var"] Find.find(*etc_var_dirs.select(&:directory?)) do |path| path = Pathname.new(path) path.extend(InstallRenamed) path.cp_path_sub(bottle_prefix, HOMEBREW_PREFIX) end end |
#installed_alias_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.
352 353 354 |
# File 'formula.rb', line 352 def installed_alias_name installed_alias_path&.basename&.to_s end |
#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.
339 340 341 342 343 344 345 346 347 348 349 |
# File 'formula.rb', line 339 def installed_alias_path build_tab = build path = build_tab.source["path"] if build_tab.is_a?(Tab) return unless path&.match?(%r{#{HOMEBREW_TAP_DIR_REGEX}/Aliases}o) path = Pathname(path) return unless path.symlink? path end |
#installed_alias_target_changed? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Has the target of the alias used to install this formula changed? Returns false if the formula wasn't installed with an alias.
1693 1694 1695 1696 1697 1698 |
# File 'formula.rb', line 1693 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.
764 765 766 |
# File 'formula.rb', line 764 def installed_kegs installed_prefixes.map { |dir| Keg.new(dir) } end |
#installed_prefixes ⇒ 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.
All currently installed prefix directories.
755 756 757 758 759 760 |
# File 'formula.rb', line 755 def installed_prefixes possible_names.map { |name| HOMEBREW_CELLAR/name } .select(&:directory?) .flat_map(&:subdirs) .sort_by(&:basename) end |
#installed_specified_name ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The name specified to install this formula.
382 383 384 |
# File 'formula.rb', line 382 def installed_specified_name installed_alias_name || name end |
#internal_dependencies_hash(spec_symbol) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 |
# File 'formula.rb', line 2737 def internal_dependencies_hash(spec_symbol) raise ArgumentError, "Unsupported spec: #{spec_symbol}" unless [:stable, :head].include?(spec_symbol) return unless (spec = public_send(spec_symbol)) spec.declared_deps.each_with_object({}) do |dep, dep_hash| # Implicit dependencies are only needed when installing from source # since they are only used to download and unpack source files. # @see DependencyCollector next if dep.implicit? = {} [:tags] = dep. if dep..present? [:uses_from_macos] = dep.bounds.presence if dep.uses_from_macos? dep_hash[dep.name] = .presence end end |
#keg_only? ⇒ Boolean
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Rarely, you don't want your library symlinked into the main prefix.
See gettext.rb
for an example.
1464 1465 1466 1467 1468 |
# File 'formula.rb', line 1464 def keg_only? return false unless keg_only_reason keg_only_reason.applicable? end |
#keg_only_reason(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
117 |
# File 'sorbet/rbi/parlour.rbi', line 117 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
.
1076 1077 1078 |
# File 'formula.rb', line 1076 def kext_prefix prefix/"Library/Extensions" end |
#latest_formula ⇒ 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.
If the alias has changed value, return the new formula. Otherwise, return self.
1715 1716 1717 |
# File 'formula.rb', line 1715 def latest_formula installed_alias_target_changed? ? current_installed_alias_target : self end |
#latest_head_prefix ⇒ 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.
673 674 675 676 |
# File 'formula.rb', line 673 def latest_head_prefix head_version = latest_head_version prefix(head_version) if head_version end |
#latest_head_version ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
662 663 664 665 666 667 668 669 670 671 |
# File 'formula.rb', line 662 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 ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The latest prefix for this formula. Checks for #head and then #stable's #prefix
694 695 696 697 698 699 700 701 702 |
# File 'formula.rb', line 694 def latest_installed_prefix if head && (head_version = latest_head_version) && !head_version_outdated?(head_version) latest_head_prefix elsif stable && (stable_prefix = prefix(PkgVersion.new(T.must(stable).version, revision))).directory? stable_prefix else prefix end end |
#latest_version_installed? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
If this Formula is installed. This is actually just a check for if the #latest_installed_prefix directory exists and is not empty.
640 641 642 |
# File 'formula.rb', line 640 def latest_version_installed? (dir = latest_installed_prefix).directory? && !dir.children.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 service file path.
1253 1254 1255 |
# File 'formula.rb', line 1253 def launchd_service_path opt_prefix/"#{plist_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"
844 845 846 |
# File 'formula.rb', line 844 def lib prefix/"lib" end |
#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"
863 864 865 |
# File 'formula.rb', line 863 def libexec prefix/"libexec" end |
#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.
438 |
# File 'formula.rb', line 438 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.
1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 |
# File 'formula.rb', line 1482 def link_overwrite?(path) # Don't overwrite files not created by Homebrew. return false if path.stat.uid != HOMEBREW_BREW_FILE.stat.uid # Don't overwrite files belong to other keg except when that # keg's formula is deleted. begin keg = Keg.for(path) rescue NotAKegError, Errno::ENOENT # file doesn't belong to any keg. else tab_tap = keg.tab.tap # this keg doesn't below to any core/tap formula, most likely coming from a DIY install. return false if tab_tap.nil? begin f = Formulary.factory(keg.name) rescue FormulaUnavailableError # formula for this keg is deleted, so defer to allowlist rescue TapFormulaAmbiguityError return false # this keg belongs to another formula else # this keg belongs to another unrelated formula return false unless f.possible_names.include?(keg.name) end end to_check = path.relative_path_from(HOMEBREW_PREFIX).to_s self.class.link_overwrite_paths.any? do |p| p == to_check || to_check.start_with?("#{p.chomp("/")}/") || /^#{Regexp.escape(p).gsub('\*', ".*?")}$/.match?(to_check) end end |
#linked? ⇒ Boolean
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Is the formula linked?
722 723 724 |
# File 'formula.rb', line 722 def linked? linked_keg.symlink? end |
#linked_keg ⇒ Object
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The link status symlink directory for this Formula. You probably want #opt_prefix instead.
654 655 656 657 658 659 660 |
# File 'formula.rb', line 654 def linked_keg linked_keg = possible_names.map { |name| HOMEBREW_LINKED_KEGS/name } .find(&:directory?) return linked_keg if linked_keg.present? HOMEBREW_LINKED_KEGS/name end |
#linked_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.
741 742 743 744 745 |
# File 'formula.rb', line 741 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.
448 |
# File 'formula.rb', line 448 delegate livecheck: :"self.class" |
#livecheckable? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Is a livecheck specification defined for the software?
453 |
# File 'formula.rb', line 453 delegate livecheckable?: :"self.class" |
#loaded_from_api? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this formula was loaded using the formulae.brew.sh API
477 |
# File 'formula.rb', line 477 delegate loaded_from_api?: :"self.class" |
#loader_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.
22 23 24 |
# File 'extend/os/linux/formula.rb', line 22 def loader_path "$ORIGIN" end |
#lock ⇒ 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.
1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 |
# File 'formula.rb', line 1611 def lock @lock = FormulaLock.new(name) @lock.lock oldnames.each do |oldname| next unless (oldname_rack = HOMEBREW_CELLAR/oldname).exist? next if oldname_rack.resolved_path != rack oldname_lock = FormulaLock.new(oldname) oldname_lock.lock @oldname_locks << oldname_lock end end |
#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.
1178 1179 1180 |
# File 'formula.rb', line 1178 def logs HOMEBREW_LOGS + name end |
#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.
875 876 877 |
# File 'formula.rb', line 875 def man share/"man" end |
#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"
893 894 895 |
# File 'formula.rb', line 893 def man1 man/"man1" end |
#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.
903 904 905 |
# File 'formula.rb', line 903 def man2 man/"man2" end |
#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"
921 922 923 |
# File 'formula.rb', line 921 def man3 man/"man3" end |
#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.
931 932 933 |
# File 'formula.rb', line 931 def man4 man/"man4" end |
#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.
941 942 943 |
# File 'formula.rb', line 941 def man5 man/"man5" end |
#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.
951 952 953 |
# File 'formula.rb', line 951 def man6 man/"man6" end |
#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.
961 962 963 |
# File 'formula.rb', line 961 def man7 man/"man7" end |
#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.
971 972 973 |
# File 'formula.rb', line 971 def man8 man/"man8" end |
#migration_needed? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
1642 1643 1644 |
# File 'formula.rb', line 1642 def migration_needed? !oldnames_to_migrate.empty? && !rack.exist? end |
#missing_dependencies(hide: nil) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns a list of formulae depended on by this formula that aren't installed.
2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 |
# File 'formula.rb', line 2353 def missing_dependencies(hide: nil) hide ||= [] runtime_formula_dependencies.select do |f| hide.include?(f.name) || f.installed_prefixes.empty? end # If we're still getting unavailable formulae at this stage the best we can # do is just return no results. rescue FormulaUnavailableError [] end |
#mkdir(name, &block) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
A version of FileUtils.mkdir
that also changes to that folder in
a block.
3105 3106 3107 3108 3109 3110 |
# File 'formula.rb', line 3105 def mkdir(name, &block) result = FileUtils.mkdir_p(name) return result unless block FileUtils.chdir(name, &block) end |
#mktemp(prefix = name, opts = {}, &block) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Create a temporary directory then yield. When the block returns,
recursively delete the temporary directory. Passing opts[:retain]
or calling do |staging| ... staging.retain!
in the block will skip
the deletion and retain the temporary directory's contents.
3099 3100 3101 |
# File 'formula.rb', line 3099 def mktemp(prefix = name, opts = {}, &block) Mktemp.new(prefix, opts).run(&block) end |
#network_access_allowed?(*args, **options, &block) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
78 |
# File 'sorbet/rbi/parlour.rbi', line 78 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.
1682 1683 1684 |
# File 'formula.rb', line 1682 def new_formula_available? installed_alias_target_changed? && !latest_formula.latest_version_installed? end |
#old_installed_formulae ⇒ 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.
1719 1720 1721 1722 1723 1724 1725 1726 |
# File 'formula.rb', line 1719 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 |
#oldname ⇒ 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.
Use #oldnames instead.
An old name for the formula.
560 561 562 563 |
# File 'formula.rb', line 560 def oldname odisabled "`Formula#oldname`", "`Formula#oldnames`" @oldname ||= oldnames.first 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.
569 570 571 572 573 574 575 576 |
# File 'formula.rb', line 569 def oldnames @oldnames ||= if (tap = self.tap) Tap.tap_migration_oldnames(tap, name) + tap.formula_reverse_renames.fetch(name, []) else [] end 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.
1631 1632 1633 1634 1635 1636 1637 1638 1639 |
# File 'formula.rb', line 1631 def oldnames_to_migrate oldnames.select do |oldname| old_rack = HOMEBREW_CELLAR/oldname next false unless old_rack.directory? next false if old_rack.subdirs.empty? tap == Tab.for_keg(old_rack.subdirs.min).tap end end |
#on_system_blocks_exist? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2755 2756 2757 |
# File 'formula.rb', line 2755 def on_system_blocks_exist? self.class.on_system_blocks_exist? || @on_system_blocks_exist end |
#opt_bin ⇒ Pathname
Same as #bin, but relative to #opt_prefix instead of #prefix.
1297 1298 1299 |
# File 'formula.rb', line 1297 def opt_bin opt_prefix/"bin" end |
#opt_elisp ⇒ Pathname
Same as #elisp, but relative to #opt_prefix instead of #prefix.
1353 1354 1355 |
# File 'formula.rb', line 1353 def opt_elisp opt_prefix/"share/emacs/site-lisp"/name end |
#opt_frameworks ⇒ Pathname
Same as #frameworks, but relative to #opt_prefix instead of #prefix.
1361 1362 1363 |
# File 'formula.rb', line 1361 def opt_frameworks opt_prefix/"Frameworks" end |
#opt_include ⇒ Pathname
Same as #include, but relative to #opt_prefix instead of #prefix.
1305 1306 1307 |
# File 'formula.rb', line 1305 def opt_include opt_prefix/"include" end |
#opt_lib ⇒ Pathname
Same as #lib, but relative to #opt_prefix instead of #prefix.
1313 1314 1315 |
# File 'formula.rb', line 1313 def opt_lib opt_prefix/"lib" end |
#opt_libexec ⇒ Pathname
Same as #libexec, but relative to #opt_prefix instead of #prefix.
1321 1322 1323 |
# File 'formula.rb', line 1321 def opt_libexec opt_prefix/"libexec" end |
#opt_pkgshare ⇒ Pathname
Same as #pkgshare, but relative to #opt_prefix instead of #prefix.
1345 1346 1347 |
# File 'formula.rb', line 1345 def opt_pkgshare opt_prefix/"share"/name end |
#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"
1289 1290 1291 |
# File 'formula.rb', line 1289 def opt_prefix HOMEBREW_PREFIX/"opt"/name end |
#opt_sbin ⇒ Pathname
Same as #sbin, but relative to #opt_prefix instead of #prefix.
1329 1330 1331 |
# File 'formula.rb', line 1329 def opt_sbin opt_prefix/"sbin" end |
#opt_share ⇒ Pathname
Same as #share, but relative to #opt_prefix instead of #prefix.
1337 1338 1339 |
# File 'formula.rb', line 1337 def opt_share opt_prefix/"share" end |
#option_defined? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
If a named option is defined for the currently active SoftwareSpec.
631 |
# File 'formula.rb', line 631 delegate option_defined?: :active_spec |
#options(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
99 |
# File 'sorbet/rbi/parlour.rbi', line 99 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
?
728 729 730 |
# File 'formula.rb', line 728 def optlinked? opt_prefix.symlink? end |
#outdated?(fetch_head: false) ⇒ Boolean
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Check whether the installed formula is outdated.
1732 1733 1734 1735 1736 |
# File 'formula.rb', line 1732 def outdated?(fetch_head: false) !outdated_kegs(fetch_head:).empty? rescue Migrator::MigrationNeededError true end |
#outdated_kegs(fetch_head: false) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 |
# File 'formula.rb', line 1646 def outdated_kegs(fetch_head: false) raise Migrator::MigrationNeededError.new(oldnames_to_migrate.first, name) if migration_needed? cache_key = "#{full_name}-#{fetch_head}" Formula.cache[:outdated_kegs] ||= {} Formula.cache[:outdated_kegs][cache_key] ||= begin all_kegs = [] current_version = T.let(false, T::Boolean) installed_kegs.each do |keg| all_kegs << keg version = keg.version next if version.head? next if version_scheme > keg.version_scheme && pkg_version != version next if version_scheme == keg.version_scheme && pkg_version > version # don't consider this keg current if there's a newer formula available next if follow_installed_alias? && new_formula_available? # this keg is the current version of the formula, so it's not outdated current_version = true break end if current_version || ((head_version = latest_head_version) && !head_version_outdated?(head_version, fetch_head:)) [] else all_kegs += old_installed_formulae.flat_map(&:installed_kegs) all_kegs.sort_by(&:scheme_and_version) end end end |
#patch ⇒ 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.
1568 1569 1570 1571 1572 1573 |
# File 'formula.rb', line 1568 def patch return if patchlist.empty? ohai "Patching" patchlist.each(&:apply) end |
#pin(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
147 |
# File 'sorbet/rbi/parlour.rbi', line 147 def pin(*args, **, &block); end |
#pinnable?(*args, **options, &block) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
138 |
# File 'sorbet/rbi/parlour.rbi', line 138 def pinnable?(*args, **, &block); end |
#pinned?(*args, **options, &block) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
141 |
# File 'sorbet/rbi/parlour.rbi', line 141 def pinned?(*args, **, &block); end |
#pinned_version(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
144 |
# File 'sorbet/rbi/parlour.rbi', line 144 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.
500 501 502 |
# File 'formula.rb', line 500 def pkg_version PkgVersion.new(version, revision) end |
#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
.
1099 1100 1101 |
# File 'formula.rb', line 1099 def pkgetc (HOMEBREW_PREFIX/"etc"/name).extend(InstallRenamed) end |
#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"
1037 1038 1039 |
# File 'formula.rb', line 1037 def pkgshare prefix/"share"/name end |
#plist ⇒ 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.
Use Homebrew::Service instead.
This method can be overridden to provide a plist.
Example
def plist; <<~EOS
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>#{plist_name}</string>
<key>ProgramArguments</key>
<array>
<string>#{opt_bin}/example</string>
<string>--do-this</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardErrorPath</key>
<string>/dev/null</string>
<key>StandardOutPath</key>
<string>/dev/null</string>
</dict>
</plist>
EOS
end
1233 1234 1235 1236 1237 |
# File 'formula.rb', line 1233 def plist # odeprecated: consider removing entirely in 4.3.0 # odeprecated "`Formula#plist`", "`Homebrew::Service`" nil end |
#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.
1241 1242 1243 |
# File 'formula.rb', line 1241 def plist_name service.plist_name end |
#possible_names ⇒ 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.
1767 1768 1769 |
# File 'formula.rb', line 1767 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.
Can be overridden to run commands on both source and bottle installation.
1380 |
# File 'formula.rb', line 1380 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.
1383 1384 1385 |
# File 'formula.rb', line 1383 def post_install_defined? method(:post_install).owner != Formula end |
#pour_bottle? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Indicates that this formula supports bottles. (Not necessarily that one
should be used in the current installation run.)
Can be overridden to selectively disable bottles from formulae.
Defaults to true so overridden version does not have to check if bottles
are supported.
Replaced by pour_bottle?'s satisfy
method if it is specified.
1372 1373 1374 |
# File 'formula.rb', line 1372 def pour_bottle? true end |
#pour_bottle_check_unsatisfied_reason(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
114 |
# File 'sorbet/rbi/parlour.rbi', line 114 def pour_bottle_check_unsatisfied_reason(*args, **, &block); end |
#prefix(version = pkg_version) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The directory in the cellar that the formula is installed to. This directory points to #opt_prefix if it exists and if #prefix is not called from within the same formula's #install or #post_install methods. Otherwise, return the full path to the formula's versioned cellar.
708 709 710 711 712 713 714 715 716 |
# File 'formula.rb', line 708 def prefix(version = pkg_version) versioned_prefix = versioned_prefix(version) if !@prefix_returns_versioned_prefix && version == pkg_version && versioned_prefix.directory? && Keg.new(versioned_prefix).optlinked? opt_prefix else versioned_prefix end end |
#prefix_linked?(version = pkg_version) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
If a formula's linked keg points to the prefix.
733 734 735 736 737 |
# File 'formula.rb', line 733 def prefix_linked?(version = pkg_version) return false unless linked? linked_keg.resolved_path == versioned_prefix(version) end |
#print_tap_action(options = {}) ⇒ 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.
2233 2234 2235 2236 2237 2238 |
# File 'formula.rb', line 2233 def print_tap_action( = {}) return unless tap? verb = [:verb] || "Installing" ohai "#{verb} #{name} from #{tap}" 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.
750 751 752 |
# File 'formula.rb', line 750 def rack HOMEBREW_CELLAR/name end |
#recursive_dependencies(&block) ⇒ Object
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns a list of Dependency objects in an installable order, which means if a depends on b then b will be ordered before a in this list
2255 2256 2257 2258 |
# File 'formula.rb', line 2255 def recursive_dependencies(&block) cache_key = "Formula#recursive_dependencies" unless block Dependency.(self, cache_key:, &block) end |
#recursive_requirements(&block) ⇒ Object
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The full set of Requirements for this formula's dependency tree.
2263 2264 2265 2266 |
# File 'formula.rb', line 2263 def recursive_requirements(&block) cache_key = "Formula#recursive_requirements" unless block Requirement.(self, cache_key:, &block) end |
#require_universal_deps? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
1564 1565 1566 |
# File 'formula.rb', line 1564 def require_universal_deps? false end |
#requirements(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
90 |
# File 'sorbet/rbi/parlour.rbi', line 90 def requirements(*args, **, &block); end |
#resources ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The Resources for the currently active SoftwareSpec.
588 |
# File 'formula.rb', line 588 def_delegator :"active_spec.resources", :values, :resources |
#rpath(source: bin, target: lib) ⇒ String
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Executable/Library RPATH according to platform conventions.
Optionally specify a source
or target
depending on the location
of the file containing the RPATH command and where its target is located.
Example
rpath #=> "@loader_path/../lib"
rpath(target: frameworks) #=> "@loader_path/../Frameworks"
rpath(source: libexec/"bin") #=> "@loader_path/../../lib"
1909 1910 1911 1912 1913 1914 1915 |
# File 'formula.rb', line 1909 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.
2370 2371 2372 |
# File 'formula.rb', line 2370 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.
2365 2366 2367 |
# File 'formula.rb', line 2365 def ruby_source_path path.relative_path_from(T.must(tap).path).to_s if tap && path.exist? 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.
1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 |
# File 'formula.rb', line 1398 def run_post_install @prefix_returns_versioned_prefix = true build = self.build begin self.build = Tab.for_formula(self) new_env = { TMPDIR: HOMEBREW_TEMP, TEMP: HOMEBREW_TEMP, TMP: HOMEBREW_TEMP, _JAVA_OPTIONS: "-Djava.io.tmpdir=#{HOMEBREW_TEMP}", HOMEBREW_PATH: nil, PATH: PATH.new(ORIGINAL_PATHS), } with_env(new_env) do ENV.clear_sensitive_environment! ENV.activate_extensions! with_logging("post_install") do post_install end end ensure self.build = build @prefix_returns_versioned_prefix = false end end |
#run_test(keep_tmp: false) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 |
# File 'formula.rb', line 2767 def run_test(keep_tmp: false) @prefix_returns_versioned_prefix = true test_env = { TMPDIR: HOMEBREW_TEMP, TEMP: HOMEBREW_TEMP, TMP: HOMEBREW_TEMP, TERM: "dumb", PATH: PATH.new(ENV.fetch("PATH"), HOMEBREW_PREFIX/"bin"), HOMEBREW_PATH: nil, }.merge(common_stage_test_env) test_env[:_JAVA_OPTIONS] += " -Djava.io.tmpdir=#{HOMEBREW_TEMP}" ENV.clear_sensitive_environment! Utils::Git.set_name_email! mktemp("#{name}-test") do |staging| staging.retain! if keep_tmp @testpath = staging.tmpdir test_env[:HOME] = @testpath setup_home @testpath begin with_logging("test") do with_env(test_env) do test end end rescue Exception # rubocop:disable Lint/RescueException staging.retain! if debug? raise end end ensure @prefix_returns_versioned_prefix = false @testpath = nil end |
#runtime_dependencies(read_from_tab: true, undeclared: true) ⇒ Object
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns a list of Dependency objects that are required at runtime.
2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 |
# File 'formula.rb', line 2299 def runtime_dependencies(read_from_tab: true, undeclared: true) deps = if read_from_tab && undeclared && (tab_deps = any_installed_keg&.runtime_dependencies) tab_deps.filter_map do |d| full_name = d["full_name"] next unless full_name Dependency.new full_name end end begin deps ||= declared_runtime_dependencies unless undeclared deps ||= (declared_runtime_dependencies | undeclared_runtime_dependencies) rescue FormulaUnavailableError onoe "Could not get runtime dependencies from #{path}!" deps ||= [] end deps end |
#runtime_formula_dependencies(read_from_tab: true, undeclared: true) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Returns a list of Formula objects that are required at runtime.
2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 |
# File 'formula.rb', line 2320 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 ⇒ 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.
2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 |
# File 'formula.rb', line 2334 def runtime_installed_formula_dependents # `any_installed_keg` and `runtime_dependencies` `select`s ensure # that we don't end up with something `Formula#runtime_dependencies` can't # read from a `Tab`. Formula.cache[:runtime_installed_formula_dependents] ||= {} Formula.cache[:runtime_installed_formula_dependents][full_name] ||= Formula.installed .select(&:any_installed_keg) .select(&:runtime_dependencies) .select do |f| f.runtime_formula_dependencies.any? do |dep| full_name == dep.full_name rescue name == dep.name end end end |
#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.
982 983 984 |
# File 'formula.rb', line 982 def sbin prefix/"sbin" end |
#serialized_requirements ⇒ 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.
2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 |
# File 'formula.rb', line 2643 def serialized_requirements requirements = self.class.spec_syms.to_h do |sym| [sym, send(sym)&.requirements] end merge_spec_dependables(requirements).map do |data| req = data[:dependable] req_name = req.name.dup req_name.prepend("maximum_") if req.respond_to?(:comparator) && req.comparator == "<=" req_version = if req.respond_to?(:version) req.version elsif req.respond_to?(:arch) req.arch end { "name" => req_name, "cask" => req.cask, "download" => req.download, "version" => req_version, "contexts" => req., "specs" => data[:specs], } end end |
#service ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The service specification of the software.
1270 1271 1272 |
# File 'formula.rb', line 1270 def service @service ||= Homebrew::Service.new(self, &self.class.service) end |
#service? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Is a service specification defined for the software?
458 |
# File 'formula.rb', line 458 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.
1247 1248 1249 |
# File 'formula.rb', line 1247 def service_name service.service_name 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"
1018 1019 1020 |
# File 'formula.rb', line 1018 def share prefix/"share" end |
#shared_library(name, version = nil) ⇒ String
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Shared library names according to platform conventions.
Optionally specify a version
to restrict the shared library to a specific
version. The special string "*" matches any version.
If name
is specified as "*", match any shared library of any version.
Example
shared_library("foo") #=> foo.dylib
shared_library("foo", 1) #=> foo.1.dylib
shared_library("foo", "*") #=> foo.2.dylib, foo.1.dylib, foo.dylib
shared_library("*") #=> foo.dylib, bar.dylib
12 13 14 15 16 17 18 19 |
# File 'extend/os/linux/formula.rb', line 12 def shared_library(name, version = nil) suffix = if version == "*" || (name == "*" && version.blank?) "{,.*}" elsif version.present? ".#{version}" end "#{name}.so#{suffix}" end |
#skip_clean?(path) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
1474 1475 1476 1477 1478 1479 |
# File 'formula.rb', line 1474 def skip_clean?(path) return true if path.extname == ".la" && self.class.skip_clean_paths.include?(:la) to_check = path.relative_path_from(prefix).to_s self.class.skip_clean_paths.include? to_check end |
#skip_cxxstdlib_check? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
1559 1560 1561 |
# File 'formula.rb', line 1559 def skip_cxxstdlib_check? false end |
#specified_name ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The name specified to find this formula.
372 373 374 |
# File 'formula.rb', line 372 def specified_name alias_name || name end |
#specified_path ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
The path that was specified to find this formula.
361 362 363 364 365 366 367 368 369 |
# File 'formula.rb', line 361 def specified_path return alias_path if alias_path&.exist? return @unresolved_path if @unresolved_path.exist? return local_bottle_path if local_bottle_path.presence&.exist? alias_path || @unresolved_path end |
#stable? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Is the currently active SoftwareSpec a #stable build?
393 394 395 |
# File 'formula.rb', line 393 def stable? active_spec == stable end |
#std_cabal_v2_args ⇒ Array<String>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Standard parameters for cabal-v2 builds.
1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 |
# File 'formula.rb', line 1839 def std_cabal_v2_args env = T.cast(ENV, T.any(Stdenv, Superenv)) # cabal-install's dependency-resolution backtracking strategy can # easily need more than the default 2,000 maximum number of # "backjumps," since Hackage is a fast-moving, rolling-release # target. The highest known needed value by a formula was 43,478 # for git-annex, so 100,000 should be enough to avoid most # gratuitous backjumps build failures. ["--jobs=#{env.make_jobs}", "--max-backjumps=100000", "--install-method=copy", "--installdir=#{bin}"] end |
#std_cargo_args(root: prefix, path: ".") ⇒ Array<String>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Standard parameters for cargo builds.
1796 1797 1798 |
# File 'formula.rb', line 1796 def std_cargo_args(root: prefix, path: ".") ["--locked", "--root=#{root}", "--path=#{path}"] end |
#std_cmake_args(install_prefix: prefix, install_libdir: "lib", find_framework: "LAST") ⇒ Array<String> Also known as: generic_std_cmake_args
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Standard parameters for CMake builds.
Setting CMAKE_FIND_FRAMEWORK
to "LAST" tells CMake to search for our
libraries before trying to utilize Frameworks, many of which will be from
3rd party installs.
20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'extend/os/mac/formula.rb', line 20 def std_cmake_args(install_prefix: prefix, install_libdir: "lib", find_framework: "LAST") args = generic_std_cmake_args(install_prefix:, install_libdir:, find_framework:) # Avoid false positives for clock_gettime support on 10.11. # CMake cache entries for other weak symbols may be added here as needed. args << "-DHAVE_CLOCK_GETTIME:INTERNAL=0" if MacOS.version == "10.11" && MacOS::Xcode.version >= "8.0" # Ensure CMake is using the same SDK we are using. args << "-DCMAKE_OSX_SYSROOT=#{MacOS.sdk_for_formula(self).path}" if MacOS.sdk_root_needed? args end |
#std_configure_args(prefix: self.prefix, libdir: "lib") ⇒ Array<String>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Standard parameters for configure builds.
1787 1788 1789 1790 |
# File 'formula.rb', line 1787 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) ⇒ Array<String>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Standard parameters for Go builds.
1831 1832 1833 1834 1835 |
# File 'formula.rb', line 1831 def std_go_args(output: bin/name, ldflags: nil) args = ["-trimpath", "-o=#{output}"] args += ["-ldflags=#{Array(ldflags).join(" ")}"] if ldflags args end |
#std_meson_args ⇒ Array<String>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Standard parameters for meson builds.
1853 1854 1855 |
# File 'formula.rb', line 1853 def std_meson_args ["--prefix=#{prefix}", "--libdir=#{lib}", "--buildtype=release", "--wrap-mode=nofallback"] end |
#std_pip_args(prefix: self.prefix, build_isolation: false) ⇒ Array<String>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Standard parameters for pip builds.
1862 1863 1864 1865 1866 1867 |
# File 'formula.rb', line 1862 def std_pip_args(prefix: self.prefix, build_isolation: false) args = ["--verbose", "--no-deps", "--no-binary=:all:", "--ignore-installed", "--no-compile"] args << "--prefix=#{prefix}" if prefix args << "--no-build-isolation" unless build_isolation args end |
#supersedes_an_installed_formula? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Is this formula the target of an alias used to install an old formula?
1702 1703 1704 |
# File 'formula.rb', line 1702 def supersedes_an_installed_formula? old_installed_formulae.any? end |
#synced_with_other_formulae? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Whether this Formula is version-synced with other formulae.
541 542 543 544 545 |
# File 'formula.rb', line 541 def synced_with_other_formulae? return false if @tap.nil? @tap.synced_versions_formulae.any? { |synced_formulae| synced_formulae.include?(name) } end |
#system(cmd, *args) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
To call out to the system, we use the system
method and we prefer
you give the args separately as in the line below, otherwise a subshell
has to be opened first.
Examples
system "./bootstrap.sh", "--arg1", "--prefix=#{prefix}"
For CMake and other build systems we have some necessary defaults in e.g. #std_cmake_args:
system "cmake", ".", *std_cmake_args
If the arguments given to configure
(or make
or cmake
) are depending
on options defined above, we usually make a list first and then
use the args << if <condition>
to append each:
args = ["--with-option1", "--with-option2"]
args << "--without-gcc" if ENV.compiler == :clang
Most software still uses configure
and make
.
Check with ./configure --help
for what our options are.
system "./configure", "--disable-debug", "--disable-dependency-tracking",
"--disable-silent-rules", "--prefix=#{prefix}",
*args # our custom arg list (needs `*` to unpack)
If there is a "make install" available, please use it!
system "make", "install"
2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 |
# File 'formula.rb', line 2949 def system(cmd, *args) verbose_using_dots = Homebrew::EnvConfig.verbose_using_dots? # remove "boring" arguments so that the important ones are more likely to # be shown considering that we trim long ohai lines to the terminal width pretty_args = args.dup unless verbose? case cmd when "./configure" pretty_args -= std_configure_args when "cabal" pretty_args -= std_cabal_v2_args when "cargo" pretty_args -= std_cargo_args when "cmake" pretty_args -= std_cmake_args when "go" pretty_args -= std_go_args when "meson" pretty_args -= std_meson_args when %r{(^|/)(pip|python)(?:[23](?:\.\d{1,2})?)?$} pretty_args -= std_pip_args end end pretty_args.each_index do |i| pretty_args[i] = "import setuptools..." if pretty_args[i].to_s.start_with? "import setuptools" end ohai "#{cmd} #{pretty_args * " "}".strip @exec_count ||= 0 @exec_count += 1 logfn = format("#{logs}/#{active_log_prefix}%02<exec_count>d.%<cmd_base>s", exec_count: @exec_count, cmd_base: File.basename(cmd).split.first) logs.mkpath File.open(logfn, "w") do |log| log.puts Time.now, "", cmd, args, "" log.flush if verbose? rd, wr = IO.pipe begin pid = fork do rd.close log.close exec_cmd(cmd, args, wr, logfn) end wr.close if verbose_using_dots last_dot = Time.at(0) while (buf = rd.gets) log.puts buf # make sure dots printed with interval of at least 1 min. next if (Time.now - last_dot) <= 60 print "." $stdout.flush last_dot = Time.now end puts else while (buf = rd.gets) log.puts buf puts buf end end ensure rd.close end else pid = fork do exec_cmd(cmd, args, log, logfn) end end Process.wait(T.must(pid)) $stdout.flush unless $CHILD_STATUS.success? log_lines = Homebrew::EnvConfig.fail_log_lines log.flush if !verbose? || verbose_using_dots puts "Last #{log_lines} lines from #{logfn}:" Kernel.system "/usr/bin/tail", "-n", log_lines.to_s, logfn end log.puts require "system_config" require "build_environment" env = ENV.to_hash SystemConfig.dump_verbose_config(log) log.puts BuildEnvironment.dump env, log raise BuildError.new(self, cmd, args, env) end end end |
#systemd_service_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.
1259 1260 1261 |
# File 'formula.rb', line 1259 def systemd_service_path opt_prefix/"#{service_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.
1265 1266 1267 |
# File 'formula.rb', line 1265 def systemd_timer_path opt_prefix/"#{service_name}.timer" end |
#tap? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
True if this formula is provided by external Tap
2220 2221 2222 2223 2224 |
# File 'formula.rb', line 2220 def tap? return false unless tap !T.must(tap).core_tap? end |
#tap_git_head ⇒ 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.
2240 2241 2242 |
# File 'formula.rb', line 2240 def tap_git_head tap&.git_head end |
#test ⇒ 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.
2809 |
# File 'formula.rb', line 2809 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.
2805 2806 2807 |
# File 'formula.rb', line 2805 def test_defined? false end |
#test_fixtures(file) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2811 2812 2813 |
# File 'formula.rb', line 2811 def test_fixtures(file) HOMEBREW_LIBRARY_PATH/"test/support/fixtures"/file 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.
1926 1927 1928 1929 1930 1931 1932 |
# File 'formula.rb', line 1926 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 ⇒ 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.
2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 |
# File 'formula.rb', line 2389 def to_hash hsh = { "name" => name, "full_name" => full_name, "tap" => tap&.name, "oldname" => oldnames.first, # deprecated "oldnames" => oldnames, "aliases" => aliases.sort, "versioned_formulae" => versioned_formulae.map(&:name), "desc" => desc, "license" => SPDX.license_expression_to_string(license), "homepage" => homepage, "versions" => { "stable" => stable&.version&.to_s, "head" => head&.version&.to_s, "bottle" => bottle_defined?, }, "urls" => urls_hash, "revision" => revision, "version_scheme" => version_scheme, "bottle" => {}, "pour_bottle_only_if" => self.class.pour_bottle_only_if&.to_s, "keg_only" => keg_only?, "keg_only_reason" => keg_only_reason&.to_hash, "options" => [], "build_dependencies" => [], "dependencies" => [], "test_dependencies" => [], "recommended_dependencies" => [], "optional_dependencies" => [], "uses_from_macos" => [], "uses_from_macos_bounds" => [], "requirements" => serialized_requirements, "conflicts_with" => conflicts.map(&:name), "conflicts_with_reasons" => conflicts.map(&:reason), "link_overwrite" => self.class.link_overwrite_paths.to_a, "caveats" => caveats_with_placeholders, "installed" => T.let([], T::Array[T::Hash[String, T.untyped]]), "linked_keg" => linked_version&.to_s, "pinned" => pinned?, "outdated" => outdated?, "deprecated" => deprecated?, "deprecation_date" => deprecation_date, "deprecation_reason" => deprecation_reason, "disabled" => disabled?, "disable_date" => disable_date, "disable_reason" => disable_reason, "post_install_defined" => post_install_defined?, "service" => (service.to_hash if service?), "tap_git_head" => tap_git_head, "ruby_source_path" => ruby_source_path, "ruby_source_checksum" => {}, } hsh["bottle"]["stable"] = bottle_hash if stable && bottle_defined? hsh["options"] = .map do |opt| { "option" => opt.flag, "description" => opt.description } end hsh.merge!(dependencies_hash) hsh["installed"] = installed_kegs.sort_by(&:scheme_and_version).map do |keg| tab = keg.tab { "version" => keg.version.to_s, "used_options" => tab..as_flags, "built_as_bottle" => tab.built_as_bottle, "poured_from_bottle" => tab.poured_from_bottle, "time" => tab.time, "runtime_dependencies" => tab.runtime_dependencies, "installed_as_dependency" => tab.installed_as_dependency, "installed_on_request" => tab.installed_on_request, } end if (source_checksum = ruby_source_checksum) hsh["ruby_source_checksum"] = { "sha256" => source_checksum.hexdigest, } end hsh end |
#to_hash_with_variations(hash_method: :to_hash) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 |
# File 'formula.rb', line 2536 def to_hash_with_variations(hash_method: :to_hash) if loaded_from_api? && hash_method == :to_internal_api_hash raise ArgumentError, "API Hash must be generated from Ruby source files" end namespace_prefix = case hash_method when :to_hash "Variations" when :to_internal_api_hash "APIVariations" else raise ArgumentError, "Unknown hash method #{hash_method.inspect}" end hash = public_send(hash_method) # Take from API, merging in local install status. if loaded_from_api? && !Homebrew::EnvConfig.no_install_from_api? json_formula = Homebrew::API::Formula.all_formulae.fetch(name).dup return json_formula.merge( hash.slice("name", "installed", "linked_keg", "pinned", "outdated"), ) end variations = {} if path.exist? && on_system_blocks_exist? formula_contents = path.read OnSystem::ALL_OS_ARCH_COMBINATIONS.each do |os, arch| bottle_tag = Utils::Bottles::Tag.new(system: os, arch:) next unless bottle_tag.valid_combination? Homebrew::SimulateSystem.with(os:, arch:) do variations_namespace = Formulary.class_s("#{namespace_prefix}#{bottle_tag.to_sym.capitalize}") variations_formula_class = Formulary.load_formula(name, path, formula_contents, variations_namespace, flags: self.class.build_flags, ignore_errors: true) variations_formula = variations_formula_class.new(name, path, :stable, alias_path:, force_bottle:) variations_formula.public_send(hash_method).each do |key, value| next if value.to_s == hash[key].to_s variations[bottle_tag.to_sym] ||= {} variations[bottle_tag.to_sym][key] = value end end end end hash["variations"] = variations if hash_method != :to_internal_api_hash || variations.present? hash end |
#to_internal_api_hash ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 |
# File 'formula.rb', line 2474 def to_internal_api_hash api_hash = { "desc" => desc, "license" => SPDX.license_expression_to_string(license), "homepage" => homepage, "urls" => urls_hash.transform_values(&:compact), "post_install_defined" => post_install_defined?, "ruby_source_path" => ruby_source_path, "ruby_source_sha256" => ruby_source_checksum&.hexdigest, } # Exclude default values. api_hash["revision"] = revision unless revision.zero? api_hash["version_scheme"] = version_scheme unless version_scheme.zero? # Optional values. api_hash["keg_only_reason"] = keg_only_reason.to_hash if keg_only_reason api_hash["pour_bottle_only_if"] = self.class.pour_bottle_only_if.to_s if self.class.pour_bottle_only_if api_hash["link_overwrite"] = self.class.link_overwrite_paths.to_a if self.class.link_overwrite_paths.present? api_hash["caveats"] = caveats_with_placeholders if caveats api_hash["service"] = service.to_hash if service? if stable api_hash["version"] = stable&.version&.to_s api_hash["bottle"] = bottle_hash(compact_for_api: true) if bottle_defined? end if (versioned_formulae_list = versioned_formulae.presence) # Could we just use `versioned_formulae_names` here instead? api_hash["versioned_formulae"] = versioned_formulae_list.map(&:name) end if (dependencies = internal_dependencies_hash(:stable).presence) api_hash["dependencies"] = dependencies end if (head_dependencies = internal_dependencies_hash(:head).presence) api_hash["head_dependencies"] = head_dependencies end if (requirements_array = serialized_requirements.presence) api_hash["requirements"] = requirements_array end if conflicts.present? api_hash["conflicts_with"] = conflicts.map(&:name) api_hash["conflicts_with_reasons"] = conflicts.map(&:reason) end if deprecation_date api_hash["deprecation_date"] = deprecation_date api_hash["deprecation_reason"] = deprecation_reason end if disable_date api_hash["disable_date"] = disable_date api_hash["disable_reason"] = disable_reason end api_hash end |
#unlock ⇒ 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.
1625 1626 1627 1628 |
# File 'formula.rb', line 1625 def unlock @lock&.unlock @oldname_locks.each(&:unlock) end |
#unpin(*args, **options, &block) ⇒ T.untyped
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
150 |
# File 'sorbet/rbi/parlour.rbi', line 150 def unpin(*args, **, &block); 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.
480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 |
# File 'formula.rb', line 480 def update_head_version return unless head? head_spec = T.must(head) return unless head_spec.downloader.is_a?(VCSDownloadStrategy) return unless head_spec.downloader.cached_location.exist? path = if ENV["HOMEBREW_ENV"] ENV.fetch("PATH") else PATH.new(ORIGINAL_PATHS) end with_env(PATH: path) do head_spec.version.update_commit(head_spec.downloader.last_commit) end end |
#urls_hash ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 |
# File 'formula.rb', line 2618 def urls_hash hash = {} if stable stable_spec = T.must(stable) hash["stable"] = { "url" => stable_spec.url, "tag" => stable_spec.specs[:tag], "revision" => stable_spec.specs[:revision], "using" => (stable_spec.using if stable_spec.using.is_a?(Symbol)), "checksum" => stable_spec.checksum&.to_s, } end if head hash["head"] = { "url" => T.must(head).url, "branch" => T.must(head).specs[:branch], "using" => (T.must(head).using if T.must(head).using.is_a?(Symbol)), } end hash end |
#uses_from_macos_elements ⇒ 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.
Use #declared_deps instead.
Dependencies provided by macOS for the currently active SoftwareSpec.
599 600 601 |
# File 'formula.rb', line 599 def uses_from_macos_elements odisabled "`Formula#uses_from_macos_elements`", "`Formula#declared_deps`" end |
#uses_from_macos_names ⇒ 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.
Use #declared_deps instead.
Dependency names provided by macOS for the currently active SoftwareSpec.
604 605 606 |
# File 'formula.rb', line 604 def uses_from_macos_names odisabled "`Formula#uses_from_macos_names`", "`Formula#declared_deps`" 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.
9 10 11 |
# File 'extend/os/mac/formula.rb', line 9 def valid_platform? requirements.none?(LinuxRequirement) 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.
1109 1110 1111 |
# File 'formula.rb', line 1109 def var HOMEBREW_PREFIX/"var" end |
#verify_download_integrity(filename) ⇒ 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.
2763 2764 2765 |
# File 'formula.rb', line 2763 def verify_download_integrity(filename) active_spec.verify_download_integrity(filename) end |
#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.
465 |
# File 'formula.rb', line 465 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.
506 507 508 |
# File 'formula.rb', line 506 def versioned_formula? name.include?("@") end |
#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).
531 532 533 534 535 536 537 |
# File 'formula.rb', line 531 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).
512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 |
# File 'formula.rb', line 512 def versioned_formulae_names versioned_names = if tap name_prefix = name.gsub(/(@[\d.]+)?$/, "") T.must(tap).prefix_to_versioned_formulae_names.fetch(name_prefix, []) elsif path.exist? Pathname.glob(path.to_s.gsub(/(@[\d.]+)?\.rb$/, "@*.rb")) .map { |path| path.basename(".rb").to_s } .sort else raise "Either tap or path is required to list versioned formulae" end versioned_names.reject do |versioned_name| versioned_name == name end end |
#with_logging(log_type) ⇒ 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.
Runs a block with the given log type in effect for its duration.
1193 1194 1195 1196 1197 1198 1199 |
# File 'formula.rb', line 1193 def with_logging(log_type) old_log_type = @active_log_type @active_log_type = log_type yield ensure @active_log_type = old_log_type end |
#xcodebuild(*args) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
Runs xcodebuild
without Homebrew's compiler environment variables set.
3114 3115 3116 3117 3118 3119 3120 3121 3122 |
# File 'formula.rb', line 3114 def xcodebuild(*args) removed = ENV.remove_cc_etc begin T.unsafe(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.
1153 1154 1155 |
# File 'formula.rb', line 1153 def zsh_completion share/"zsh/site-functions" end |
#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.
1120 1121 1122 |
# File 'formula.rb', line 1120 def zsh_function share/"zsh/site-functions" end |