2018-04-25 10:25:00 -04:00
|
|
|
require "cache_store"
|
2015-08-03 13:09:07 +01:00
|
|
|
require "formula_support"
|
2017-05-22 03:23:50 +02:00
|
|
|
require "lock_file"
|
2015-08-03 13:09:07 +01:00
|
|
|
require "formula_pin"
|
|
|
|
require "hardware"
|
2016-04-25 17:57:51 +01:00
|
|
|
require "utils/bottles"
|
2016-09-05 14:45:35 +10:00
|
|
|
require "utils/shell"
|
2015-08-03 13:09:07 +01:00
|
|
|
require "build_environment"
|
|
|
|
require "build_options"
|
|
|
|
require "formulary"
|
|
|
|
require "software_spec"
|
|
|
|
require "install_renamed"
|
|
|
|
require "pkg_version"
|
2015-08-23 16:35:51 +08:00
|
|
|
require "keg"
|
2015-11-27 17:58:16 +00:00
|
|
|
require "migrator"
|
2018-03-01 17:34:18 +00:00
|
|
|
require "linkage_checker"
|
2017-04-22 16:31:19 +01:00
|
|
|
require "extend/ENV"
|
2018-01-17 10:43:14 +00:00
|
|
|
require "language/python"
|
2018-03-25 12:43:56 +01:00
|
|
|
require "tab"
|
2018-07-13 14:42:49 +01:00
|
|
|
require "mktemp"
|
2012-04-05 21:09:24 -05:00
|
|
|
|
2014-12-06 11:26:43 +00:00
|
|
|
# A formula provides instructions and metadata for Homebrew to install a piece
|
|
|
|
# of software. Every Homebrew formula is a {Formula}.
|
|
|
|
# All subclasses of {Formula} (and all Ruby classes) have to be named
|
|
|
|
# `UpperCase` and `not-use-dashes`.
|
|
|
|
# A formula specified in `this-formula.rb` should have a class named
|
|
|
|
# `ThisFormula`. Homebrew does enforce that the name of the file and the class
|
|
|
|
# correspond.
|
|
|
|
# Make sure you check with `brew search` that the name is free!
|
|
|
|
# @abstract
|
2015-08-29 10:56:24 +01:00
|
|
|
# @see SharedEnvExtension
|
|
|
|
# @see FileUtils
|
|
|
|
# @see Pathname
|
2018-02-22 19:46:58 +00:00
|
|
|
# @see https://docs.brew.sh/Formula-Cookbook Formula Cookbook
|
2016-05-18 09:44:36 +01:00
|
|
|
# @see https://github.com/styleguide/ruby Ruby Style Guide
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# <pre>class Wget < Formula
|
|
|
|
# homepage "https://www.gnu.org/software/wget/"
|
|
|
|
# url "https://ftp.gnu.org/gnu/wget/wget-1.15.tar.gz"
|
|
|
|
# sha256 "52126be8cf1bddd7536886e74c053ad7d0ed2aa89b4b630f76785bac21695fcd"
|
|
|
|
#
|
|
|
|
# def install
|
|
|
|
# system "./configure", "--prefix=#{prefix}"
|
|
|
|
# system "make", "install"
|
|
|
|
# end
|
|
|
|
# end</pre>
|
2009-08-21 20:20:44 +01:00
|
|
|
class Formula
|
2012-03-06 19:23:51 -06:00
|
|
|
include FileUtils
|
2013-07-11 21:55:02 -05:00
|
|
|
include Utils::Inreplace
|
2016-09-05 14:45:35 +10:00
|
|
|
include Utils::Shell
|
2014-06-22 15:00:15 -05:00
|
|
|
extend Enumerable
|
2017-06-26 07:30:28 +02:00
|
|
|
extend Forwardable
|
2010-07-04 14:17:03 -07:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @!method inreplace(paths, before = nil, after = nil)
|
|
|
|
# Actually implemented in {Utils::Inreplace.inreplace}.
|
|
|
|
# Sometimes we have to change a bit before we install. Mostly we
|
|
|
|
# prefer a patch but if you need the `prefix` of this formula in the
|
|
|
|
# patch you have to resort to `inreplace`, because in the patch
|
|
|
|
# you don't have access to any var defined by the formula. Only
|
|
|
|
# HOMEBREW_PREFIX is available in the embedded patch.
|
|
|
|
# inreplace supports regular expressions.
|
|
|
|
# <pre>inreplace "somefile.cfg", /look[for]what?/, "replace by #{bin}/tool"</pre>
|
|
|
|
# @see Utils::Inreplace.inreplace
|
|
|
|
|
2014-12-06 11:26:43 +00:00
|
|
|
# The name of this {Formula}.
|
|
|
|
# e.g. `this-formula`
|
|
|
|
attr_reader :name
|
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
# 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`
|
2016-09-05 01:11:36 +01:00
|
|
|
attr_reader :alias_path
|
2016-09-03 21:10:44 +01:00
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
# The name of the alias that was used to identify this {Formula}.
|
|
|
|
# e.g. `another-name-for-this-formula`
|
|
|
|
attr_reader :alias_name
|
|
|
|
|
2015-05-27 20:30:43 +08:00
|
|
|
# The fully-qualified name of this {Formula}.
|
|
|
|
# For core formula it's the same as {#name}.
|
|
|
|
# e.g. `homebrew/tap-name/this-formula`
|
|
|
|
attr_reader :full_name
|
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
# The fully-qualified alias referring to this {Formula}.
|
|
|
|
# For core formula it's the same as {#alias_name}.
|
|
|
|
# e.g. `homebrew/tap-name/another-name-for-this-formula`
|
|
|
|
attr_reader :full_alias_name
|
|
|
|
|
2014-12-06 11:26:43 +00:00
|
|
|
# The full path to this {Formula}.
|
2016-04-05 13:19:16 +08:00
|
|
|
# e.g. `/usr/local/Library/Taps/homebrew/homebrew-core/Formula/this-formula.rb`
|
2014-12-06 11:26:43 +00:00
|
|
|
attr_reader :path
|
|
|
|
|
2015-12-06 22:16:08 +08:00
|
|
|
# The {Tap} instance associated with this {Formula}.
|
|
|
|
# If it's <code>nil</code>, then this formula is loaded from path or URL.
|
|
|
|
# @private
|
|
|
|
attr_reader :tap
|
|
|
|
|
2014-12-06 11:26:43 +00:00
|
|
|
# The stable (and default) {SoftwareSpec} for this {Formula}
|
2014-12-26 16:07:32 -05:00
|
|
|
# This contains all the attributes (e.g. URL, checksum) that apply to the
|
|
|
|
# stable version of this formula.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-12-06 11:26:43 +00:00
|
|
|
attr_reader :stable
|
|
|
|
|
|
|
|
# The development {SoftwareSpec} for this {Formula}.
|
|
|
|
# Installed when using `brew install --devel`
|
|
|
|
# `nil` if there is no development version.
|
|
|
|
# @see #stable
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-12-06 11:26:43 +00:00
|
|
|
attr_reader :devel
|
|
|
|
|
|
|
|
# The HEAD {SoftwareSpec} for this {Formula}.
|
|
|
|
# Installed when using `brew install --HEAD`
|
|
|
|
# This is always installed with the version `HEAD` and taken from the latest
|
|
|
|
# commit in the version control system.
|
|
|
|
# `nil` if there is no HEAD version.
|
|
|
|
# @see #stable
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-12-06 11:26:43 +00:00
|
|
|
attr_reader :head
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The currently active {SoftwareSpec}.
|
2015-01-04 15:33:25 -05:00
|
|
|
# @see #determine_active_spec
|
2014-12-06 11:26:43 +00:00
|
|
|
attr_reader :active_spec
|
2015-01-04 15:33:25 -05:00
|
|
|
protected :active_spec
|
2014-12-06 11:26:43 +00:00
|
|
|
|
2015-07-28 15:10:40 +08:00
|
|
|
# A symbol to indicate currently active {SoftwareSpec}.
|
|
|
|
# It's either :stable, :devel or :head
|
|
|
|
# @see #active_spec
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-07-28 15:10:40 +08:00
|
|
|
attr_reader :active_spec_sym
|
|
|
|
|
2016-01-14 19:00:06 +08:00
|
|
|
# most recent modified time for source files
|
|
|
|
# @private
|
|
|
|
attr_reader :source_modified_time
|
|
|
|
|
2014-12-06 11:26:43 +00:00
|
|
|
# Used for creating new Homebrew versions of software without new upstream
|
|
|
|
# versions.
|
|
|
|
# @see .revision
|
|
|
|
attr_reader :revision
|
|
|
|
|
2016-08-11 09:54:47 +02:00
|
|
|
# Used to change version schemes for packages
|
|
|
|
attr_reader :version_scheme
|
|
|
|
|
2014-12-06 11:26:43 +00:00
|
|
|
# The current working directory during builds.
|
|
|
|
# Will only be non-`nil` inside {#install}.
|
|
|
|
attr_reader :buildpath
|
|
|
|
|
|
|
|
# The current working directory during tests.
|
|
|
|
# Will only be non-`nil` inside {#test}.
|
|
|
|
attr_reader :testpath
|
|
|
|
|
|
|
|
# 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`.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-09-25 18:51:30 -05:00
|
|
|
attr_accessor :local_bottle_path
|
2014-12-06 11:26:43 +00:00
|
|
|
|
2016-05-27 01:53:08 -04:00
|
|
|
# When performing a build, test, or other loggable action, indicates which
|
|
|
|
# log file location to use.
|
|
|
|
# @private
|
|
|
|
attr_reader :active_log_type
|
|
|
|
|
2014-12-06 11:26:43 +00:00
|
|
|
# The {BuildOptions} for this {Formula}. Lists the arguments passed and any
|
|
|
|
# {#options} in the {Formula}. Note that these may differ at different times
|
|
|
|
# during the installation of a {Formula}. This is annoying but the result of
|
|
|
|
# state that we're trying to eliminate.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @return [BuildOptions]
|
2014-08-11 17:48:30 -05:00
|
|
|
attr_accessor :build
|
2013-09-25 18:51:30 -05:00
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
# A {Boolean} indicating whether this formula should be considered outdated
|
|
|
|
# if the target of the alias it was installed with has since changed.
|
|
|
|
# Defaults to true.
|
|
|
|
# @return [Boolean]
|
|
|
|
attr_accessor :follow_installed_alias
|
2016-09-23 18:13:48 +02:00
|
|
|
alias follow_installed_alias? follow_installed_alias
|
2016-09-15 16:01:18 +01:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# @private
|
2016-09-05 01:11:36 +01:00
|
|
|
def initialize(name, path, spec, alias_path: nil)
|
2012-03-09 10:18:12 -08:00
|
|
|
@name = name
|
2014-02-21 20:07:41 -05:00
|
|
|
@path = path
|
2016-09-05 01:11:36 +01:00
|
|
|
@alias_path = alias_path
|
2018-04-07 20:28:56 +01:00
|
|
|
@alias_name = if alias_path
|
|
|
|
File.basename(alias_path)
|
|
|
|
end
|
2014-03-05 20:12:51 -06:00
|
|
|
@revision = self.class.revision || 0
|
2016-08-11 09:54:47 +02:00
|
|
|
@version_scheme = self.class.version_scheme || 0
|
2013-04-13 17:40:12 -05:00
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
@tap = if path == Formulary.core_path(name)
|
|
|
|
CoreTap.instance
|
2018-03-29 22:05:02 +02:00
|
|
|
else
|
|
|
|
Tap.from_path(path)
|
2015-05-27 20:30:43 +08:00
|
|
|
end
|
|
|
|
|
2016-09-24 17:59:14 +02:00
|
|
|
@full_name = full_name_with_optional_tap(name)
|
|
|
|
@full_alias_name = full_name_with_optional_tap(@alias_name)
|
2016-09-15 16:01:18 +01:00
|
|
|
|
2016-09-24 17:59:14 +02:00
|
|
|
spec_eval :stable
|
|
|
|
spec_eval :devel
|
|
|
|
spec_eval :head
|
2012-04-05 21:09:24 -05:00
|
|
|
|
2014-06-19 21:35:47 -05:00
|
|
|
@active_spec = determine_active_spec(spec)
|
2015-07-28 15:10:40 +08:00
|
|
|
@active_spec_sym = if head?
|
|
|
|
:head
|
|
|
|
elsif devel?
|
|
|
|
:devel
|
|
|
|
else
|
|
|
|
:stable
|
|
|
|
end
|
2014-12-26 16:08:12 -05:00
|
|
|
validate_attributes!
|
2014-08-11 17:48:30 -05:00
|
|
|
@build = active_spec.build
|
2013-03-11 16:41:08 +01:00
|
|
|
@pin = FormulaPin.new(self)
|
2016-09-15 16:01:18 +01:00
|
|
|
@follow_installed_alias = true
|
2017-01-06 08:50:35 +00:00
|
|
|
@prefix_returns_versioned_prefix = false
|
2018-04-07 20:28:56 +01:00
|
|
|
@oldname_lock = nil
|
2012-04-05 21:09:24 -05:00
|
|
|
end
|
|
|
|
|
2015-07-30 16:25:21 +08:00
|
|
|
# @private
|
2016-09-24 17:59:14 +02:00
|
|
|
def active_spec=(spec_sym)
|
2015-07-30 16:25:21 +08:00
|
|
|
spec = send(spec_sym)
|
|
|
|
raise FormulaSpecificationError, "#{spec_sym} spec is not available for #{full_name}" unless spec
|
|
|
|
@active_spec = spec
|
|
|
|
@active_spec_sym = spec_sym
|
|
|
|
validate_attributes!
|
|
|
|
@build = active_spec.build
|
|
|
|
end
|
|
|
|
|
2014-12-06 11:27:17 +00:00
|
|
|
private
|
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
# Allow full name logic to be re-used between names, aliases,
|
|
|
|
# and installed aliases.
|
2016-09-24 17:59:14 +02:00
|
|
|
def full_name_with_optional_tap(name)
|
2016-09-15 16:01:18 +01:00
|
|
|
if name.nil? || @tap.nil? || @tap.core_tap?
|
|
|
|
name
|
|
|
|
else
|
|
|
|
"#{@tap}/#{name}"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-24 17:59:14 +02:00
|
|
|
def spec_eval(name)
|
2013-04-13 17:40:12 -05:00
|
|
|
spec = self.class.send(name)
|
2016-09-23 22:02:23 +02:00
|
|
|
return unless spec.url
|
|
|
|
spec.owner = self
|
|
|
|
instance_variable_set("@#{name}", spec)
|
2013-04-13 17:40:12 -05:00
|
|
|
end
|
|
|
|
|
2014-06-19 21:35:47 -05:00
|
|
|
def determine_active_spec(requested)
|
|
|
|
spec = send(requested) || stable || devel || head
|
2015-08-03 13:09:07 +01:00
|
|
|
spec || raise(FormulaSpecificationError, "formulae require at least a URL")
|
2013-04-13 17:40:12 -05:00
|
|
|
end
|
|
|
|
|
2014-12-26 16:08:12 -05:00
|
|
|
def validate_attributes!
|
|
|
|
if name.nil? || name.empty? || name =~ /\s/
|
2015-10-14 14:42:34 +02:00
|
|
|
raise FormulaValidationError.new(full_name, :name, name)
|
2014-12-26 16:08:12 -05:00
|
|
|
end
|
|
|
|
|
2014-12-26 16:07:32 -05:00
|
|
|
url = active_spec.url
|
2014-12-26 16:08:12 -05:00
|
|
|
if url.nil? || url.empty? || url =~ /\s/
|
2015-10-14 14:42:34 +02:00
|
|
|
raise FormulaValidationError.new(full_name, :url, url)
|
2014-12-26 16:08:12 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
val = version.respond_to?(:to_str) ? version.to_str : version
|
2016-09-23 22:02:23 +02:00
|
|
|
return unless val.nil? || val.empty? || val =~ /\s/
|
|
|
|
raise FormulaValidationError.new(full_name, :version, val)
|
2013-04-13 17:40:12 -05:00
|
|
|
end
|
|
|
|
|
2014-12-06 11:27:17 +00:00
|
|
|
public
|
|
|
|
|
2017-03-30 19:39:26 +01:00
|
|
|
# The alias path that was used to install this formula, if it exists.
|
2016-09-14 23:18:55 +01:00
|
|
|
# Can differ from alias_path, which is the alias used to find the formula,
|
|
|
|
# and is specified to this instance.
|
|
|
|
def installed_alias_path
|
|
|
|
path = build.source["path"] if build.is_a?(Tab)
|
2017-03-30 19:39:26 +01:00
|
|
|
return unless path =~ %r{#{HOMEBREW_TAP_DIR_REGEX}/Aliases}
|
|
|
|
return unless File.symlink?(path)
|
|
|
|
path
|
2016-09-14 23:18:55 +01:00
|
|
|
end
|
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
def installed_alias_name
|
|
|
|
File.basename(installed_alias_path) if installed_alias_path
|
|
|
|
end
|
|
|
|
|
|
|
|
def full_installed_alias_name
|
2016-09-24 17:59:14 +02:00
|
|
|
full_name_with_optional_tap(installed_alias_name)
|
2016-09-15 16:01:18 +01:00
|
|
|
end
|
|
|
|
|
2016-09-14 23:18:55 +01:00
|
|
|
# The path that was specified to find this formula.
|
2016-09-05 22:13:55 +01:00
|
|
|
def specified_path
|
|
|
|
alias_path || path
|
|
|
|
end
|
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
# The name specified to find this formula.
|
|
|
|
def specified_name
|
|
|
|
alias_name || name
|
|
|
|
end
|
|
|
|
|
|
|
|
# The name (including tap) specified to find this formula.
|
|
|
|
def full_specified_name
|
|
|
|
full_alias_name || full_name
|
|
|
|
end
|
|
|
|
|
|
|
|
# The name specified to install this formula.
|
|
|
|
def installed_specified_name
|
|
|
|
installed_alias_name || name
|
|
|
|
end
|
|
|
|
|
|
|
|
# The name (including tap) specified to install this formula.
|
|
|
|
def full_installed_specified_name
|
|
|
|
full_installed_alias_name || full_name
|
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# Is the currently active {SoftwareSpec} a {#stable} build?
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-10-29 23:32:38 -05:00
|
|
|
def stable?
|
|
|
|
active_spec == stable
|
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# Is the currently active {SoftwareSpec} a {#devel} build?
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-10-29 23:32:38 -05:00
|
|
|
def devel?
|
|
|
|
active_spec == devel
|
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# Is the currently active {SoftwareSpec} a {#head} build?
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-10-29 23:32:38 -05:00
|
|
|
def head?
|
|
|
|
active_spec == head
|
|
|
|
end
|
|
|
|
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate [
|
|
|
|
:bottle_unneeded?,
|
|
|
|
:bottle_disabled?,
|
|
|
|
:bottle_disable_reason,
|
|
|
|
:bottle_defined?,
|
|
|
|
:bottled?,
|
|
|
|
:bottle_specification,
|
|
|
|
] => :active_spec
|
2015-01-20 22:25:24 -05:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The Bottle object for the currently active {SoftwareSpec}.
|
|
|
|
# @private
|
2014-03-10 14:56:02 -05:00
|
|
|
def bottle
|
2015-01-20 22:25:24 -05:00
|
|
|
Bottle.new(self, bottle_specification) if bottled?
|
2014-03-10 14:56:02 -05:00
|
|
|
end
|
|
|
|
|
2015-05-19 13:06:06 -04:00
|
|
|
# The description of the software.
|
2017-06-26 07:30:28 +02:00
|
|
|
# @method desc
|
2015-05-19 13:06:06 -04:00
|
|
|
# @see .desc
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate desc: :"self.class"
|
2015-05-19 13:06:06 -04:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The homepage for the software.
|
2017-06-26 07:30:28 +02:00
|
|
|
# @method homepage
|
2014-12-26 20:24:12 +00:00
|
|
|
# @see .homepage
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate homepage: :"self.class"
|
2014-08-08 10:53:00 -05:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# 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.
|
2017-06-26 07:30:28 +02:00
|
|
|
# @method version
|
2014-12-26 20:24:12 +00:00
|
|
|
# @see .version
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate version: :active_spec
|
2014-12-26 20:24:12 +00:00
|
|
|
|
2016-07-13 10:11:59 +03:00
|
|
|
def update_head_version
|
|
|
|
return unless head?
|
|
|
|
return unless head.downloader.is_a?(VCSDownloadStrategy)
|
|
|
|
return unless head.downloader.cached_location.exist?
|
|
|
|
|
2018-06-01 16:43:11 +01:00
|
|
|
path = if ENV["HOMEBREW_ENV"]
|
|
|
|
ENV["PATH"]
|
|
|
|
else
|
|
|
|
ENV["HOMEBREW_PATH"]
|
|
|
|
end
|
|
|
|
|
|
|
|
with_env(PATH: path) do
|
|
|
|
head.version.update_commit(head.downloader.last_commit)
|
|
|
|
end
|
2016-07-13 10:11:59 +03:00
|
|
|
end
|
|
|
|
|
2015-07-30 15:53:03 +08:00
|
|
|
# The {PkgVersion} for this formula with {version} and {#revision} information.
|
|
|
|
def pkg_version
|
|
|
|
PkgVersion.new(version, revision)
|
|
|
|
end
|
|
|
|
|
2017-01-17 10:43:43 +00:00
|
|
|
# If this is a `@`-versioned formula.
|
|
|
|
def versioned_formula?
|
|
|
|
name.include?("@")
|
|
|
|
end
|
|
|
|
|
2018-05-12 14:35:50 -04:00
|
|
|
# Returns any `@`-versioned formulae for an non-`@`-versioned formula.
|
|
|
|
def versioned_formulae
|
|
|
|
return [] if versioned_formula?
|
|
|
|
|
|
|
|
Pathname.glob(path.to_s.gsub(/\.rb$/, "@*.rb")).map do |path|
|
|
|
|
Formula[path.basename(".rb").to_s]
|
|
|
|
end.sort
|
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# A named Resource for the currently active {SoftwareSpec}.
|
2015-08-29 10:56:24 +01:00
|
|
|
# Additional downloads can be defined as {#resource}s.
|
|
|
|
# {Resource#stage} will create a temporary directory and yield to a block.
|
|
|
|
# <pre>resource("additional_files").stage { bin.install "my/extra/tool" }</pre>
|
2017-06-26 07:30:28 +02:00
|
|
|
# @method resource
|
|
|
|
delegate resource: :active_spec
|
2013-08-06 19:52:58 -07:00
|
|
|
|
2015-08-09 14:46:07 +03:00
|
|
|
# An old name for the formula
|
|
|
|
def oldname
|
2015-12-06 22:16:08 +08:00
|
|
|
@oldname ||= if tap
|
|
|
|
formula_renames = tap.formula_renames
|
2016-09-23 11:01:40 +02:00
|
|
|
formula_renames.to_a.rassoc(name).first if formula_renames.value?(name)
|
2015-08-09 14:46:07 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-10-07 18:51:02 +08:00
|
|
|
# All of aliases for the formula
|
|
|
|
def aliases
|
2015-12-06 22:16:08 +08:00
|
|
|
@aliases ||= if tap
|
2017-07-21 17:20:12 +01:00
|
|
|
tap.alias_reverse_table[full_name].to_a.map do |a|
|
|
|
|
a.split("/")[-1]
|
|
|
|
end
|
2015-10-07 18:51:02 +08:00
|
|
|
else
|
|
|
|
[]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The {Resource}s for the currently active {SoftwareSpec}.
|
2017-06-26 07:30:28 +02:00
|
|
|
# @method resources
|
|
|
|
def_delegator :"active_spec.resources", :values, :resources
|
2013-08-06 19:52:58 -07:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The {Dependency}s for the currently active {SoftwareSpec}.
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate deps: :active_spec
|
2013-09-21 19:27:24 -05:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The {Requirement}s for the currently active {SoftwareSpec}.
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate requirements: :active_spec
|
2013-09-21 19:27:24 -05:00
|
|
|
|
2014-12-26 16:07:32 -05:00
|
|
|
# The cached download for the currently active {SoftwareSpec}.
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate cached_download: :active_spec
|
2014-02-21 00:41:07 -05:00
|
|
|
|
2014-12-26 16:07:32 -05:00
|
|
|
# Deletes the download for the currently active {SoftwareSpec}.
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate clear_cache: :active_spec
|
2014-02-21 00:41:07 -05:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The list of patches for the currently active {SoftwareSpec}.
|
2017-06-26 07:30:28 +02:00
|
|
|
def_delegator :active_spec, :patches, :patchlist
|
2014-03-13 19:51:23 -05:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The options for the currently active {SoftwareSpec}.
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate options: :active_spec
|
2014-08-10 21:45:24 -05:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The deprecated options for the currently active {SoftwareSpec}.
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate deprecated_options: :active_spec
|
2014-10-16 13:01:05 +01:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# The deprecated option flags for the currently active {SoftwareSpec}.
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate deprecated_flags: :active_spec
|
2014-12-27 14:26:56 -05:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# If a named option is defined for the currently active {SoftwareSpec}.
|
2017-06-26 07:30:28 +02:00
|
|
|
# @method option_defined?
|
|
|
|
delegate option_defined?: :active_spec
|
2014-07-31 19:37:39 -05:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# All the {.fails_with} for the currently active {SoftwareSpec}.
|
2017-06-26 07:30:28 +02:00
|
|
|
delegate compiler_failures: :active_spec
|
2014-08-19 17:14:02 -05:00
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# If this {Formula} is installed.
|
|
|
|
# This is actually just a check for if the {#installed_prefix} directory
|
|
|
|
# exists and is not empty.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2009-07-24 15:10:01 +01:00
|
|
|
def installed?
|
2016-09-17 15:17:27 +01:00
|
|
|
(dir = installed_prefix).directory? && !dir.children.empty?
|
2009-07-24 15:10:01 +01:00
|
|
|
end
|
|
|
|
|
2015-07-30 16:01:36 +08:00
|
|
|
# If at least one version of {Formula} is installed.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-07-30 16:01:36 +08:00
|
|
|
def any_version_installed?
|
2015-11-29 15:22:22 +08:00
|
|
|
installed_prefixes.any? { |keg| (keg/Tab::FILENAME).file? }
|
2015-07-30 16:01:36 +08:00
|
|
|
end
|
|
|
|
|
2015-07-21 21:57:14 +08:00
|
|
|
# @private
|
2016-09-15 18:28:42 +01:00
|
|
|
# The link status symlink directory for this {Formula}.
|
2015-01-04 14:25:59 -05:00
|
|
|
# You probably want {#opt_prefix} instead.
|
2012-01-14 20:03:30 -06:00
|
|
|
def linked_keg
|
2016-09-15 18:28:42 +01:00
|
|
|
HOMEBREW_LINKED_KEGS/name
|
2012-01-14 20:03:30 -06:00
|
|
|
end
|
|
|
|
|
2016-07-22 12:58:24 +03:00
|
|
|
def latest_head_version
|
2016-07-13 10:11:59 +03:00
|
|
|
head_versions = installed_prefixes.map do |pn|
|
|
|
|
pn_pkgversion = PkgVersion.parse(pn.basename.to_s)
|
|
|
|
pn_pkgversion if pn_pkgversion.head?
|
|
|
|
end.compact
|
|
|
|
|
2016-07-22 12:58:24 +03:00
|
|
|
head_versions.max_by do |pn_pkgversion|
|
2016-07-13 10:11:59 +03:00
|
|
|
[Tab.for_keg(prefix(pn_pkgversion)).source_modified_time, pn_pkgversion.revision]
|
|
|
|
end
|
2016-07-22 12:58:24 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
def latest_head_prefix
|
|
|
|
head_version = latest_head_version
|
|
|
|
prefix(head_version) if head_version
|
|
|
|
end
|
|
|
|
|
2016-09-17 15:17:27 +01:00
|
|
|
def head_version_outdated?(version, options = {})
|
2016-07-22 12:58:24 +03:00
|
|
|
tab = Tab.for_keg(prefix(version))
|
|
|
|
|
2016-08-11 10:00:39 +02:00
|
|
|
return true if tab.version_scheme < version_scheme
|
2016-07-22 12:58:24 +03:00
|
|
|
return true if stable && tab.stable_version && tab.stable_version < stable.version
|
|
|
|
return true if devel && tab.devel_version && tab.devel_version < devel.version
|
|
|
|
|
|
|
|
if options[:fetch_head]
|
2017-09-24 19:24:46 +01:00
|
|
|
return false unless head&.downloader.is_a?(VCSDownloadStrategy)
|
2016-07-22 12:58:24 +03:00
|
|
|
downloader = head.downloader
|
|
|
|
downloader.shutup! unless ARGV.verbose?
|
|
|
|
downloader.commit_outdated?(version.version.commit)
|
|
|
|
else
|
|
|
|
false
|
|
|
|
end
|
2016-07-13 10:11:59 +03:00
|
|
|
end
|
|
|
|
|
2015-01-04 14:25:59 -05:00
|
|
|
# The latest prefix for this formula. Checks for {#head}, then {#devel}
|
|
|
|
# and then {#stable}'s {#prefix}
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2010-09-24 11:55:21 -05:00
|
|
|
def installed_prefix
|
2016-07-22 12:40:16 +03:00
|
|
|
if head && (head_version = latest_head_version) && !head_version_outdated?(head_version)
|
|
|
|
latest_head_prefix
|
2015-07-30 15:58:20 +08:00
|
|
|
elsif devel && (devel_prefix = prefix(PkgVersion.new(devel.version, revision))).directory?
|
2012-04-05 21:09:24 -05:00
|
|
|
devel_prefix
|
2015-07-30 15:58:20 +08:00
|
|
|
elsif stable && (stable_prefix = prefix(PkgVersion.new(stable.version, revision))).directory?
|
|
|
|
stable_prefix
|
2010-09-24 11:55:21 -05:00
|
|
|
else
|
|
|
|
prefix
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-04-12 21:49:01 -07:00
|
|
|
# The currently installed version for this formula. Will raise an exception
|
|
|
|
# if the formula is not installed.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2012-08-18 18:37:32 -05:00
|
|
|
def installed_version
|
|
|
|
Keg.new(installed_prefix).version
|
|
|
|
end
|
|
|
|
|
2014-03-05 20:51:37 -08:00
|
|
|
# The directory in the cellar that the formula is installed to.
|
2016-12-31 16:38:05 +00:00
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def prefix(v = pkg_version)
|
2017-01-06 08:50:35 +00:00
|
|
|
versioned_prefix = versioned_prefix(v)
|
|
|
|
if !@prefix_returns_versioned_prefix && v == pkg_version &&
|
|
|
|
versioned_prefix.directory? && Keg.new(versioned_prefix).optlinked?
|
2016-12-31 16:38:05 +00:00
|
|
|
opt_prefix
|
|
|
|
else
|
2017-01-06 08:50:35 +00:00
|
|
|
versioned_prefix
|
2016-12-31 16:38:05 +00:00
|
|
|
end
|
2010-02-19 21:55:17 -08:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
2016-11-01 03:53:20 +03:00
|
|
|
# Is the formula linked?
|
|
|
|
def linked?
|
|
|
|
linked_keg.symlink?
|
|
|
|
end
|
|
|
|
|
|
|
|
# Is the formula linked to opt?
|
|
|
|
def optlinked?
|
|
|
|
opt_prefix.symlink?
|
|
|
|
end
|
|
|
|
|
|
|
|
# Is formula's linked keg points to the prefix.
|
|
|
|
def prefix_linked?(v = pkg_version)
|
|
|
|
return false unless linked?
|
2017-01-06 08:50:35 +00:00
|
|
|
linked_keg.resolved_path == versioned_prefix(v)
|
2016-11-01 03:53:20 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
# {PkgVersion} of the linked keg for the formula.
|
|
|
|
def linked_version
|
|
|
|
return unless linked?
|
|
|
|
Keg.for(linked_keg).version
|
|
|
|
end
|
|
|
|
|
2014-03-05 20:51:37 -08:00
|
|
|
# The parent of the prefix; the named directory in the cellar containing all
|
|
|
|
# installed versions of this software
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-03 13:09:07 +01:00
|
|
|
def rack
|
2016-12-31 16:38:05 +00:00
|
|
|
Pathname.new("#{HOMEBREW_CELLAR}/#{name}")
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2010-02-19 21:55:17 -08:00
|
|
|
|
2016-09-14 23:18:55 +01:00
|
|
|
# All currently installed prefix directories.
|
2015-11-29 15:13:56 +08:00
|
|
|
# @private
|
|
|
|
def installed_prefixes
|
2017-06-20 15:27:16 +02:00
|
|
|
rack.directory? ? rack.subdirs.sort : []
|
2015-11-29 15:13:56 +08:00
|
|
|
end
|
|
|
|
|
2016-09-14 23:18:55 +01:00
|
|
|
# All currently installed kegs.
|
2015-11-29 15:13:56 +08:00
|
|
|
# @private
|
|
|
|
def installed_kegs
|
|
|
|
installed_prefixes.map { |dir| Keg.new(dir) }
|
|
|
|
end
|
|
|
|
|
2015-04-12 21:49:01 -07:00
|
|
|
# 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.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# Need to install into the {.bin} but the makefile doesn't mkdir -p prefix/bin?
|
|
|
|
# <pre>bin.mkpath</pre>
|
|
|
|
#
|
|
|
|
# No `make install` available?
|
|
|
|
# <pre>bin.install "binary1"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def bin
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/"bin"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def doc
|
2017-06-01 16:06:51 +02:00
|
|
|
share/"doc"/name
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# No `make install` available?
|
|
|
|
# <pre>include.install "example.h"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def include
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/"include"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def info
|
2017-06-01 16:06:51 +02:00
|
|
|
share/"info"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# No `make install` available?
|
|
|
|
# <pre>lib.install "example.dylib"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def lib
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/"lib"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# The directory where the formula's binaries should be installed.
|
|
|
|
# This is not symlinked into `HOMEBREW_PREFIX`.
|
|
|
|
# It is also commonly used to install files that we do not wish to be
|
|
|
|
# symlinked into HOMEBREW_PREFIX from one of the other directories and
|
|
|
|
# instead manually create symlinks or wrapper scripts into e.g. {#bin}.
|
2015-08-03 13:09:07 +01:00
|
|
|
def libexec
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/"libexec"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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}
|
2015-08-03 13:09:07 +01:00
|
|
|
def man
|
2017-06-01 16:06:51 +02:00
|
|
|
share/"man"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# No `make install` available?
|
|
|
|
# <pre>man1.install "example.1"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def man1
|
2017-06-01 16:06:51 +02:00
|
|
|
man/"man1"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def man2
|
2017-06-01 16:06:51 +02:00
|
|
|
man/"man2"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# No `make install` available?
|
|
|
|
# <pre>man3.install "man.3"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def man3
|
2017-06-01 16:06:51 +02:00
|
|
|
man/"man3"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def man4
|
2017-06-01 16:06:51 +02:00
|
|
|
man/"man4"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def man5
|
2017-06-01 16:06:51 +02:00
|
|
|
man/"man5"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def man6
|
2017-06-01 16:06:51 +02:00
|
|
|
man/"man6"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def man7
|
2017-06-01 16:06:51 +02:00
|
|
|
man/"man7"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def man8
|
2017-06-01 16:06:51 +02:00
|
|
|
man/"man8"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def sbin
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/"sbin"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# Need a custom directory?
|
|
|
|
# <pre>(share/"concept").mkpath</pre>
|
|
|
|
#
|
|
|
|
# Installing something into another custom directory?
|
|
|
|
# <pre>(share/"concept2").install "ducks.txt"</pre>
|
|
|
|
#
|
|
|
|
# Install `./example_code/simple/ones` to share/demos
|
|
|
|
# <pre>(share/"demos").install "example_code/simple/ones"</pre>
|
|
|
|
#
|
|
|
|
# Install `./example_code/simple/ones` to share/demos/examples
|
|
|
|
# <pre>(share/"demos").install "example_code/simple/ones" => "examples"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def share
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/"share"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2009-10-02 15:55:34 +01:00
|
|
|
|
2015-07-03 10:03:00 -07:00
|
|
|
# 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.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# No `make install` available?
|
|
|
|
# <pre>pkgshare.install "examples"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def pkgshare
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/"share"/name
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-07-03 10:03:00 -07:00
|
|
|
|
2015-10-31 21:45:40 -07:00
|
|
|
# The directory where Emacs Lisp files should be installed, with the
|
|
|
|
# formula name appended to avoid linking conflicts.
|
|
|
|
#
|
|
|
|
# Install an Emacs mode included with a software package:
|
|
|
|
# <pre>elisp.install "contrib/emacs/example-mode.el"</pre>
|
|
|
|
def elisp
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/"share/emacs/site-lisp"/name
|
2015-10-31 21:45:40 -07:00
|
|
|
end
|
|
|
|
|
2015-04-12 21:49:01 -07:00
|
|
|
# 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`.
|
2015-08-03 13:09:07 +01:00
|
|
|
def frameworks
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/"Frameworks"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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`.
|
2015-08-03 13:09:07 +01:00
|
|
|
def kext_prefix
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/"Library/Extensions"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2013-04-21 10:44:24 +02:00
|
|
|
|
2015-04-12 21:49:01 -07:00
|
|
|
# The directory where the formula's configuration files should be installed.
|
|
|
|
# Anything using `etc.install` will not overwrite other files on e.g. upgrades
|
|
|
|
# but will write a new file named `*.default`.
|
|
|
|
# This directory is not inside the `HOMEBREW_CELLAR` so it is persisted
|
|
|
|
# across upgrades.
|
2015-08-03 13:09:07 +01:00
|
|
|
def etc
|
2017-06-01 16:06:51 +02:00
|
|
|
(HOMEBREW_PREFIX/"etc").extend(InstallRenamed)
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2013-10-06 22:04:46 +01:00
|
|
|
|
2015-04-12 21:49:01 -07:00
|
|
|
# The directory where the formula's variable files should be installed.
|
|
|
|
# This directory is not inside the `HOMEBREW_CELLAR` so it is persisted
|
|
|
|
# across upgrades.
|
2015-08-03 13:09:07 +01:00
|
|
|
def var
|
2017-06-01 16:06:51 +02:00
|
|
|
HOMEBREW_PREFIX/"var"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2010-04-06 13:13:50 -07:00
|
|
|
|
2016-12-08 07:20:40 -06:00
|
|
|
# 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.
|
|
|
|
def zsh_function
|
2017-06-01 16:06:51 +02:00
|
|
|
share/"zsh/site-functions"
|
2016-12-08 07:20:40 -06:00
|
|
|
end
|
|
|
|
|
2016-12-03 11:36:49 -06:00
|
|
|
# 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.
|
|
|
|
def fish_function
|
2017-06-01 16:06:51 +02:00
|
|
|
share/"fish/vendor_functions.d"
|
2016-12-03 11:36:49 -06:00
|
|
|
end
|
|
|
|
|
2015-04-12 21:49:01 -07:00
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def bash_completion
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/"etc/bash_completion.d"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def zsh_completion
|
2017-06-01 16:06:51 +02:00
|
|
|
share/"zsh/site-functions"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2015-05-17 01:12:12 +02:00
|
|
|
|
|
|
|
# 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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def fish_completion
|
2017-06-01 16:06:51 +02:00
|
|
|
share/"fish/vendor_completions.d"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2013-01-27 22:34:26 +00:00
|
|
|
|
2015-04-12 21:49:01 -07:00
|
|
|
# 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.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-03 13:09:07 +01:00
|
|
|
def bottle_prefix
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix/".bottle"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2013-10-05 20:29:19 +01:00
|
|
|
|
2016-05-27 01:53:08 -04:00
|
|
|
# The directory where the formula's installation or test logs will be written.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-04-25 22:07:06 -04:00
|
|
|
def logs
|
2017-06-01 16:06:51 +02:00
|
|
|
HOMEBREW_LOGS + name
|
2015-04-25 22:07:06 -04:00
|
|
|
end
|
|
|
|
|
2016-05-27 01:53:08 -04:00
|
|
|
# The prefix, if any, to use in filenames for logging current activity
|
|
|
|
def active_log_prefix
|
|
|
|
if active_log_type
|
|
|
|
"#{active_log_type}."
|
|
|
|
else
|
|
|
|
""
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Runs a block with the given log type in effect for its duration
|
|
|
|
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
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# This method can be overridden to provide a plist.
|
|
|
|
# For more examples read Apple's handy manpage:
|
|
|
|
# https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/plist.5.html
|
2017-10-15 02:28:32 +02:00
|
|
|
# <pre>def plist; <<~EOS
|
2015-08-29 10:56:24 +01:00
|
|
|
# <?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
# <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
|
|
# <plist version="1.0">
|
|
|
|
# <dict>
|
|
|
|
# <key>Label</key>
|
|
|
|
# <string>#{plist_name}</string>
|
|
|
|
# <key>ProgramArguments</key>
|
|
|
|
# <array>
|
|
|
|
# <string>#{opt_bin}/example</string>
|
|
|
|
# <string>--do-this</string>
|
|
|
|
# </array>
|
|
|
|
# <key>RunAtLoad</key>
|
|
|
|
# <true/>
|
|
|
|
# <key>KeepAlive</key>
|
|
|
|
# <true/>
|
|
|
|
# <key>StandardErrorPath</key>
|
|
|
|
# <string>/dev/null</string>
|
|
|
|
# <key>StandardOutPath</key>
|
|
|
|
# <string>/dev/null</string>
|
|
|
|
# </plist>
|
|
|
|
# EOS
|
2016-09-17 15:17:27 +01:00
|
|
|
# end</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def plist
|
|
|
|
nil
|
|
|
|
end
|
2015-08-29 10:56:24 +01:00
|
|
|
|
2015-12-06 22:18:16 +00:00
|
|
|
# The generated launchd {.plist} service name.
|
2015-08-03 13:09:07 +01:00
|
|
|
def plist_name
|
2017-06-01 16:06:51 +02:00
|
|
|
"homebrew.mxcl." + name
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
|
|
|
|
2015-12-06 22:18:16 +00:00
|
|
|
# The generated launchd {.plist} file path.
|
2015-08-03 13:09:07 +01:00
|
|
|
def plist_path
|
2017-06-01 16:06:51 +02:00
|
|
|
prefix + (plist_name + ".plist")
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-03 13:09:07 +01:00
|
|
|
def plist_manual
|
|
|
|
self.class.plist_manual
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-03 13:09:07 +01:00
|
|
|
def plist_startup
|
|
|
|
self.class.plist_startup
|
|
|
|
end
|
2011-12-30 23:56:52 -06:00
|
|
|
|
2014-03-05 20:51:37 -08:00
|
|
|
# A stable path for this formula, when installed. Contains the formula name
|
|
|
|
# but no version number. Only the active version will be linked here if
|
|
|
|
# multiple versions are installed.
|
|
|
|
#
|
|
|
|
# This is the prefered way to refer a formula in plists or from another
|
|
|
|
# formula, as the path is stable even when the software is updated.
|
2015-08-29 10:56:24 +01:00
|
|
|
# <pre>args << "--with-readline=#{Formula["readline"].opt_prefix}" if build.with? "readline"</pre>
|
2013-04-15 15:00:57 -05:00
|
|
|
def opt_prefix
|
|
|
|
Pathname.new("#{HOMEBREW_PREFIX}/opt/#{name}")
|
|
|
|
end
|
2012-08-10 16:33:22 -04:00
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
def opt_bin
|
2017-06-01 16:06:51 +02:00
|
|
|
opt_prefix/"bin"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def opt_include
|
2017-06-01 16:06:51 +02:00
|
|
|
opt_prefix/"include"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def opt_lib
|
2017-06-01 16:06:51 +02:00
|
|
|
opt_prefix/"lib"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def opt_libexec
|
2017-06-01 16:06:51 +02:00
|
|
|
opt_prefix/"libexec"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def opt_sbin
|
2017-06-01 16:06:51 +02:00
|
|
|
opt_prefix/"sbin"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def opt_share
|
2017-06-01 16:06:51 +02:00
|
|
|
opt_prefix/"share"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def opt_pkgshare
|
2017-06-01 16:06:51 +02:00
|
|
|
opt_prefix/"share"/name
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
|
|
|
|
2015-10-31 21:45:40 -07:00
|
|
|
def opt_elisp
|
2017-06-01 16:06:51 +02:00
|
|
|
opt_prefix/"share/emacs/site-lisp"/name
|
2015-10-31 21:45:40 -07:00
|
|
|
end
|
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
def opt_frameworks
|
2017-06-01 16:06:51 +02:00
|
|
|
opt_prefix/"Frameworks"
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2014-03-05 21:01:24 -08:00
|
|
|
|
2016-05-06 12:02:13 -07:00
|
|
|
# Indicates that this formula supports bottles. (Not necessarily that one
|
|
|
|
# should be used in the current installation run.)
|
2013-01-27 19:22:56 +00:00
|
|
|
# Can be overridden to selectively disable bottles from formulae.
|
|
|
|
# Defaults to true so overridden version does not have to check if bottles
|
|
|
|
# are supported.
|
2016-01-09 11:06:17 +00:00
|
|
|
# Replaced by {.pour_bottle}'s `satisfy` method if it is specified.
|
2015-08-03 13:09:07 +01:00
|
|
|
def pour_bottle?
|
|
|
|
true
|
|
|
|
end
|
2013-01-27 19:22:56 +00:00
|
|
|
|
2016-01-09 11:06:17 +00:00
|
|
|
# @private
|
|
|
|
def pour_bottle_check_unsatisfied_reason
|
|
|
|
self.class.pour_bottle_check_unsatisfied_reason
|
|
|
|
end
|
|
|
|
|
2013-04-01 20:33:12 +01:00
|
|
|
# Can be overridden to run commands on both source and bottle installation.
|
|
|
|
def post_install; end
|
|
|
|
|
2016-05-27 01:53:08 -04:00
|
|
|
# @private
|
|
|
|
def run_post_install
|
2017-01-06 08:50:35 +00:00
|
|
|
@prefix_returns_versioned_prefix = true
|
2016-05-27 01:53:08 -04:00
|
|
|
build = self.build
|
|
|
|
self.build = Tab.for_formula(self)
|
2017-04-22 16:31:19 +01:00
|
|
|
|
2017-07-15 17:26:51 -07:00
|
|
|
new_env = {
|
|
|
|
"TMPDIR" => HOMEBREW_TEMP,
|
|
|
|
"TEMP" => HOMEBREW_TEMP,
|
|
|
|
"TMP" => HOMEBREW_TEMP,
|
|
|
|
"HOMEBREW_PATH" => nil,
|
2017-12-15 10:05:43 +00:00
|
|
|
"PATH" => ENV["HOMEBREW_PATH"],
|
2017-07-15 17:26:51 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
with_env(new_env) do
|
|
|
|
ENV.clear_sensitive_environment!
|
|
|
|
|
|
|
|
Pathname.glob("#{bottle_prefix}/{etc,var}/**/*") do |path|
|
|
|
|
path.extend(InstallRenamed)
|
|
|
|
path.cp_path_sub(bottle_prefix, HOMEBREW_PREFIX)
|
|
|
|
end
|
|
|
|
|
|
|
|
with_logging("post_install") do
|
|
|
|
post_install
|
|
|
|
end
|
2016-05-27 01:53:08 -04:00
|
|
|
end
|
|
|
|
ensure
|
|
|
|
self.build = build
|
2017-01-06 08:50:35 +00:00
|
|
|
@prefix_returns_versioned_prefix = false
|
2016-05-27 01:53:08 -04:00
|
|
|
end
|
|
|
|
|
2017-02-20 11:18:44 +00:00
|
|
|
# Tell the user about any Homebrew-specific caveats or locations regarding
|
|
|
|
# this package. These should not contain setup instructions that would apply
|
|
|
|
# to installation through a different package manager on a different OS.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @return [String]
|
|
|
|
# <pre>def caveats
|
2017-10-15 02:28:32 +02:00
|
|
|
# <<~EOS
|
2015-08-29 10:56:24 +01:00
|
|
|
# Are optional. Something the user should know?
|
|
|
|
# EOS
|
|
|
|
# end</pre>
|
|
|
|
#
|
|
|
|
# <pre>def caveats
|
2017-10-15 02:28:32 +02:00
|
|
|
# s = <<~EOS
|
2015-08-29 10:56:24 +01:00
|
|
|
# Print some important notice to the user when `brew info <formula>` is
|
|
|
|
# called or when brewing a formula.
|
|
|
|
# This is optional. You can use all the vars like #{version} here.
|
|
|
|
# EOS
|
|
|
|
# s += "Some issue only on older systems" if MacOS.version < :mountain_lion
|
|
|
|
# s
|
|
|
|
# end</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def caveats
|
|
|
|
nil
|
|
|
|
end
|
2009-09-28 14:06:53 -07:00
|
|
|
|
2009-09-17 21:10:39 +01:00
|
|
|
# rarely, you don't want your library symlinked into the main prefix
|
|
|
|
# see gettext.rb for an example
|
2010-07-18 10:38:45 -07:00
|
|
|
def keg_only?
|
2017-07-07 09:23:31 +01:00
|
|
|
return false unless keg_only_reason
|
|
|
|
keg_only_reason.valid?
|
2012-08-09 02:00:58 -05:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2012-08-09 02:00:58 -05:00
|
|
|
def keg_only_reason
|
|
|
|
self.class.keg_only_reason
|
2010-07-18 10:38:45 -07:00
|
|
|
end
|
2009-08-10 16:48:30 +01:00
|
|
|
|
2014-02-23 12:21:43 -08:00
|
|
|
# sometimes the formula cleaner breaks things
|
2009-09-28 14:06:53 -07:00
|
|
|
# skip cleaning paths in a formula with a class method like this:
|
2014-12-20 00:55:39 +01:00
|
|
|
# skip_clean "bin/foo", "lib/bar"
|
2014-02-23 12:21:43 -08:00
|
|
|
# keep .la files with:
|
2014-02-23 12:09:28 -08:00
|
|
|
# skip_clean :la
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-03 13:09:07 +01:00
|
|
|
def skip_clean?(path)
|
|
|
|
return true if path.extname == ".la" && self.class.skip_clean_paths.include?(:la)
|
2009-09-28 14:06:53 -07:00
|
|
|
to_check = path.relative_path_from(prefix).to_s
|
2009-11-23 10:07:23 -08:00
|
|
|
self.class.skip_clean_paths.include? to_check
|
2009-09-28 14:06:53 -07:00
|
|
|
end
|
|
|
|
|
2015-08-23 16:35:51 +08:00
|
|
|
# Sometimes we accidentally install files outside prefix. After we fix that,
|
|
|
|
# users will get nasty link conflict error. So we create a whitelist here to
|
|
|
|
# allow overwriting certain files. e.g.
|
|
|
|
# link_overwrite "bin/foo", "lib/bar"
|
|
|
|
# link_overwrite "share/man/man1/baz-*"
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-23 16:35:51 +08:00
|
|
|
def link_overwrite?(path)
|
|
|
|
# Don't overwrite files not created by Homebrew.
|
2016-02-05 22:11:04 +08:00
|
|
|
return false unless path.stat.uid == HOMEBREW_BREW_FILE.stat.uid
|
2015-09-28 22:47:53 +01:00
|
|
|
# Don't overwrite files belong to other keg except when that
|
|
|
|
# keg's formula is deleted.
|
2015-08-23 16:35:51 +08:00
|
|
|
begin
|
2015-09-28 22:47:53 +01:00
|
|
|
keg = Keg.for(path)
|
2017-10-07 00:31:28 +02:00
|
|
|
rescue NotAKegError, Errno::ENOENT # rubocop:disable Lint/HandleExceptions
|
2015-08-23 16:35:51 +08:00
|
|
|
# file doesn't belong to any keg.
|
|
|
|
else
|
2015-12-06 22:16:08 +08:00
|
|
|
tab_tap = Tab.for_keg(keg).tap
|
|
|
|
return false if tab_tap.nil? # this keg doesn't below to any core/tap formula, most likely coming from a DIY install.
|
2015-09-28 22:47:53 +01:00
|
|
|
begin
|
|
|
|
Formulary.factory(keg.name)
|
2017-10-07 00:31:28 +02:00
|
|
|
rescue FormulaUnavailableError # rubocop:disable Lint/HandleExceptions
|
2015-09-28 22:47:53 +01:00
|
|
|
# formula for this keg is deleted, so defer to whitelist
|
|
|
|
rescue TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError
|
|
|
|
return false # this keg belongs to another formula
|
|
|
|
else
|
|
|
|
return false # this keg belongs to another formula
|
|
|
|
end
|
2015-08-23 16:35:51 +08:00
|
|
|
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("/") + "/") ||
|
2016-09-20 22:03:08 +02:00
|
|
|
to_check =~ /^#{Regexp.escape(p).gsub('\*', ".*?")}$/
|
2015-08-23 16:35:51 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-07-06 15:51:43 -05:00
|
|
|
def skip_cxxstdlib_check?
|
2014-08-16 02:05:13 -05:00
|
|
|
false
|
2014-07-06 15:51:43 -05:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-08-16 01:33:41 -05:00
|
|
|
def require_universal_deps?
|
|
|
|
false
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-12-26 17:44:44 -05:00
|
|
|
def patch
|
2016-09-23 22:02:23 +02:00
|
|
|
return if patchlist.empty?
|
|
|
|
ohai "Patching"
|
|
|
|
patchlist.each(&:apply)
|
2014-12-26 17:44:44 -05:00
|
|
|
end
|
|
|
|
|
2016-04-10 22:53:56 -04:00
|
|
|
# yields |self,staging| with current working directory set to the uncompressed tarball
|
|
|
|
# where staging is a Mktemp staging context
|
2014-12-26 20:24:12 +00:00
|
|
|
# @private
|
2009-08-10 16:48:30 +01:00
|
|
|
def brew
|
2017-01-06 08:50:35 +00:00
|
|
|
@prefix_returns_versioned_prefix = true
|
2016-04-10 22:53:56 -04:00
|
|
|
stage do |staging|
|
|
|
|
staging.retain! if ARGV.keep_tmp?
|
2014-12-26 17:44:44 -05:00
|
|
|
prepare_patches
|
|
|
|
|
2009-08-10 16:48:30 +01:00
|
|
|
begin
|
2016-04-10 22:53:56 -04:00
|
|
|
yield self, staging
|
|
|
|
rescue StandardError
|
|
|
|
staging.retain! if ARGV.interactive? || ARGV.debug?
|
|
|
|
raise
|
2014-08-29 22:31:55 -05:00
|
|
|
ensure
|
2015-04-25 22:07:06 -04:00
|
|
|
cp Dir["config.log", "CMakeCache.txt"], logs
|
2009-08-10 16:48:30 +01:00
|
|
|
end
|
|
|
|
end
|
2016-12-31 16:38:05 +00:00
|
|
|
ensure
|
2017-01-06 08:50:35 +00:00
|
|
|
@prefix_returns_versioned_prefix = false
|
2009-07-24 15:10:01 +01:00
|
|
|
end
|
2009-08-10 16:48:30 +01:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-01-23 00:26:25 -06:00
|
|
|
def lock
|
2013-02-09 18:19:50 -06:00
|
|
|
@lock = FormulaLock.new(name)
|
|
|
|
@lock.lock
|
2016-09-23 22:02:23 +02:00
|
|
|
return unless oldname
|
|
|
|
return unless (oldname_rack = HOMEBREW_CELLAR/oldname).exist?
|
|
|
|
return unless oldname_rack.resolved_path == rack
|
|
|
|
@oldname_lock = FormulaLock.new(oldname)
|
|
|
|
@oldname_lock.lock
|
2013-01-23 00:26:25 -06:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-01-23 00:26:25 -06:00
|
|
|
def unlock
|
2017-09-24 19:24:46 +01:00
|
|
|
@lock&.unlock
|
|
|
|
@oldname_lock&.unlock
|
2013-01-23 00:26:25 -06:00
|
|
|
end
|
|
|
|
|
2016-06-27 13:08:19 +03:00
|
|
|
def migration_needed?
|
2016-07-01 18:02:31 +03:00
|
|
|
return false unless oldname
|
|
|
|
return false if rack.exist?
|
|
|
|
|
|
|
|
old_rack = HOMEBREW_CELLAR/oldname
|
|
|
|
return false unless old_rack.directory?
|
|
|
|
return false if old_rack.subdirs.empty?
|
|
|
|
|
2018-04-17 10:42:41 +01:00
|
|
|
tap == Tab.for_keg(old_rack.subdirs.min).tap
|
2016-06-27 13:08:19 +03:00
|
|
|
end
|
|
|
|
|
2015-11-27 15:11:00 +00:00
|
|
|
# @private
|
2016-09-15 16:01:18 +01:00
|
|
|
def outdated_kegs(options = {})
|
|
|
|
@outdated_kegs ||= Hash.new do |cache, key|
|
2016-09-17 15:17:27 +01:00
|
|
|
raise Migrator::MigrationNeededError, self if migration_needed?
|
2016-09-15 16:01:18 +01:00
|
|
|
cache[key] = _outdated_kegs(key)
|
2016-08-01 16:31:36 +03:00
|
|
|
end
|
2016-09-15 16:01:18 +01:00
|
|
|
@outdated_kegs[options]
|
2016-08-01 16:31:36 +03:00
|
|
|
end
|
2015-11-27 15:11:00 +00:00
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
def _outdated_kegs(options = {})
|
|
|
|
all_kegs = []
|
2016-08-06 16:21:25 +03:00
|
|
|
|
2016-08-01 16:31:36 +03:00
|
|
|
installed_kegs.each do |keg|
|
2016-09-15 16:01:18 +01:00
|
|
|
all_kegs << keg
|
2016-08-01 16:31:36 +03:00
|
|
|
version = keg.version
|
2016-08-11 09:54:47 +02:00
|
|
|
next if version.head?
|
2015-11-27 15:11:00 +00:00
|
|
|
|
2016-08-11 09:54:47 +02:00
|
|
|
tab = Tab.for_keg(keg)
|
|
|
|
next if version_scheme > tab.version_scheme
|
|
|
|
next if version_scheme == tab.version_scheme && pkg_version > version
|
2016-09-19 01:53:48 +01:00
|
|
|
|
|
|
|
# don't consider this keg current if there's a newer formula available
|
|
|
|
next if follow_installed_alias? && new_formula_available?
|
2016-09-15 16:01:18 +01:00
|
|
|
|
|
|
|
return [] # this keg is the current version of the formula, so it's not outdated
|
2016-08-01 16:31:36 +03:00
|
|
|
end
|
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
# Even if this formula hasn't been installed, there may be installations
|
|
|
|
# of other formulae which used to be targets of the alias currently
|
|
|
|
# targetting this formula. These should be counted as outdated versions.
|
|
|
|
all_kegs.concat old_installed_formulae.flat_map(&:installed_kegs)
|
|
|
|
|
2016-08-01 16:31:36 +03:00
|
|
|
head_version = latest_head_version
|
|
|
|
if head_version && !head_version_outdated?(head_version, options)
|
|
|
|
[]
|
|
|
|
else
|
2016-09-15 16:01:18 +01:00
|
|
|
all_kegs.sort_by(&:version)
|
2015-11-27 15:11:00 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-19 01:53:48 +01:00
|
|
|
def new_formula_available?
|
|
|
|
installed_alias_target_changed? && !latest_formula.installed?
|
|
|
|
end
|
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
def current_installed_alias_target
|
|
|
|
Formulary.factory(installed_alias_path) if installed_alias_path
|
|
|
|
end
|
|
|
|
|
|
|
|
# Has the target of the alias used to install this formula changed?
|
|
|
|
# Returns false if the formula wasn't installed with an alias.
|
|
|
|
def installed_alias_target_changed?
|
2016-09-18 19:43:54 +01:00
|
|
|
target = current_installed_alias_target
|
2017-09-24 20:12:58 +01:00
|
|
|
return false unless target
|
|
|
|
target.name != name
|
2016-09-15 16:01:18 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
# Is this formula the target of an alias used to install an old formula?
|
|
|
|
def supersedes_an_installed_formula?
|
|
|
|
old_installed_formulae.any?
|
|
|
|
end
|
|
|
|
|
|
|
|
# Has the alias used to install the formula changed, or are different
|
|
|
|
# formulae already installed with this alias?
|
|
|
|
def alias_changed?
|
|
|
|
installed_alias_target_changed? || supersedes_an_installed_formula?
|
|
|
|
end
|
|
|
|
|
|
|
|
# If the alias has changed value, return the new formula.
|
|
|
|
# Otherwise, return self.
|
|
|
|
def latest_formula
|
|
|
|
installed_alias_target_changed? ? current_installed_alias_target : self
|
|
|
|
end
|
|
|
|
|
|
|
|
def old_installed_formulae
|
2016-09-18 23:59:55 +01:00
|
|
|
# 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?
|
2016-10-20 01:50:59 +03:00
|
|
|
self.class.installed_with_alias_path(alias_path).reject { |f| f.name == name }
|
2016-09-15 16:01:18 +01:00
|
|
|
end
|
|
|
|
|
2015-11-27 15:11:00 +00:00
|
|
|
# @private
|
2016-08-06 16:21:25 +03:00
|
|
|
def outdated?(options = {})
|
2016-09-15 16:01:18 +01:00
|
|
|
!outdated_kegs(options).empty?
|
2015-11-27 15:11:00 +00:00
|
|
|
rescue Migrator::MigrationNeededError
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-05-21 22:41:21 -05:00
|
|
|
def pinnable?
|
|
|
|
@pin.pinnable?
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-05-21 22:41:21 -05:00
|
|
|
def pinned?
|
|
|
|
@pin.pinned?
|
|
|
|
end
|
|
|
|
|
2015-11-16 19:23:48 +08:00
|
|
|
# @private
|
|
|
|
def pinned_version
|
|
|
|
@pin.pinned_version
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-05-21 22:41:21 -05:00
|
|
|
def pin
|
|
|
|
@pin.pin
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-05-21 22:41:21 -05:00
|
|
|
def unpin
|
|
|
|
@pin.unpin
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-03 13:09:07 +01:00
|
|
|
def ==(other)
|
2014-06-19 21:35:46 -05:00
|
|
|
instance_of?(other.class) &&
|
|
|
|
name == other.name &&
|
|
|
|
active_spec == other.active_spec
|
2010-09-11 20:22:54 +01:00
|
|
|
end
|
2016-09-23 18:13:48 +02:00
|
|
|
alias eql? ==
|
2013-10-04 21:19:15 -05:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2010-09-11 20:22:54 +01:00
|
|
|
def hash
|
|
|
|
name.hash
|
|
|
|
end
|
2014-07-03 14:54:14 -05:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-07-03 14:54:14 -05:00
|
|
|
def <=>(other)
|
2016-09-20 22:03:08 +02:00
|
|
|
return unless other.is_a?(Formula)
|
2014-07-03 14:54:14 -05:00
|
|
|
name <=> other.name
|
2010-09-11 20:22:54 +01:00
|
|
|
end
|
2014-07-03 14:54:14 -05:00
|
|
|
|
2010-09-11 20:22:54 +01:00
|
|
|
def to_s
|
|
|
|
name
|
|
|
|
end
|
2014-07-01 15:13:29 -05:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-03-20 22:23:36 -05:00
|
|
|
def inspect
|
2015-07-28 15:10:40 +08:00
|
|
|
"#<Formula #{name} (#{active_spec_sym}) #{path}>"
|
2013-03-20 22:23:36 -05:00
|
|
|
end
|
2010-09-11 20:22:54 +01:00
|
|
|
|
2010-09-22 08:05:58 -07:00
|
|
|
# Standard parameters for CMake builds.
|
2012-05-29 16:58:32 -07:00
|
|
|
# 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.
|
2010-09-22 08:05:58 -07:00
|
|
|
# Note: there isn't a std_autotools variant because autotools is a lot
|
|
|
|
# less consistent and the standard parameters are more memorable.
|
2012-05-22 16:32:12 -05:00
|
|
|
def std_cmake_args
|
2016-09-22 01:37:28 -07:00
|
|
|
args = %W[
|
2015-12-25 17:36:08 -05:00
|
|
|
-DCMAKE_C_FLAGS_RELEASE=-DNDEBUG
|
|
|
|
-DCMAKE_CXX_FLAGS_RELEASE=-DNDEBUG
|
2012-05-29 16:58:32 -07:00
|
|
|
-DCMAKE_INSTALL_PREFIX=#{prefix}
|
2015-03-03 15:24:51 +00:00
|
|
|
-DCMAKE_BUILD_TYPE=Release
|
2012-05-29 16:58:32 -07:00
|
|
|
-DCMAKE_FIND_FRAMEWORK=LAST
|
2013-09-05 22:54:32 -07:00
|
|
|
-DCMAKE_VERBOSE_MAKEFILE=ON
|
2012-05-29 16:58:32 -07:00
|
|
|
-Wno-dev
|
|
|
|
]
|
2016-09-22 01:37:28 -07:00
|
|
|
|
|
|
|
# Avoid false positives for clock_gettime support on 10.11.
|
|
|
|
# CMake cache entries for other weak symbols may be added here as needed.
|
2018-04-17 10:58:51 +01:00
|
|
|
if MacOS.version == "10.11" && MacOS::Xcode.version >= "8.0"
|
2016-09-22 01:37:28 -07:00
|
|
|
args << "-DHAVE_CLOCK_GETTIME:INTERNAL=0"
|
|
|
|
end
|
|
|
|
|
|
|
|
args
|
2009-08-21 20:20:44 +01:00
|
|
|
end
|
|
|
|
|
2015-05-08 19:54:29 +08:00
|
|
|
# an array of all core {Formula} names
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-05-08 19:54:29 +08:00
|
|
|
def self.core_names
|
2016-03-07 18:04:25 +08:00
|
|
|
CoreTap.instance.formula_names
|
2015-05-08 19:54:29 +08:00
|
|
|
end
|
|
|
|
|
2015-08-01 00:02:19 +08:00
|
|
|
# an array of all core {Formula} files
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-01 00:02:19 +08:00
|
|
|
def self.core_files
|
2016-03-07 18:04:25 +08:00
|
|
|
CoreTap.instance.formula_files
|
2015-08-01 00:02:19 +08:00
|
|
|
end
|
|
|
|
|
2015-05-08 19:54:29 +08:00
|
|
|
# an array of all tap {Formula} names
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-05-08 19:54:29 +08:00
|
|
|
def self.tap_names
|
2016-03-06 14:50:33 +08:00
|
|
|
@tap_names ||= Tap.reject(&:core_tap?).flat_map(&:formula_names).sort
|
2015-05-08 19:54:29 +08:00
|
|
|
end
|
|
|
|
|
2015-08-01 00:02:19 +08:00
|
|
|
# an array of all tap {Formula} files
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-01 00:02:19 +08:00
|
|
|
def self.tap_files
|
2016-03-06 14:50:33 +08:00
|
|
|
@tap_files ||= Tap.reject(&:core_tap?).flat_map(&:formula_files)
|
2015-08-01 00:02:19 +08:00
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# an array of all {Formula} names
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2010-03-09 02:18:08 +00:00
|
|
|
def self.names
|
2015-09-13 16:58:03 +08:00
|
|
|
@names ||= (core_names + tap_names.map { |name| name.split("/")[-1] }).uniq.sort
|
2015-05-08 19:54:29 +08:00
|
|
|
end
|
|
|
|
|
2015-08-01 00:02:19 +08:00
|
|
|
# an array of all {Formula} files
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-01 00:02:19 +08:00
|
|
|
def self.files
|
|
|
|
@files ||= core_files + tap_files
|
|
|
|
end
|
|
|
|
|
2015-05-08 19:54:29 +08:00
|
|
|
# an array of all {Formula} names, which the tap formulae have the fully-qualified name
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-05-08 19:54:29 +08:00
|
|
|
def self.full_names
|
2015-06-20 14:46:24 +08:00
|
|
|
@full_names ||= core_names + tap_names
|
2010-03-09 02:18:08 +00:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2010-09-11 20:22:54 +01:00
|
|
|
def self.each
|
2015-08-01 00:02:19 +08:00
|
|
|
files.each do |file|
|
2013-04-14 23:29:15 -05:00
|
|
|
begin
|
2015-08-01 00:02:19 +08:00
|
|
|
yield Formulary.factory(file)
|
2013-06-26 13:02:44 -05:00
|
|
|
rescue StandardError => e
|
2011-03-11 14:54:26 -08:00
|
|
|
# Don't let one broken formula break commands. But do complain.
|
2015-08-01 00:02:19 +08:00
|
|
|
onoe "Failed to import: #{file}"
|
2013-06-26 13:02:44 -05:00
|
|
|
puts e
|
2012-08-21 11:39:45 -04:00
|
|
|
next
|
2010-07-18 14:07:40 -07:00
|
|
|
end
|
|
|
|
end
|
2010-09-11 20:22:54 +01:00
|
|
|
end
|
2012-08-10 16:05:30 -04:00
|
|
|
|
2016-11-17 14:34:04 +00:00
|
|
|
# Clear cache of .racks
|
|
|
|
def self.clear_racks_cache
|
2016-09-22 13:27:33 +01:00
|
|
|
@racks = nil
|
2016-11-17 14:34:04 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
# Clear caches of .racks and .installed.
|
|
|
|
def self.clear_installed_formulae_cache
|
|
|
|
clear_racks_cache
|
2016-09-22 13:27:33 +01:00
|
|
|
@installed = nil
|
|
|
|
end
|
|
|
|
|
2015-08-13 20:35:22 +08:00
|
|
|
# An array of all racks currently installed.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-13 20:35:22 +08:00
|
|
|
def self.racks
|
|
|
|
@racks ||= if HOMEBREW_CELLAR.directory?
|
2015-11-11 14:14:58 +08:00
|
|
|
HOMEBREW_CELLAR.subdirs.reject do |rack|
|
2018-01-19 15:07:04 -08:00
|
|
|
rack.symlink? || rack.basename.to_s.start_with?(".") || rack.subdirs.empty?
|
2015-11-11 14:14:58 +08:00
|
|
|
end
|
2015-06-20 14:46:24 +08:00
|
|
|
else
|
|
|
|
[]
|
|
|
|
end
|
2012-08-10 16:05:30 -04:00
|
|
|
end
|
|
|
|
|
2015-08-13 20:35:22 +08:00
|
|
|
# An array of all installed {Formula}
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-13 20:35:22 +08:00
|
|
|
def self.installed
|
2017-10-07 00:31:28 +02:00
|
|
|
@installed ||= racks.flat_map do |rack|
|
2015-08-13 20:35:22 +08:00
|
|
|
begin
|
|
|
|
Formulary.from_rack(rack)
|
2015-10-07 17:34:29 +08:00
|
|
|
rescue FormulaUnavailableError, TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError
|
2017-10-07 00:31:28 +02:00
|
|
|
[]
|
2015-08-13 20:35:22 +08:00
|
|
|
end
|
2017-10-07 00:31:28 +02:00
|
|
|
end.uniq(&:name)
|
2015-08-13 20:35:22 +08:00
|
|
|
end
|
|
|
|
|
2016-09-15 16:01:18 +01:00
|
|
|
def self.installed_with_alias_path(alias_path)
|
|
|
|
return [] if alias_path.nil?
|
|
|
|
installed.select { |f| f.installed_alias_path == alias_path }
|
|
|
|
end
|
|
|
|
|
2015-09-27 15:57:37 +08:00
|
|
|
# an array of all alias files of core {Formula}
|
|
|
|
# @private
|
|
|
|
def self.core_alias_files
|
2016-03-07 18:04:25 +08:00
|
|
|
CoreTap.instance.alias_files
|
2015-09-27 15:57:37 +08:00
|
|
|
end
|
|
|
|
|
2015-09-12 19:14:38 +08:00
|
|
|
# an array of all core aliases
|
|
|
|
# @private
|
|
|
|
def self.core_aliases
|
2016-03-07 18:04:25 +08:00
|
|
|
CoreTap.instance.aliases
|
2015-09-12 19:14:38 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
# an array of all tap aliases
|
|
|
|
# @private
|
|
|
|
def self.tap_aliases
|
2016-03-06 14:50:33 +08:00
|
|
|
@tap_aliases ||= Tap.reject(&:core_tap?).flat_map(&:aliases).sort
|
2015-09-12 19:14:38 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
# an array of all aliases
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2010-03-09 02:18:08 +00:00
|
|
|
def self.aliases
|
2015-09-13 17:23:17 +08:00
|
|
|
@aliases ||= (core_aliases + tap_aliases.map { |name| name.split("/")[-1] }).uniq.sort
|
|
|
|
end
|
|
|
|
|
|
|
|
# an array of all aliases, , which the tap formulae have the fully-qualified name
|
|
|
|
# @private
|
|
|
|
def self.alias_full_names
|
|
|
|
@alias_full_names ||= core_aliases + tap_aliases
|
2009-11-16 15:35:58 -08:00
|
|
|
end
|
2009-08-21 20:20:44 +01:00
|
|
|
|
2015-10-07 17:54:20 +08:00
|
|
|
# a table mapping core alias to formula name
|
|
|
|
# @private
|
|
|
|
def self.core_alias_table
|
2016-03-07 18:04:25 +08:00
|
|
|
CoreTap.instance.alias_table
|
2015-10-07 17:54:20 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
# a table mapping core formula name to aliases
|
|
|
|
# @private
|
|
|
|
def self.core_alias_reverse_table
|
2016-03-07 18:04:25 +08:00
|
|
|
CoreTap.instance.alias_reverse_table
|
2015-10-07 17:54:20 +08:00
|
|
|
end
|
|
|
|
|
2014-02-24 20:25:16 -08:00
|
|
|
def self.[](name)
|
|
|
|
Formulary.factory(name)
|
|
|
|
end
|
|
|
|
|
2015-12-06 22:16:08 +08:00
|
|
|
# True if this formula is provided by Homebrew itself
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-12-06 22:16:08 +08:00
|
|
|
def core_formula?
|
2017-09-24 19:24:46 +01:00
|
|
|
tap&.core_tap?
|
2013-10-29 15:46:10 -04:00
|
|
|
end
|
|
|
|
|
2015-12-06 22:16:08 +08:00
|
|
|
# True if this formula is provided by external Tap
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-12-06 22:16:08 +08:00
|
|
|
def tap?
|
2017-09-24 20:12:58 +01:00
|
|
|
return false unless tap
|
|
|
|
!tap.core_tap?
|
2012-03-16 12:29:47 +00:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-03 13:09:07 +01:00
|
|
|
def print_tap_action(options = {})
|
2016-09-23 22:02:23 +02:00
|
|
|
return unless tap?
|
|
|
|
verb = options[:verb] || "Installing"
|
|
|
|
ohai "#{verb} #{name} from #{tap}"
|
2014-10-19 13:54:00 +01:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2012-09-14 07:54:14 -07:00
|
|
|
def env
|
2014-07-07 21:32:35 -05:00
|
|
|
self.class.env
|
2012-09-14 07:54:14 -07:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2012-08-07 14:22:20 -05:00
|
|
|
def conflicts
|
2013-06-09 13:44:59 -05:00
|
|
|
self.class.conflicts
|
2012-08-07 14:22:20 -05:00
|
|
|
end
|
|
|
|
|
2013-01-23 00:26:26 -06:00
|
|
|
# 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
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-01-23 00:26:26 -06:00
|
|
|
def recursive_dependencies(&block)
|
|
|
|
Dependency.expand(self, &block)
|
2010-01-13 09:00:24 +00:00
|
|
|
end
|
|
|
|
|
2013-01-23 00:26:24 -06:00
|
|
|
# The full set of Requirements for this formula's dependency tree.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-01-30 17:55:04 -06:00
|
|
|
def recursive_requirements(&block)
|
|
|
|
Requirement.expand(self, &block)
|
2012-08-14 21:45:08 -05:00
|
|
|
end
|
|
|
|
|
2018-04-25 11:44:29 +01:00
|
|
|
# Returns a Keg for the opt_prefix or installed_prefix if they exist.
|
|
|
|
# If not, return nil.
|
|
|
|
# @private
|
|
|
|
def opt_or_installed_prefix_keg
|
|
|
|
if optlinked? && opt_prefix.exist?
|
|
|
|
Keg.new(opt_prefix)
|
|
|
|
elsif installed_prefix.directory?
|
|
|
|
Keg.new(installed_prefix)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-19 20:53:39 +01:00
|
|
|
# Returns a list of Dependency objects that are required at runtime.
|
|
|
|
# @private
|
2018-07-05 20:29:19 +01:00
|
|
|
def runtime_dependencies(read_from_tab: true, undeclared: true)
|
2018-03-25 12:48:20 +01:00
|
|
|
if read_from_tab &&
|
2018-07-16 16:46:39 +01:00
|
|
|
undeclared &&
|
2018-04-25 11:44:29 +01:00
|
|
|
(keg = opt_or_installed_prefix_keg) &&
|
2018-03-25 12:48:20 +01:00
|
|
|
(tab_deps = keg.runtime_dependencies)
|
2018-06-01 19:22:33 +01:00
|
|
|
return tab_deps.map do |d|
|
2018-06-01 19:53:26 +01:00
|
|
|
full_name = d["full_name"]
|
|
|
|
next unless full_name
|
|
|
|
Dependency.new full_name
|
2018-06-01 19:22:33 +01:00
|
|
|
end.compact
|
2018-03-12 09:20:24 +00:00
|
|
|
end
|
2018-03-25 12:48:20 +01:00
|
|
|
|
2018-07-05 20:29:19 +01:00
|
|
|
return declared_runtime_dependencies unless undeclared
|
2018-03-30 12:39:13 +01:00
|
|
|
declared_runtime_dependencies | undeclared_runtime_dependencies
|
2018-03-12 09:20:24 +00:00
|
|
|
end
|
|
|
|
|
2018-07-16 16:46:39 +01:00
|
|
|
# Returns a list of Formula objects that are required at runtime.
|
2018-04-25 11:44:29 +01:00
|
|
|
# @private
|
2018-07-16 16:46:39 +01:00
|
|
|
def runtime_formula_dependencies(read_from_tab: true, undeclared: true)
|
|
|
|
runtime_dependencies(
|
|
|
|
read_from_tab: read_from_tab,
|
|
|
|
undeclared: undeclared,
|
|
|
|
).map do |d|
|
|
|
|
begin
|
|
|
|
d.to_formula
|
|
|
|
rescue FormulaUnavailableError
|
|
|
|
nil
|
2018-06-01 14:01:34 +01:00
|
|
|
end
|
2018-07-16 16:46:39 +01:00
|
|
|
end.compact
|
2018-03-12 09:20:24 +00:00
|
|
|
end
|
|
|
|
|
2016-10-05 20:56:07 +01:00
|
|
|
# Returns a list of formulae depended on by this formula that aren't
|
|
|
|
# installed
|
|
|
|
def missing_dependencies(hide: nil)
|
|
|
|
hide ||= []
|
2018-07-16 16:46:39 +01:00
|
|
|
runtime_formula_dependencies.select do |f|
|
|
|
|
hide.include?(f.name) || f.installed_prefixes.empty?
|
2016-10-05 20:56:07 +01:00
|
|
|
end
|
2018-07-17 14:59:50 +01:00
|
|
|
# If we're still getting unavailable formulae at this stage the best we can
|
|
|
|
# do is just return no results.
|
|
|
|
rescue FormulaUnavailableError
|
|
|
|
[]
|
2016-10-05 20:56:07 +01:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2012-08-15 22:08:40 -05:00
|
|
|
def to_hash
|
2018-03-21 12:38:47 +00:00
|
|
|
dependencies = deps
|
|
|
|
|
2012-08-15 22:08:40 -05:00
|
|
|
hsh = {
|
|
|
|
"name" => name,
|
2015-05-27 20:30:43 +08:00
|
|
|
"full_name" => full_name,
|
2015-08-09 14:46:07 +03:00
|
|
|
"oldname" => oldname,
|
2018-04-18 11:17:57 +01:00
|
|
|
"aliases" => aliases.sort,
|
2018-05-12 14:37:34 -04:00
|
|
|
"versioned_formulae" => versioned_formulae.map(&:name),
|
2018-05-12 10:42:07 -04:00
|
|
|
"desc" => desc,
|
|
|
|
"homepage" => homepage,
|
2012-08-15 22:08:40 -05:00
|
|
|
"versions" => {
|
2017-11-02 07:26:00 -07:00
|
|
|
"stable" => stable&.version&.to_s,
|
|
|
|
"devel" => devel&.version&.to_s,
|
|
|
|
"head" => head&.version&.to_s,
|
2018-05-12 10:42:07 -04:00
|
|
|
"bottle" => !bottle_specification.checksums.empty?,
|
2012-08-15 22:08:40 -05:00
|
|
|
},
|
2014-03-28 20:41:02 -05:00
|
|
|
"revision" => revision,
|
2016-08-11 09:54:47 +02:00
|
|
|
"version_scheme" => version_scheme,
|
2018-05-12 10:42:07 -04:00
|
|
|
"bottle" => {},
|
2012-08-15 22:08:40 -05:00
|
|
|
"keg_only" => keg_only?,
|
2018-05-12 10:42:07 -04:00
|
|
|
"options" => [],
|
|
|
|
"build_dependencies" => dependencies.select(&:build?).map(&:name).uniq,
|
2018-05-12 10:56:15 -04:00
|
|
|
"dependencies" => dependencies.reject(&:optional?).reject(&:recommended?).reject(&:build?).map(&:name).uniq,
|
2018-03-21 12:38:47 +00:00
|
|
|
"recommended_dependencies" => dependencies.select(&:recommended?).map(&:name).uniq,
|
|
|
|
"optional_dependencies" => dependencies.select(&:optional?).map(&:name).uniq,
|
2018-05-12 10:42:07 -04:00
|
|
|
"requirements" => [],
|
2013-06-09 15:20:09 -05:00
|
|
|
"conflicts_with" => conflicts.map(&:name),
|
2016-09-17 15:17:27 +01:00
|
|
|
"caveats" => caveats,
|
2018-05-12 10:42:07 -04:00
|
|
|
"installed" => [],
|
|
|
|
"linked_keg" => linked_version&.to_s,
|
|
|
|
"pinned" => pinned?,
|
|
|
|
"outdated" => outdated?,
|
2012-08-15 22:08:40 -05:00
|
|
|
}
|
|
|
|
|
2015-09-13 12:59:13 +08:00
|
|
|
%w[stable devel].each do |spec_sym|
|
|
|
|
next unless spec = send(spec_sym)
|
2015-11-01 20:33:24 +08:00
|
|
|
next unless spec.bottle_defined?
|
|
|
|
bottle_spec = spec.bottle_specification
|
2015-09-13 12:59:13 +08:00
|
|
|
bottle_info = {
|
2016-08-18 17:32:35 +01:00
|
|
|
"rebuild" => bottle_spec.rebuild,
|
2016-09-17 15:17:27 +01:00
|
|
|
"cellar" => (cellar = bottle_spec.cellar).is_a?(Symbol) ? cellar.inspect : cellar,
|
2015-09-13 12:59:13 +08:00
|
|
|
"prefix" => bottle_spec.prefix,
|
|
|
|
"root_url" => bottle_spec.root_url,
|
|
|
|
}
|
|
|
|
bottle_info["files"] = {}
|
2018-03-21 12:38:47 +00:00
|
|
|
bottle_spec.collector.keys.each do |os|
|
2015-09-13 12:59:13 +08:00
|
|
|
checksum = bottle_spec.collector[os]
|
|
|
|
bottle_info["files"][os] = {
|
2016-08-18 17:32:35 +01:00
|
|
|
"url" => "#{bottle_spec.root_url}/#{Bottle::Filename.create(self, os, bottle_spec.rebuild)}",
|
2015-09-13 12:59:13 +08:00
|
|
|
checksum.hash_type.to_s => checksum.hexdigest,
|
|
|
|
}
|
|
|
|
end
|
|
|
|
hsh["bottle"][spec_sym] = bottle_info
|
|
|
|
end
|
|
|
|
|
2018-05-12 10:42:07 -04:00
|
|
|
hsh["options"] = options.map do |opt|
|
|
|
|
{ "option" => opt.flag, "description" => opt.description }
|
|
|
|
end
|
|
|
|
|
|
|
|
hsh["requirements"] = requirements.map do |req|
|
|
|
|
{
|
|
|
|
"name" => req.name,
|
|
|
|
"cask" => req.cask,
|
|
|
|
"download" => req.download,
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2015-11-29 15:22:22 +08:00
|
|
|
installed_kegs.each do |keg|
|
|
|
|
tab = Tab.for_keg keg
|
2012-08-15 22:08:40 -05:00
|
|
|
|
2015-11-29 15:22:22 +08:00
|
|
|
hsh["installed"] << {
|
|
|
|
"version" => keg.version.to_s,
|
|
|
|
"used_options" => tab.used_options.as_flags,
|
2016-01-09 23:25:39 -08:00
|
|
|
"built_as_bottle" => tab.built_as_bottle,
|
2016-09-17 15:17:27 +01:00
|
|
|
"poured_from_bottle" => tab.poured_from_bottle,
|
2017-01-09 21:03:37 +00:00
|
|
|
"runtime_dependencies" => tab.runtime_dependencies,
|
2017-01-09 21:06:38 +00:00
|
|
|
"installed_as_dependency" => tab.installed_as_dependency,
|
|
|
|
"installed_on_request" => tab.installed_on_request,
|
2015-11-29 15:22:22 +08:00
|
|
|
}
|
2012-08-15 22:08:40 -05:00
|
|
|
end
|
|
|
|
|
2016-07-11 16:09:35 +03:00
|
|
|
hsh["installed"] = hsh["installed"].sort_by { |i| Version.create(i["version"]) }
|
2015-11-29 15:22:22 +08:00
|
|
|
|
2012-08-15 22:08:40 -05:00
|
|
|
hsh
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-06-05 09:47:08 -07:00
|
|
|
def fetch
|
2013-09-17 21:25:38 -05:00
|
|
|
active_spec.fetch
|
2013-06-05 09:47:08 -07:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-03 13:09:07 +01:00
|
|
|
def verify_download_integrity(fn)
|
2013-06-05 09:47:08 -07:00
|
|
|
active_spec.verify_download_integrity(fn)
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-09-18 14:16:07 -05:00
|
|
|
def run_test
|
2017-01-06 08:50:35 +00:00
|
|
|
@prefix_returns_versioned_prefix = true
|
2017-10-29 14:44:43 +00:00
|
|
|
|
|
|
|
test_env = {
|
|
|
|
CURL_HOME: ENV["CURL_HOME"] || ENV["HOME"],
|
|
|
|
TMPDIR: HOMEBREW_TEMP,
|
|
|
|
TEMP: HOMEBREW_TEMP,
|
|
|
|
TMP: HOMEBREW_TEMP,
|
|
|
|
TERM: "dumb",
|
2017-12-02 00:12:21 +01:00
|
|
|
PATH: PATH.new(ENV["PATH"], HOMEBREW_PREFIX/"bin"),
|
2017-10-29 14:44:43 +00:00
|
|
|
HOMEBREW_PATH: nil,
|
|
|
|
_JAVA_OPTIONS: "#{ENV["_JAVA_OPTIONS"]} -Duser.home=#{HOMEBREW_CACHE}/java_cache",
|
|
|
|
}
|
2017-04-22 16:31:19 +01:00
|
|
|
|
|
|
|
ENV.clear_sensitive_environment!
|
|
|
|
|
2018-07-14 15:41:16 +01:00
|
|
|
mktemp("#{name}-test") do |staging|
|
2016-04-10 22:53:56 -04:00
|
|
|
staging.retain! if ARGV.keep_tmp?
|
|
|
|
@testpath = staging.tmpdir
|
2017-10-29 14:44:43 +00:00
|
|
|
test_env[:HOME] = @testpath
|
2015-10-17 10:05:41 -07:00
|
|
|
setup_home @testpath
|
2016-04-10 22:53:56 -04:00
|
|
|
begin
|
2016-05-27 01:53:08 -04:00
|
|
|
with_logging("test") do
|
2017-10-29 14:44:43 +00:00
|
|
|
with_env(test_env) do
|
|
|
|
test
|
|
|
|
end
|
2016-05-27 01:53:08 -04:00
|
|
|
end
|
2017-10-07 00:31:28 +02:00
|
|
|
rescue Exception # rubocop:disable Lint/RescueException
|
2016-04-10 22:53:56 -04:00
|
|
|
staging.retain! if ARGV.debug?
|
|
|
|
raise
|
|
|
|
end
|
2013-06-05 09:47:08 -07:00
|
|
|
end
|
2014-09-18 14:16:07 -05:00
|
|
|
ensure
|
|
|
|
@testpath = nil
|
2017-01-06 08:50:35 +00:00
|
|
|
@prefix_returns_versioned_prefix = false
|
2013-06-05 09:47:08 -07:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-06-05 09:47:08 -07:00
|
|
|
def test_defined?
|
2014-08-16 17:44:22 -05:00
|
|
|
false
|
2013-06-05 09:47:08 -07:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2017-10-07 00:31:28 +02:00
|
|
|
def test; end
|
2014-09-18 14:16:07 -05:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-10-19 01:14:32 -05:00
|
|
|
def test_fixtures(file)
|
2017-06-01 16:06:51 +02:00
|
|
|
HOMEBREW_LIBRARY_PATH/"test/support/fixtures"/file
|
2014-10-19 01:14:32 -05:00
|
|
|
end
|
|
|
|
|
2016-11-03 02:51:22 +00:00
|
|
|
# This method is overridden in {Formula} subclasses to provide the installation instructions.
|
2015-08-29 10:56:24 +01:00
|
|
|
# The sources (from {.url}) are downloaded, hash-checked and
|
|
|
|
# Homebrew changes into a temporary directory where the
|
|
|
|
# archive was unpacked or repository cloned.
|
|
|
|
# <pre>def install
|
|
|
|
# system "./configure", "--prefix=#{prefix}"
|
|
|
|
# system "make", "install"
|
|
|
|
# end</pre>
|
2017-10-07 00:31:28 +02:00
|
|
|
def install; end
|
2014-12-06 11:27:03 +00:00
|
|
|
|
2014-12-12 22:27:34 -05:00
|
|
|
protected
|
|
|
|
|
2015-10-17 10:05:41 -07:00
|
|
|
def setup_home(home)
|
|
|
|
# keep Homebrew's site-packages in sys.path when using system Python
|
2015-04-08 12:56:32 -07:00
|
|
|
user_site_packages = home/"Library/Python/2.7/lib/python/site-packages"
|
|
|
|
user_site_packages.mkpath
|
2018-07-11 15:17:40 +02:00
|
|
|
(user_site_packages/"homebrew.pth").write <<~PYTHON
|
2015-04-08 12:56:32 -07:00
|
|
|
import site; site.addsitedir("#{HOMEBREW_PREFIX}/lib/python2.7/site-packages")
|
2016-01-27 08:39:32 -08:00
|
|
|
import sys, os; sys.path = (os.environ["PYTHONPATH"].split(os.pathsep) if "PYTHONPATH" in os.environ else []) + ["#{HOMEBREW_PREFIX}/lib/python2.7/site-packages"] + sys.path
|
2018-07-11 15:17:40 +02:00
|
|
|
PYTHON
|
2015-04-08 12:56:32 -07:00
|
|
|
end
|
|
|
|
|
2018-07-16 16:46:39 +01:00
|
|
|
# Returns a list of Dependency objects that are declared in the formula.
|
|
|
|
# @private
|
|
|
|
def declared_runtime_dependencies
|
|
|
|
recursive_dependencies do |_, dependency|
|
|
|
|
Dependency.prune if dependency.build?
|
|
|
|
next if dependency.required?
|
|
|
|
if build.any_args_or_options?
|
|
|
|
Dependency.prune if build.without?(dependency)
|
|
|
|
elsif !dependency.recommended?
|
|
|
|
Dependency.prune
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Returns a list of Dependency objects that are not declared in the formula
|
|
|
|
# but the formula links to.
|
|
|
|
# @private
|
|
|
|
def undeclared_runtime_dependencies
|
|
|
|
keg = opt_or_installed_prefix_keg
|
|
|
|
return [] unless keg
|
|
|
|
|
|
|
|
undeclared_deps = CacheStoreDatabase.use(:linkage) do |db|
|
|
|
|
linkage_checker = LinkageChecker.new(keg, self, cache_db: db)
|
|
|
|
linkage_checker.undeclared_deps.map { |n| Dependency.new(n) }
|
|
|
|
end
|
|
|
|
|
|
|
|
undeclared_deps
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
public
|
|
|
|
|
|
|
|
# To call out to the system, we use the `system` method and we prefer
|
|
|
|
# you give the args separately as in the line below, otherwise a subshell
|
|
|
|
# has to be opened first.
|
|
|
|
# <pre>system "./bootstrap.sh", "--arg1", "--prefix=#{prefix}"</pre>
|
|
|
|
#
|
|
|
|
# For CMake we have some necessary defaults in {#std_cmake_args}:
|
|
|
|
# <pre>system "cmake", ".", *std_cmake_args</pre>
|
|
|
|
#
|
|
|
|
# If the arguments given to configure (or make or cmake) are depending
|
|
|
|
# on options defined above, we usually make a list first and then
|
|
|
|
# use the `args << if <condition>` to append to:
|
|
|
|
# <pre>args = ["--with-option1", "--with-option2"]
|
|
|
|
#
|
|
|
|
# # Most software still uses `configure` and `make`.
|
|
|
|
# # Check with `./configure --help` what our options are.
|
|
|
|
# system "./configure", "--disable-debug", "--disable-dependency-tracking",
|
|
|
|
# "--disable-silent-rules", "--prefix=#{prefix}",
|
|
|
|
# *args # our custom arg list (needs `*` to unpack)
|
|
|
|
#
|
|
|
|
# # If there is a "make", "install" available, please use it!
|
|
|
|
# system "make", "install"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def system(cmd, *args)
|
2014-09-05 15:13:53 -05:00
|
|
|
verbose = ARGV.verbose?
|
2015-09-23 15:40:27 +08:00
|
|
|
verbose_using_dots = !ENV["HOMEBREW_VERBOSE_USING_DOTS"].nil?
|
|
|
|
|
2011-07-30 11:03:27 +01:00
|
|
|
# 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
|
2015-08-03 13:09:07 +01:00
|
|
|
if cmd == "./configure" && !verbose
|
2012-08-31 08:09:35 -04:00
|
|
|
pretty_args.delete "--disable-dependency-tracking"
|
|
|
|
pretty_args.delete "--disable-debug"
|
|
|
|
end
|
2014-12-08 12:57:40 -05:00
|
|
|
pretty_args.each_index do |i|
|
|
|
|
if pretty_args[i].to_s.start_with? "import setuptools"
|
|
|
|
pretty_args[i] = "import setuptools..."
|
|
|
|
end
|
|
|
|
end
|
2017-06-01 16:06:51 +02:00
|
|
|
ohai "#{cmd} #{pretty_args * " "}".strip
|
2009-11-06 17:09:14 +00:00
|
|
|
|
2013-10-27 07:05:13 +01:00
|
|
|
@exec_count ||= 0
|
|
|
|
@exec_count += 1
|
2016-09-23 17:29:29 +02:00
|
|
|
logfn = format("#{logs}/#{active_log_prefix}%02d.%s", @exec_count, File.basename(cmd).split(" ").first)
|
2015-04-25 22:07:06 -04:00
|
|
|
logs.mkpath
|
2013-10-27 07:05:13 +01:00
|
|
|
|
2014-12-30 23:52:07 -05:00
|
|
|
File.open(logfn, "w") do |log|
|
2014-09-05 15:36:08 -05:00
|
|
|
log.puts Time.now, "", cmd, args, ""
|
|
|
|
log.flush
|
2014-09-05 15:13:52 -05:00
|
|
|
|
2014-09-05 15:36:08 -05:00
|
|
|
if verbose
|
|
|
|
rd, wr = IO.pipe
|
|
|
|
begin
|
|
|
|
pid = fork do
|
|
|
|
rd.close
|
|
|
|
log.close
|
|
|
|
exec_cmd(cmd, args, wr, logfn)
|
|
|
|
end
|
|
|
|
wr.close
|
|
|
|
|
2015-09-23 15:40:27 +08:00
|
|
|
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.
|
2016-09-17 15:17:27 +01:00
|
|
|
next unless (Time.now - last_dot) > 60
|
|
|
|
print "."
|
|
|
|
$stdout.flush
|
|
|
|
last_dot = Time.now
|
2015-09-23 15:40:27 +08:00
|
|
|
end
|
|
|
|
puts
|
|
|
|
else
|
|
|
|
while buf = rd.gets
|
|
|
|
log.puts buf
|
|
|
|
puts buf
|
|
|
|
end
|
2014-09-05 15:36:08 -05:00
|
|
|
end
|
|
|
|
ensure
|
2014-09-05 16:56:07 -05:00
|
|
|
rd.close
|
2014-09-05 15:13:53 -05:00
|
|
|
end
|
2014-09-05 15:36:08 -05:00
|
|
|
else
|
|
|
|
pid = fork { exec_cmd(cmd, args, log, logfn) }
|
2014-09-05 15:13:53 -05:00
|
|
|
end
|
2013-09-07 10:22:58 -05:00
|
|
|
|
2014-09-05 15:36:08 -05:00
|
|
|
Process.wait(pid)
|
2013-09-07 10:22:58 -05:00
|
|
|
|
2014-09-05 15:36:08 -05:00
|
|
|
$stdout.flush
|
2013-11-29 21:05:20 -06:00
|
|
|
|
2017-06-10 20:12:55 +03:00
|
|
|
unless $CHILD_STATUS.success?
|
2015-09-21 15:10:23 +01:00
|
|
|
log_lines = ENV["HOMEBREW_FAIL_LOG_LINES"]
|
|
|
|
log_lines ||= "15"
|
|
|
|
|
2014-09-05 15:36:08 -05:00
|
|
|
log.flush
|
2015-09-24 16:42:32 +08:00
|
|
|
if !verbose || verbose_using_dots
|
2015-09-21 15:10:23 +01:00
|
|
|
puts "Last #{log_lines} lines from #{logfn}:"
|
|
|
|
Kernel.system "/usr/bin/tail", "-n", log_lines, logfn
|
|
|
|
end
|
2014-09-05 15:36:08 -05:00
|
|
|
log.puts
|
2014-12-30 23:47:07 -05:00
|
|
|
|
2016-05-08 21:41:51 +02:00
|
|
|
require "system_config"
|
2015-11-13 16:43:43 +01:00
|
|
|
require "build_environment"
|
2014-12-30 23:47:07 -05:00
|
|
|
|
|
|
|
env = ENV.to_hash
|
|
|
|
|
2016-05-08 21:41:51 +02:00
|
|
|
SystemConfig.dump_verbose_config(log)
|
2014-12-30 23:47:07 -05:00
|
|
|
log.puts
|
|
|
|
Homebrew.dump_build_env(env, log)
|
|
|
|
|
|
|
|
raise BuildError.new(self, cmd, args, env)
|
2014-09-05 15:36:08 -05:00
|
|
|
end
|
2012-09-11 20:59:59 -04:00
|
|
|
end
|
2009-08-10 16:48:30 +01:00
|
|
|
end
|
2009-07-24 15:10:01 +01:00
|
|
|
|
2015-12-29 12:57:48 +01:00
|
|
|
# @private
|
|
|
|
def eligible_kegs_for_cleanup
|
|
|
|
eligible_for_cleanup = []
|
|
|
|
if installed?
|
2016-07-16 15:31:03 +03:00
|
|
|
eligible_kegs = if head? && (head_prefix = latest_head_prefix)
|
|
|
|
installed_kegs - [Keg.new(head_prefix)]
|
|
|
|
else
|
2017-01-30 17:16:23 +08:00
|
|
|
installed_kegs.select do |keg|
|
|
|
|
tab = Tab.for_keg(keg)
|
|
|
|
if version_scheme > tab.version_scheme
|
|
|
|
true
|
|
|
|
elsif version_scheme == tab.version_scheme
|
|
|
|
pkg_version > keg.version
|
|
|
|
else
|
|
|
|
false
|
|
|
|
end
|
|
|
|
end
|
2016-07-16 15:31:03 +03:00
|
|
|
end
|
|
|
|
|
2016-08-05 22:01:32 +08:00
|
|
|
unless eligible_kegs.empty?
|
2015-12-29 12:57:48 +01:00
|
|
|
eligible_kegs.each do |keg|
|
|
|
|
if keg.linked?
|
|
|
|
opoo "Skipping (old) #{keg} due to it being linked"
|
2016-09-01 17:31:28 +03:00
|
|
|
elsif pinned? && keg == Keg.new(@pin.path.resolved_path)
|
|
|
|
opoo "Skipping (old) #{keg} due to it being pinned"
|
2015-12-29 12:57:48 +01:00
|
|
|
else
|
|
|
|
eligible_for_cleanup << keg
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2016-08-05 22:01:32 +08:00
|
|
|
elsif !installed_prefixes.empty? && !pinned?
|
2015-12-29 12:57:48 +01:00
|
|
|
# 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.
|
2016-01-04 16:04:31 +01:00
|
|
|
opoo "Skipping #{full_name}: most recent version #{pkg_version} not installed"
|
2015-12-29 12:57:48 +01:00
|
|
|
end
|
|
|
|
eligible_for_cleanup
|
|
|
|
end
|
|
|
|
|
2018-07-14 15:41:16 +01:00
|
|
|
# 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.
|
|
|
|
def mktemp(prefix = name, opts = {})
|
|
|
|
Mktemp.new(prefix, opts).run do |staging|
|
|
|
|
yield staging
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-07-14 18:13:23 +01:00
|
|
|
# A version of `FileUtils.mkdir` that also changes to that folder in
|
|
|
|
# a block.
|
|
|
|
def mkdir(name)
|
|
|
|
result = FileUtils.mkdir_p(name)
|
|
|
|
return result unless block_given?
|
|
|
|
FileUtils.chdir name do
|
|
|
|
yield
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Run `scons` using a Homebrew-installed version rather than whatever is
|
|
|
|
# in the `PATH`.
|
|
|
|
def scons(*args)
|
|
|
|
system Formulary.factory("scons").opt_bin/"scons", *args
|
|
|
|
end
|
|
|
|
|
|
|
|
# Run `make` 3.81 or newer.
|
|
|
|
# Uses the system make on Leopard and newer, and the
|
|
|
|
# path to the actually-installed make on Tiger or older.
|
|
|
|
def make(*args)
|
|
|
|
if Utils.popen_read("/usr/bin/make", "--version")
|
|
|
|
.match(/Make (\d\.\d+)/)[1] > "3.80"
|
|
|
|
make_path = "/usr/bin/make"
|
|
|
|
else
|
|
|
|
make = Formula["make"].opt_bin/"make"
|
|
|
|
make_path = if make.exist?
|
|
|
|
make.to_s
|
|
|
|
else
|
|
|
|
(Formula["make"].opt_bin/"gmake").to_s
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if superenv?
|
|
|
|
make_name = File.basename(make_path)
|
|
|
|
with_env(HOMEBREW_MAKE: make_name) do
|
|
|
|
system "make", *args
|
|
|
|
end
|
|
|
|
else
|
|
|
|
system make_path, *args
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Run `xcodebuild` without Homebrew's compiler environment variables set.
|
|
|
|
def xcodebuild(*args)
|
|
|
|
removed = ENV.remove_cc_etc
|
|
|
|
system "xcodebuild", *args
|
|
|
|
ensure
|
|
|
|
ENV.update(removed)
|
|
|
|
end
|
|
|
|
|
2013-04-07 00:49:56 -05:00
|
|
|
private
|
2012-03-04 16:48:00 -08:00
|
|
|
|
2017-01-06 08:50:35 +00:00
|
|
|
# Returns the prefix for a given formula version number.
|
|
|
|
# @private
|
|
|
|
def versioned_prefix(v)
|
|
|
|
rack/v
|
|
|
|
end
|
|
|
|
|
2014-09-05 15:13:52 -05:00
|
|
|
def exec_cmd(cmd, args, out, logfn)
|
2015-08-03 13:09:07 +01:00
|
|
|
ENV["HOMEBREW_CC_LOG_PATH"] = logfn
|
2014-09-05 15:13:52 -05:00
|
|
|
|
2016-09-23 11:01:40 +02:00
|
|
|
ENV.remove_cc_etc if cmd.to_s.start_with? "xcodebuild"
|
2014-09-05 15:13:52 -05:00
|
|
|
|
|
|
|
# Turn on argument filtering in the superenv compiler wrapper.
|
|
|
|
# We should probably have a better mechanism for this than adding
|
|
|
|
# special cases to this method.
|
2014-12-10 00:29:11 -08:00
|
|
|
if cmd == "python"
|
|
|
|
setup_py_in_args = %w[setup.py build.py].include?(args.first)
|
2014-12-12 15:16:24 -08:00
|
|
|
setuptools_shim_in_args = args.any? { |a| a.to_s.start_with? "import setuptools" }
|
2016-09-23 11:01:40 +02:00
|
|
|
ENV.refurbish_args if setup_py_in_args || setuptools_shim_in_args
|
2014-09-05 15:13:52 -05:00
|
|
|
end
|
|
|
|
|
2014-09-05 15:13:52 -05:00
|
|
|
$stdout.reopen(out)
|
|
|
|
$stderr.reopen(out)
|
2014-09-07 20:41:18 -05:00
|
|
|
out.close
|
2015-08-03 13:09:07 +01:00
|
|
|
args.collect!(&:to_s)
|
2016-09-17 15:17:27 +01:00
|
|
|
begin
|
|
|
|
exec(cmd, *args)
|
|
|
|
rescue
|
|
|
|
nil
|
|
|
|
end
|
2014-09-05 15:13:52 -05:00
|
|
|
puts "Failed to execute: #{cmd}"
|
|
|
|
exit! 1 # never gets here unless exec threw or failed
|
|
|
|
end
|
|
|
|
|
2009-08-11 12:20:55 -07:00
|
|
|
def stage
|
2016-04-22 16:54:09 -04:00
|
|
|
active_spec.stage do |staging|
|
2016-01-14 19:00:06 +08:00
|
|
|
@source_modified_time = active_spec.source_modified_time
|
2012-02-24 12:50:21 -08:00
|
|
|
@buildpath = Pathname.pwd
|
2015-06-05 22:35:08 +01:00
|
|
|
env_home = buildpath/".brew_home"
|
|
|
|
mkdir_p env_home
|
|
|
|
|
2017-10-29 14:44:43 +00:00
|
|
|
stage_env = {
|
|
|
|
HOMEBREW_PATH: nil,
|
|
|
|
}
|
2017-04-22 16:31:19 +01:00
|
|
|
|
2017-05-09 20:00:11 +01:00
|
|
|
unless ARGV.interactive?
|
2017-10-29 14:44:43 +00:00
|
|
|
stage_env[:HOME] = env_home
|
|
|
|
stage_env[:_JAVA_OPTIONS] =
|
|
|
|
"#{ENV["_JAVA_OPTIONS"]} -Duser.home=#{HOMEBREW_CACHE}/java_cache"
|
|
|
|
stage_env[:CURL_HOME] = ENV["CURL_HOME"] || ENV["HOME"]
|
2017-05-09 20:00:11 +01:00
|
|
|
end
|
2017-04-22 16:31:19 +01:00
|
|
|
|
2015-10-17 10:05:41 -07:00
|
|
|
setup_home env_home
|
2015-06-05 22:35:08 +01:00
|
|
|
|
2017-04-22 16:31:19 +01:00
|
|
|
ENV.clear_sensitive_environment!
|
|
|
|
|
2015-06-05 22:35:08 +01:00
|
|
|
begin
|
2017-10-29 14:44:43 +00:00
|
|
|
with_env(stage_env) do
|
|
|
|
yield staging
|
|
|
|
end
|
2015-06-05 22:35:08 +01:00
|
|
|
ensure
|
|
|
|
@buildpath = nil
|
|
|
|
end
|
2009-07-31 11:05:23 -07:00
|
|
|
end
|
|
|
|
end
|
2010-07-04 14:17:03 -07:00
|
|
|
|
2014-12-26 17:44:44 -05:00
|
|
|
def prepare_patches
|
2015-07-21 22:14:04 +08:00
|
|
|
active_spec.add_legacy_patches(patches) if respond_to?(:patches)
|
2009-09-15 20:07:40 +01:00
|
|
|
|
2015-01-22 17:03:54 -05:00
|
|
|
patchlist.grep(DATAPatch) { |p| p.path = path }
|
2014-07-29 16:06:06 -05:00
|
|
|
|
2015-08-17 17:08:23 +02:00
|
|
|
patchlist.each do |patch|
|
|
|
|
patch.verify_download_integrity(patch.fetch) if patch.external?
|
2011-08-29 14:55:28 -07:00
|
|
|
end
|
2009-07-24 15:10:01 +01:00
|
|
|
end
|
2009-08-11 18:16:12 +01:00
|
|
|
|
2017-10-07 00:31:28 +02:00
|
|
|
# The methods below define the formula DSL.
|
|
|
|
class << self
|
|
|
|
include BuildEnvironment::DSL
|
2014-08-10 21:45:23 -05:00
|
|
|
|
2017-10-07 00:31:28 +02:00
|
|
|
def method_added(method)
|
|
|
|
case method
|
|
|
|
when :brew
|
|
|
|
raise "You cannot override Formula#brew in class #{name}"
|
|
|
|
when :test
|
|
|
|
define_method(:test_defined?) { true }
|
|
|
|
when :options
|
|
|
|
instance = allocate
|
|
|
|
|
|
|
|
specs.each do |spec|
|
|
|
|
instance.options.each do |opt, desc|
|
|
|
|
spec.option(opt[/^--(.+)$/, 1], desc)
|
|
|
|
end
|
2014-08-10 21:45:23 -05:00
|
|
|
end
|
2014-08-10 21:45:23 -05:00
|
|
|
|
2017-10-07 00:31:28 +02:00
|
|
|
remove_method(:options)
|
|
|
|
end
|
2013-01-07 17:34:56 -06:00
|
|
|
end
|
2009-09-28 14:06:53 -07:00
|
|
|
|
2014-12-06 11:26:43 +00:00
|
|
|
# The reason for why this software is not linked (by default) to
|
|
|
|
# {::HOMEBREW_PREFIX}.
|
2014-12-26 20:24:12 +00:00
|
|
|
# @private
|
2014-08-19 17:14:02 -05:00
|
|
|
attr_reader :keg_only_reason
|
2014-12-06 11:26:43 +00:00
|
|
|
|
2015-05-19 13:06:06 -04:00
|
|
|
# @!attribute [w]
|
|
|
|
# A one-line description of the software. Used by users to get an overview
|
|
|
|
# of the software and Homebrew maintainers.
|
|
|
|
# Shows when running `brew info`.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# <pre>desc "Example formula"</pre>
|
2015-05-19 13:06:06 -04:00
|
|
|
attr_rw :desc
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @!attribute [w] homepage
|
2014-12-06 11:26:43 +00:00
|
|
|
# The homepage for the software. Used by users to get more information
|
|
|
|
# about the software and Homebrew maintainers as a point of contact for
|
|
|
|
# e.g. submitting patches.
|
2014-12-26 20:24:12 +00:00
|
|
|
# Can be opened with running `brew home`.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# <pre>homepage "https://www.example.com"</pre>
|
2014-12-06 11:26:43 +00:00
|
|
|
attr_rw :homepage
|
|
|
|
|
|
|
|
# The `:startup` attribute set by {.plist_options}.
|
2014-12-26 20:24:12 +00:00
|
|
|
# @private
|
|
|
|
attr_reader :plist_startup
|
2014-12-06 11:26:43 +00:00
|
|
|
|
|
|
|
# The `:manual` attribute set by {.plist_options}.
|
2014-12-26 20:24:12 +00:00
|
|
|
# @private
|
|
|
|
attr_reader :plist_manual
|
2014-12-06 11:26:43 +00:00
|
|
|
|
2016-01-09 11:06:17 +00:00
|
|
|
# If `pour_bottle?` returns `false` the user-visible reason to display for
|
|
|
|
# why they cannot use the bottle.
|
|
|
|
# @private
|
|
|
|
attr_accessor :pour_bottle_check_unsatisfied_reason
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @!attribute [w] revision
|
2014-12-06 11:26:43 +00:00
|
|
|
# Used for creating new Homebrew versions of software without new upstream
|
|
|
|
# versions. For example, if we bump the major version of a library this
|
|
|
|
# {Formula} {.depends_on} then we may need to update the `revision` of this
|
|
|
|
# {Formula} to install a new version linked against the new library version.
|
|
|
|
# `0` if unset.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# <pre>revision 1</pre>
|
2014-12-06 11:26:43 +00:00
|
|
|
attr_rw :revision
|
2009-10-17 14:35:24 +02:00
|
|
|
|
2016-08-11 09:54:47 +02:00
|
|
|
# @!attribute [w] version_scheme
|
|
|
|
# Used for creating new Homebrew versions schemes. For example, if we want
|
|
|
|
# to change version scheme from one to another, then we may need to update
|
|
|
|
# `version_scheme` of this {Formula} to be able to use new version scheme.
|
2016-08-11 10:00:39 +02:00
|
|
|
# E.g. to move from 20151020 scheme to 1.0.0 we need to increment
|
|
|
|
# `version_scheme`. Without this, the prior scheme will always equate to a
|
|
|
|
# higher version.
|
2016-08-11 09:54:47 +02:00
|
|
|
# `0` if unset.
|
|
|
|
#
|
|
|
|
# <pre>version_scheme 1</pre>
|
|
|
|
attr_rw :version_scheme
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# A list of the {.stable}, {.devel} and {.head} {SoftwareSpec}s.
|
|
|
|
# @private
|
2013-09-17 21:25:39 -05:00
|
|
|
def specs
|
2014-03-10 14:56:02 -05:00
|
|
|
@specs ||= [stable, devel, head].freeze
|
2013-09-17 21:25:39 -05:00
|
|
|
end
|
|
|
|
|
2015-01-04 14:25:59 -05:00
|
|
|
# @!attribute [w] url
|
2015-01-04 14:25:59 -05:00
|
|
|
# The URL used to download the source for the {#stable} version of the formula.
|
2014-12-26 20:24:12 +00:00
|
|
|
# We prefer `https` for security and proxy reasons.
|
2017-02-19 13:21:55 -08:00
|
|
|
# If not inferrable, specify the download strategy with `:using => ...`
|
2015-08-29 10:56:24 +01:00
|
|
|
# `:git`, `:hg`, `:svn`, `:bzr`, `:cvs`,
|
|
|
|
# `:curl` (normal file download. Will also extract.)
|
|
|
|
# `:nounzip` (without extracting)
|
|
|
|
# `:post` (download via an HTTP POST)
|
|
|
|
# `S3DownloadStrategy` (download from S3 using signed request)
|
|
|
|
#
|
|
|
|
# <pre>url "https://packed.sources.and.we.prefer.https.example.com/archive-1.2.3.tar.bz2"</pre>
|
2017-02-19 13:21:55 -08:00
|
|
|
# <pre>url "https://some.dont.provide.archives.example.com",
|
|
|
|
# :using => :git,
|
|
|
|
# :tag => "1.2.3",
|
|
|
|
# :revision => "db8e4de5b2d6653f66aea53094624468caad15d2"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def url(val, specs = {})
|
Eagerly initialize formula specs
Declarations of dependencies, options, and resources in the DSL only
apply to specs that have already been initialized. For example, given
this snippet:
url ...
sha1 ...
depends_on 'foo'
devel do
url ...
sha1 ...
end
The dependency 'foo' will be recorded for the stable spec, but not the
devel spec, since it was not initialized prior to the call to
depends_on.
While it is considered best practice to declare all specs (stable,
devel, head, and bottle) prior to other declarations, there is nothing
that enforces this ordering, so when it happens it can be confusing and
hard to debug.
To prevent this, we can initialize all specs up front. This comes with
a performance penalty for commands that load all formulae into memory,
but that is probably outweighed by what we gain in correctness.
Fixes Homebrew/homebrew#23425.
2013-10-22 13:07:08 -05:00
|
|
|
stable.url(val, specs)
|
2012-07-30 11:32:56 -07:00
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# @!attribute [w] version
|
2015-01-04 14:25:59 -05:00
|
|
|
# The version string for the {#stable} version of the formula.
|
2014-12-26 20:24:12 +00:00
|
|
|
# The version is autodetected from the URL and/or tag so only needs to be
|
|
|
|
# declared if it cannot be autodetected correctly.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# <pre>version "1.2-final"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def version(val = nil)
|
Eagerly initialize formula specs
Declarations of dependencies, options, and resources in the DSL only
apply to specs that have already been initialized. For example, given
this snippet:
url ...
sha1 ...
depends_on 'foo'
devel do
url ...
sha1 ...
end
The dependency 'foo' will be recorded for the stable spec, but not the
devel spec, since it was not initialized prior to the call to
depends_on.
While it is considered best practice to declare all specs (stable,
devel, head, and bottle) prior to other declarations, there is nothing
that enforces this ordering, so when it happens it can be confusing and
hard to debug.
To prevent this, we can initialize all specs up front. This comes with
a performance penalty for commands that load all formulae into memory,
but that is probably outweighed by what we gain in correctness.
Fixes Homebrew/homebrew#23425.
2013-10-22 13:07:08 -05:00
|
|
|
stable.version(val)
|
2013-09-22 16:04:25 -05:00
|
|
|
end
|
|
|
|
|
2015-01-04 14:25:59 -05:00
|
|
|
# @!attribute [w] mirror
|
2015-01-04 14:25:59 -05:00
|
|
|
# Additional URLs for the {#stable} version of the formula.
|
2014-12-26 20:24:12 +00:00
|
|
|
# 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}.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# <pre>mirror "https://in.case.the.host.is.down.example.com"
|
|
|
|
# mirror "https://in.case.the.mirror.is.down.example.com</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def mirror(val)
|
Eagerly initialize formula specs
Declarations of dependencies, options, and resources in the DSL only
apply to specs that have already been initialized. For example, given
this snippet:
url ...
sha1 ...
depends_on 'foo'
devel do
url ...
sha1 ...
end
The dependency 'foo' will be recorded for the stable spec, but not the
devel spec, since it was not initialized prior to the call to
depends_on.
While it is considered best practice to declare all specs (stable,
devel, head, and bottle) prior to other declarations, there is nothing
that enforces this ordering, so when it happens it can be confusing and
hard to debug.
To prevent this, we can initialize all specs up front. This comes with
a performance penalty for commands that load all formulae into memory,
but that is probably outweighed by what we gain in correctness.
Fixes Homebrew/homebrew#23425.
2013-10-22 13:07:08 -05:00
|
|
|
stable.mirror(val)
|
2013-09-22 16:04:25 -05:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @!attribute [w] sha256
|
2014-12-26 20:24:12 +00:00
|
|
|
# @scope class
|
|
|
|
# To verify the {#cached_download}'s integrity and security we verify the
|
2015-08-29 10:56:24 +01:00
|
|
|
# SHA-256 hash matches what we've declared in the {Formula}. To quickly fill
|
2014-12-26 20:24:12 +00:00
|
|
|
# this value you can leave it blank and run `brew fetch --force` and it'll
|
|
|
|
# tell you the currently valid value.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# <pre>sha256 "2a2ba417eebaadcb4418ee7b12fe2998f26d6e6f7fda7983412ff66a741ab6f7"</pre>
|
2014-05-27 21:02:00 -05:00
|
|
|
Checksum::TYPES.each do |type|
|
|
|
|
define_method(type) { |val| stable.send(type, val) }
|
2013-09-22 16:04:25 -05:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @!attribute [w] bottle
|
|
|
|
# Adds a {.bottle} {SoftwareSpec}.
|
|
|
|
# This provides a pre-built binary package built by the Homebrew maintainers for you.
|
2015-10-19 17:09:13 +01:00
|
|
|
# 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.
|
|
|
|
#
|
2015-08-29 10:56:24 +01:00
|
|
|
# If you maintain your own repository, you can add your own bottle links.
|
2018-02-22 19:46:58 +00:00
|
|
|
# https://docs.brew.sh/Bottles
|
2017-07-31 19:24:33 -07:00
|
|
|
# You can ignore this block entirely if submitting to Homebrew/homebrew-core.
|
|
|
|
# It'll be handled for you by the Brew Test Bot.
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
|
|
|
# <pre>bottle do
|
2015-10-19 17:09:13 +01:00
|
|
|
# root_url "https://example.com" # Optional root to calculate bottle URLs
|
2015-08-29 10:56:24 +01:00
|
|
|
# prefix "/opt/homebrew" # Optional HOMEBREW_PREFIX in which the bottles were built.
|
|
|
|
# cellar "/opt/homebrew/Cellar" # Optional HOMEBREW_CELLAR in which the bottles were built.
|
2016-08-18 17:32:35 +01:00
|
|
|
# rebuild 1 # Making the old bottle outdated without bumping the version/revision of the formula.
|
2015-10-19 17:09:13 +01:00
|
|
|
# sha256 "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" => :el_capitan
|
|
|
|
# sha256 "53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3" => :yosemite
|
|
|
|
# sha256 "1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2" => :mavericks
|
2015-08-29 10:56:24 +01:00
|
|
|
# end</pre>
|
2015-09-14 19:51:04 +08:00
|
|
|
#
|
2015-10-19 17:09:13 +01:00
|
|
|
# Only formulae where the upstream URL breaks or moves frequently, require compile
|
|
|
|
# or have a reasonable amount of patches/resources should be bottled.
|
|
|
|
# Formulae which do not meet the above requirements should not be bottled.
|
|
|
|
#
|
|
|
|
# Formulae which should not be bottled & can be installed without any compile
|
|
|
|
# required should be tagged with:
|
2015-09-14 19:51:04 +08:00
|
|
|
# <pre>bottle :unneeded</pre>
|
|
|
|
#
|
2015-10-19 17:09:13 +01:00
|
|
|
# Otherwise formulae which do not meet the above requirements and should not
|
|
|
|
# be bottled should be tagged with:
|
2015-09-14 19:51:04 +08:00
|
|
|
# <pre>bottle :disable, "reasons"</pre>
|
|
|
|
def bottle(*args, &block)
|
|
|
|
stable.bottle(*args, &block)
|
2014-03-10 14:56:02 -05:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-09-22 16:04:25 -05:00
|
|
|
def build
|
Eagerly initialize formula specs
Declarations of dependencies, options, and resources in the DSL only
apply to specs that have already been initialized. For example, given
this snippet:
url ...
sha1 ...
depends_on 'foo'
devel do
url ...
sha1 ...
end
The dependency 'foo' will be recorded for the stable spec, but not the
devel spec, since it was not initialized prior to the call to
depends_on.
While it is considered best practice to declare all specs (stable,
devel, head, and bottle) prior to other declarations, there is nothing
that enforces this ordering, so when it happens it can be confusing and
hard to debug.
To prevent this, we can initialize all specs up front. This comes with
a performance penalty for commands that load all formulae into memory,
but that is probably outweighed by what we gain in correctness.
Fixes Homebrew/homebrew#23425.
2013-10-22 13:07:08 -05:00
|
|
|
stable.build
|
2009-10-17 14:35:24 +02:00
|
|
|
end
|
2009-09-28 14:06:53 -07:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @!attribute [w] stable
|
|
|
|
# Allows adding {.depends_on} and {#patch}es just to the {.stable} {SoftwareSpec}.
|
|
|
|
# This is required instead of using a conditional.
|
|
|
|
# It is preferrable to also pull the {url} and {.sha256} into the block if one is added.
|
|
|
|
#
|
|
|
|
# <pre>stable do
|
|
|
|
# url "https://example.com/foo-1.0.tar.gz"
|
|
|
|
# sha256 "2a2ba417eebaadcb4418ee7b12fe2998f26d6e6f7fda7983412ff66a741ab6f7"
|
|
|
|
#
|
|
|
|
# depends_on "libxml2"
|
|
|
|
# depends_on "libffi"
|
|
|
|
# end</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def stable(&block)
|
Eagerly initialize formula specs
Declarations of dependencies, options, and resources in the DSL only
apply to specs that have already been initialized. For example, given
this snippet:
url ...
sha1 ...
depends_on 'foo'
devel do
url ...
sha1 ...
end
The dependency 'foo' will be recorded for the stable spec, but not the
devel spec, since it was not initialized prior to the call to
depends_on.
While it is considered best practice to declare all specs (stable,
devel, head, and bottle) prior to other declarations, there is nothing
that enforces this ordering, so when it happens it can be confusing and
hard to debug.
To prevent this, we can initialize all specs up front. This comes with
a performance penalty for commands that load all formulae into memory,
but that is probably outweighed by what we gain in correctness.
Fixes Homebrew/homebrew#23425.
2013-10-22 13:07:08 -05:00
|
|
|
@stable ||= SoftwareSpec.new
|
2012-04-05 21:09:24 -05:00
|
|
|
return @stable unless block_given?
|
2013-09-12 19:43:22 -05:00
|
|
|
@stable.instance_eval(&block)
|
2012-01-22 22:32:15 -06:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @!attribute [w] devel
|
|
|
|
# Adds a {.devel} {SoftwareSpec}.
|
|
|
|
# This can be installed by passing the `--devel` option to allow
|
|
|
|
# installing non-stable (e.g. beta) versions of software.
|
|
|
|
#
|
|
|
|
# <pre>devel do
|
|
|
|
# url "https://example.com/archive-2.0-beta.tar.gz"
|
|
|
|
# sha256 "2a2ba417eebaadcb4418ee7b12fe2998f26d6e6f7fda7983412ff66a741ab6f7"
|
|
|
|
#
|
|
|
|
# depends_on "cairo"
|
|
|
|
# depends_on "pixman"
|
|
|
|
# end</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def devel(&block)
|
Eagerly initialize formula specs
Declarations of dependencies, options, and resources in the DSL only
apply to specs that have already been initialized. For example, given
this snippet:
url ...
sha1 ...
depends_on 'foo'
devel do
url ...
sha1 ...
end
The dependency 'foo' will be recorded for the stable spec, but not the
devel spec, since it was not initialized prior to the call to
depends_on.
While it is considered best practice to declare all specs (stable,
devel, head, and bottle) prior to other declarations, there is nothing
that enforces this ordering, so when it happens it can be confusing and
hard to debug.
To prevent this, we can initialize all specs up front. This comes with
a performance penalty for commands that load all formulae into memory,
but that is probably outweighed by what we gain in correctness.
Fixes Homebrew/homebrew#23425.
2013-10-22 13:07:08 -05:00
|
|
|
@devel ||= SoftwareSpec.new
|
2012-04-05 21:09:24 -05:00
|
|
|
return @devel unless block_given?
|
|
|
|
@devel.instance_eval(&block)
|
|
|
|
end
|
2012-03-18 20:37:10 +13:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @!attribute [w] head
|
|
|
|
# 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 {#patch}es just to the {.head} {SoftwareSpec}.
|
|
|
|
# The download strategies (e.g. `:using =>`) are the same as for {url}.
|
|
|
|
# `master` is the default branch and doesn't need stating with a `:branch` parameter.
|
|
|
|
# <pre>head "https://we.prefer.https.over.git.example.com/.git"</pre>
|
|
|
|
# <pre>head "https://example.com/.git", :branch => "name_of_branch", :revision => "abc123"</pre>
|
|
|
|
# or (if autodetect fails):
|
|
|
|
# <pre>head "https://hg.is.awesome.but.git.has.won.example.com/", :using => :hg</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def head(val = nil, specs = {}, &block)
|
Eagerly initialize formula specs
Declarations of dependencies, options, and resources in the DSL only
apply to specs that have already been initialized. For example, given
this snippet:
url ...
sha1 ...
depends_on 'foo'
devel do
url ...
sha1 ...
end
The dependency 'foo' will be recorded for the stable spec, but not the
devel spec, since it was not initialized prior to the call to
depends_on.
While it is considered best practice to declare all specs (stable,
devel, head, and bottle) prior to other declarations, there is nothing
that enforces this ordering, so when it happens it can be confusing and
hard to debug.
To prevent this, we can initialize all specs up front. This comes with
a performance penalty for commands that load all formulae into memory,
but that is probably outweighed by what we gain in correctness.
Fixes Homebrew/homebrew#23425.
2013-10-22 13:07:08 -05:00
|
|
|
@head ||= HeadSoftwareSpec.new
|
2013-09-13 11:13:12 -05:00
|
|
|
if block_given?
|
|
|
|
@head.instance_eval(&block)
|
|
|
|
elsif val
|
|
|
|
@head.url(val, specs)
|
|
|
|
else
|
|
|
|
@head
|
|
|
|
end
|
2012-04-05 21:09:24 -05:00
|
|
|
end
|
2012-03-18 20:37:10 +13:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# Additional downloads can be defined as resources and accessed in the
|
|
|
|
# install method. Resources can also be defined inside a stable, devel, or
|
|
|
|
# head block. This mechanism replaces ad-hoc "subformula" classes.
|
|
|
|
# <pre>resource "additional_files" do
|
|
|
|
# url "https://example.com/additional-stuff.tar.gz"
|
|
|
|
# sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
|
|
|
|
# end</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def resource(name, klass = Resource, &block)
|
2013-09-17 21:25:40 -05:00
|
|
|
specs.each do |spec|
|
2014-06-02 23:32:42 -07:00
|
|
|
spec.resource(name, klass, &block) unless spec.resource_defined?(name)
|
2013-09-17 21:25:40 -05:00
|
|
|
end
|
2013-08-06 19:52:58 -07:00
|
|
|
end
|
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
def go_resource(name, &block)
|
2015-04-02 21:43:28 -07:00
|
|
|
specs.each { |spec| spec.go_resource(name, &block) }
|
2014-06-02 23:32:42 -07:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# The dependencies for this formula. Use strings for the names of other
|
|
|
|
# formulae. Homebrew provides some :special dependencies for stuff that
|
|
|
|
# requires certain extra handling (often changing some ENV vars or
|
|
|
|
# deciding if to use the system provided version or not.)
|
|
|
|
# <pre># `:build` means this dep is only needed during build.
|
|
|
|
# depends_on "cmake" => :build</pre>
|
|
|
|
# <pre>depends_on "homebrew/dupes/tcl-tk" => :optional</pre>
|
|
|
|
# <pre># `:recommended` dependencies are built by default.
|
|
|
|
# # But a `--without-...` option is generated to opt-out.
|
|
|
|
# depends_on "readline" => :recommended</pre>
|
|
|
|
# <pre># `:optional` dependencies are NOT built by default.
|
|
|
|
# # But a `--with-...` options is generated.
|
|
|
|
# depends_on "glib" => :optional</pre>
|
|
|
|
# <pre># If you need to specify that another formula has to be built with/out
|
|
|
|
# # certain options (note, no `--` needed before the option):
|
|
|
|
# depends_on "zeromq" => "with-pgm"
|
|
|
|
# depends_on "qt" => ["with-qtdbus", "developer"] # Multiple options.</pre>
|
|
|
|
# <pre># Optional and enforce that boost is built with `--with-c++11`.
|
|
|
|
# depends_on "boost" => [:optional, "with-c++11"]</pre>
|
|
|
|
# <pre># If a dependency is only needed in certain cases:
|
|
|
|
# depends_on "sqlite" if MacOS.version == :leopard
|
|
|
|
# depends_on :xcode # If the formula really needs full Xcode.
|
2016-09-18 19:57:19 +01:00
|
|
|
# depends_on :macos => :lion # Needs at least OS X Lion (10.7).
|
2015-08-29 10:56:24 +01:00
|
|
|
# depends_on :arch => :intel # If this formula only builds on Intel architecture.
|
|
|
|
# depends_on :arch => :x86_64 # If this formula only builds on Intel x86 64-bit.
|
|
|
|
# depends_on :arch => :ppc # Only builds on PowerPC?
|
|
|
|
# depends_on :ld64 # Sometimes ld fails on `MacOS.version < :leopard`. Then use this.
|
2018-01-11 13:33:54 +00:00
|
|
|
# depends_on :x11 => :optional # X11/XQuartz components.
|
2015-08-29 10:56:24 +01:00
|
|
|
# depends_on :osxfuse # Permits the use of the upstream signed binary or our source package.
|
|
|
|
# depends_on :tuntap # Does the same thing as above. This is vital for Yosemite and above.
|
|
|
|
# <pre># It is possible to only depend on something if
|
|
|
|
# # `build.with?` or `build.without? "another_formula"`:
|
2018-01-11 21:05:14 +09:00
|
|
|
# depends_on "postgresql" if build.without? "sqlite"
|
2015-08-29 10:56:24 +01:00
|
|
|
#
|
2018-03-03 09:42:25 +00:00
|
|
|
# <pre># Python 3.x if the `--with-python` is given to `brew install example`
|
|
|
|
# depends_on "python3" => :optional</pre>
|
2018-01-11 13:33:54 +00:00
|
|
|
# <pre># Python 2.7:
|
2018-03-03 09:42:25 +00:00
|
|
|
# depends_on "python@2"</pre>
|
2018-01-11 13:33:54 +00:00
|
|
|
# <pre># Python 2.7 but use system Python where possible
|
2018-03-03 09:42:25 +00:00
|
|
|
# depends_on "python@2" if MacOS.version <= :snow_leopard</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def depends_on(dep)
|
2013-09-21 19:27:24 -05:00
|
|
|
specs.each { |spec| spec.depends_on(dep) }
|
2009-09-18 19:16:39 +01:00
|
|
|
end
|
2009-09-28 14:06:53 -07:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @!attribute [w] option
|
|
|
|
# Options can be used as arguments to `brew install`.
|
|
|
|
# To switch features on/off: `"with-something"` or `"with-otherthing"`.
|
|
|
|
# To use other software: `"with-other-software"` or `"without-foo"`
|
|
|
|
# Note, that for {.depends_on} that are `:optional` or `:recommended`, options
|
|
|
|
# are generated automatically.
|
|
|
|
#
|
|
|
|
# There are also some special options:
|
|
|
|
# - `:universal`: build a universal binary/library (e.g. on newer Intel Macs
|
|
|
|
# this means a combined x86_64/x86 binary/library).
|
|
|
|
# <pre>option "with-spam", "The description goes here without a dot at the end"</pre>
|
|
|
|
# <pre>option "with-qt", "Text here overwrites the autogenerated one from 'depends_on "qt" => :optional'"</pre>
|
|
|
|
# <pre>option :universal</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def option(name, description = "")
|
2013-09-21 19:27:24 -05:00
|
|
|
specs.each { |spec| spec.option(name, description) }
|
2012-07-30 11:32:56 -07:00
|
|
|
end
|
2012-11-25 15:06:41 +00:00
|
|
|
|
2015-12-06 22:18:16 +00:00
|
|
|
# @!attribute [w] deprecated_option
|
|
|
|
# Deprecated options are used to rename options and migrate users who used
|
|
|
|
# them to newer ones. They are mostly used for migrating non-`with` options
|
|
|
|
# (e.g. `enable-debug`) to `with` options (e.g. `with-debug`).
|
|
|
|
# <pre>deprecated_option "enable-debug" => "with-debug"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def deprecated_option(hash)
|
2014-10-16 13:01:05 +01:00
|
|
|
specs.each { |spec| spec.deprecated_option(hash) }
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# External patches can be declared using resource-style blocks.
|
|
|
|
# <pre>patch do
|
|
|
|
# url "https://example.com/example_patch.diff"
|
|
|
|
# sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
|
|
|
|
# end</pre>
|
|
|
|
#
|
|
|
|
# A strip level of `-p1` is assumed. It can be overridden using a symbol
|
|
|
|
# argument:
|
|
|
|
# <pre>patch :p0 do
|
|
|
|
# url "https://example.com/example_patch.diff"
|
|
|
|
# sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
|
|
|
|
# end</pre>
|
|
|
|
#
|
|
|
|
# Patches can be declared in stable, devel, and head blocks. This form is
|
|
|
|
# preferred over using conditionals.
|
|
|
|
# <pre>stable do
|
|
|
|
# patch do
|
|
|
|
# url "https://example.com/example_patch.diff"
|
|
|
|
# sha256 "c6bc3f48ce8e797854c4b865f6a8ff969867bbcaebd648ae6fd825683e59fef2"
|
|
|
|
# end
|
|
|
|
# end</pre>
|
|
|
|
#
|
|
|
|
# Embedded (`__END__`) patches are declared like so:
|
|
|
|
# <pre>patch :DATA
|
|
|
|
# patch :p0, :DATA</pre>
|
|
|
|
#
|
|
|
|
# Patches can also be embedded by passing a string. This makes it possible
|
|
|
|
# to provide multiple embedded patches while making only some of them
|
|
|
|
# conditional.
|
|
|
|
# <pre>patch :p0, "..."</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def patch(strip = :p1, src = nil, &block)
|
2014-07-29 16:06:07 -05:00
|
|
|
specs.each { |spec| spec.patch(strip, src, &block) }
|
2014-03-13 19:51:23 -05:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# Defines launchd plist handling.
|
|
|
|
#
|
|
|
|
# Does your plist need to be loaded at startup?
|
|
|
|
# <pre>plist_options :startup => true</pre>
|
|
|
|
#
|
|
|
|
# Or only when necessary or desired by the user?
|
|
|
|
# <pre>plist_options :manual => "foo"</pre>
|
|
|
|
#
|
|
|
|
# Or perhaps you'd like to give the user a choice? Ooh fancy.
|
2016-08-31 20:17:56 +01:00
|
|
|
# <pre>plist_options :startup => true, :manual => "foo start"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def plist_options(options)
|
2012-11-25 15:06:41 +00:00
|
|
|
@plist_startup = options[:startup]
|
|
|
|
@plist_manual = options[:manual]
|
|
|
|
end
|
2012-07-30 11:32:56 -07:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-06-09 13:44:59 -05:00
|
|
|
def conflicts
|
|
|
|
@conflicts ||= []
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# If this formula conflicts with another one.
|
2017-04-09 11:02:05 -04:00
|
|
|
# <pre>conflicts_with "imagemagick", :because => "because both install 'convert' binaries"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def conflicts_with(*names)
|
2016-09-20 22:03:08 +02:00
|
|
|
opts = names.last.is_a?(Hash) ? names.pop : {}
|
2013-08-29 19:03:34 -05:00
|
|
|
names.each { |name| conflicts << FormulaConflict.new(name, opts[:because]) }
|
2012-07-28 13:02:46 -03:00
|
|
|
end
|
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
def skip_clean(*paths)
|
2013-06-20 16:18:01 -05:00
|
|
|
paths.flatten!
|
2014-02-23 12:09:28 -08:00
|
|
|
# Specifying :all is deprecated and will become an error
|
2013-12-22 13:43:00 -06:00
|
|
|
skip_clean_paths.merge(paths)
|
2009-09-28 14:06:53 -07:00
|
|
|
end
|
2010-07-04 14:17:03 -07:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2009-09-29 23:51:37 +01:00
|
|
|
def skip_clean_paths
|
2013-06-20 16:25:58 -05:00
|
|
|
@skip_clean_paths ||= Set.new
|
2009-09-29 23:51:37 +01:00
|
|
|
end
|
2010-07-18 15:18:51 -07:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# Software that will not be sym-linked into the `brew --prefix` will only
|
|
|
|
# live in its Cellar. Other formulae can depend on it and then brew will
|
|
|
|
# add the necessary includes and libs (etc.) during the brewing of that
|
|
|
|
# other formula. But generally, keg_only formulae are not in your PATH
|
|
|
|
# and not seen by compilers if you build your own software outside of
|
2016-09-18 19:57:19 +01:00
|
|
|
# Homebrew. This way, we don't shadow software provided by macOS.
|
|
|
|
# <pre>keg_only :provided_by_macos</pre>
|
2015-08-29 10:56:24 +01:00
|
|
|
# <pre>keg_only "because I want it so"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def keg_only(reason, explanation = "")
|
2014-08-08 01:34:45 -05:00
|
|
|
@keg_only_reason = KegOnlyReason.new(reason, explanation)
|
2010-07-18 10:38:45 -07:00
|
|
|
end
|
2011-03-21 14:23:28 -07:00
|
|
|
|
2014-08-16 02:05:13 -05:00
|
|
|
# Pass :skip to this method to disable post-install stdlib checking
|
2015-08-03 13:09:07 +01:00
|
|
|
def cxxstdlib_check(check_type)
|
2014-08-16 02:05:13 -05:00
|
|
|
define_method(:skip_cxxstdlib_check?) { true } if check_type == :skip
|
2014-04-21 18:50:22 +01:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# Marks the {Formula} as failing with a particular compiler so it will fall back to others.
|
2013-09-28 12:21:16 -07:00
|
|
|
# For Apple compilers, this should be in the format:
|
2016-05-22 09:40:08 +01:00
|
|
|
# <pre>fails_with :clang do
|
2015-08-29 10:56:24 +01:00
|
|
|
# build 600
|
|
|
|
# cause "multiple configure and compile errors"
|
|
|
|
# end</pre>
|
|
|
|
#
|
2013-09-28 12:21:16 -07:00
|
|
|
# The block may be omitted, and if present the build may be omitted;
|
|
|
|
# if so, then the compiler will be blacklisted for *all* versions.
|
|
|
|
#
|
|
|
|
# `major_version` should be the major release number only, for instance
|
|
|
|
# '4.8' for the GCC 4.8 series (4.8.0, 4.8.1, etc.).
|
|
|
|
# If `version` or the block is omitted, then the compiler will be
|
|
|
|
# blacklisted for all compilers in that series.
|
|
|
|
#
|
|
|
|
# For example, if a bug is only triggered on GCC 4.8.1 but is not
|
|
|
|
# encountered on 4.8.2:
|
2014-01-04 12:49:48 +00:00
|
|
|
#
|
2015-08-29 10:56:24 +01:00
|
|
|
# <pre>fails_with :gcc => '4.8' do
|
2013-09-28 12:21:16 -07:00
|
|
|
# version '4.8.1'
|
2015-08-29 10:56:24 +01:00
|
|
|
# end</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def fails_with(compiler, &block)
|
2018-03-25 10:11:24 +01:00
|
|
|
odisabled "fails_with :llvm" if compiler == :llvm
|
2014-08-19 17:14:02 -05:00
|
|
|
specs.each { |spec| spec.fails_with(compiler, &block) }
|
2011-03-21 14:23:28 -07:00
|
|
|
end
|
2012-11-01 14:40:59 -05:00
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
def needs(*standards)
|
2014-08-19 17:14:02 -05:00
|
|
|
specs.each { |spec| spec.needs(*standards) }
|
2014-04-04 21:16:09 -07:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# Test (is required for new formula and makes us happy).
|
|
|
|
# @return [Boolean]
|
|
|
|
#
|
|
|
|
# The block will create, run in and delete a temporary directory.
|
|
|
|
#
|
|
|
|
# We are fine if the executable does not error out, so we know linking
|
|
|
|
# and building the software was ok.
|
|
|
|
# <pre>system bin/"foobar", "--version"</pre>
|
|
|
|
#
|
2017-10-15 02:28:32 +02:00
|
|
|
# <pre>(testpath/"test.file").write <<~EOS
|
2015-08-29 10:56:24 +01:00
|
|
|
# writing some test file, if you need to
|
|
|
|
# EOS
|
|
|
|
# assert_equal "OK", shell_output("test_command test.file").strip</pre>
|
|
|
|
#
|
|
|
|
# Need complete control over stdin, stdout?
|
|
|
|
# <pre>require "open3"
|
|
|
|
# Open3.popen3("#{bin}/example", "argument") do |stdin, stdout, _|
|
|
|
|
# stdin.write("some text")
|
|
|
|
# stdin.close
|
|
|
|
# assert_equal "result", stdout.read
|
|
|
|
# end</pre>
|
|
|
|
#
|
|
|
|
# The test will fail if it returns false, or if an exception is raised.
|
|
|
|
# Failed assertions and failed `system` commands will raise exceptions.
|
2015-08-03 13:09:07 +01:00
|
|
|
def test(&block)
|
2014-09-18 14:16:07 -05:00
|
|
|
define_method(:test, &block)
|
2012-11-01 14:40:59 -05:00
|
|
|
end
|
2015-08-23 16:35:51 +08:00
|
|
|
|
2016-01-09 11:06:17 +00:00
|
|
|
# Defines whether the {Formula}'s bottle can be used on the given Homebrew
|
|
|
|
# installation.
|
|
|
|
#
|
|
|
|
# For example, if the bottle requires the Xcode CLT to be installed a
|
|
|
|
# {Formula} would declare:
|
|
|
|
# <pre>pour_bottle? do
|
|
|
|
# reason "The bottle needs the Xcode CLT to be installed."
|
|
|
|
# satisfy { MacOS::CLT.installed? }
|
|
|
|
# end</pre>
|
|
|
|
#
|
|
|
|
# If `satisfy` returns `false` then a bottle will not be used and instead
|
|
|
|
# the {Formula} will be built from source and `reason` will be printed.
|
|
|
|
def pour_bottle?(&block)
|
|
|
|
@pour_bottle_check = PourBottleCheck.new(self)
|
|
|
|
@pour_bottle_check.instance_eval(&block)
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-23 16:35:51 +08:00
|
|
|
def link_overwrite(*paths)
|
|
|
|
paths.flatten!
|
|
|
|
link_overwrite_paths.merge(paths)
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-23 16:35:51 +08:00
|
|
|
def link_overwrite_paths
|
|
|
|
@link_overwrite_paths ||= Set.new
|
|
|
|
end
|
2009-09-28 14:06:53 -07:00
|
|
|
end
|
2009-07-24 15:10:01 +01:00
|
|
|
end
|