2015-08-03 13:09:07 +01:00
|
|
|
require "formula_support"
|
|
|
|
require "formula_lock"
|
|
|
|
require "formula_pin"
|
|
|
|
require "hardware"
|
|
|
|
require "bottles"
|
|
|
|
require "build_environment"
|
|
|
|
require "build_options"
|
|
|
|
require "formulary"
|
|
|
|
require "software_spec"
|
|
|
|
require "install_renamed"
|
|
|
|
require "pkg_version"
|
|
|
|
require "tap"
|
2015-12-19 19:10:22 +08:00
|
|
|
require "core_formula_repository"
|
2015-08-09 14:46:07 +03:00
|
|
|
require "formula_renames"
|
2015-08-23 16:35:51 +08:00
|
|
|
require "keg"
|
2015-11-27 17:58:16 +00:00
|
|
|
require "migrator"
|
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
|
|
|
|
# @see http://www.rubydoc.info/github/Homebrew/homebrew/file/share/doc/homebrew/Formula-Cookbook.md Formula Cookbook
|
|
|
|
# @see https://github.com/styleguide/ruby Ruby Style Guide
|
|
|
|
#
|
|
|
|
# <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
|
2014-06-22 15:00:15 -05:00
|
|
|
extend Enumerable
|
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
|
|
|
|
|
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
|
|
|
|
|
2014-12-06 11:26:43 +00:00
|
|
|
# The full path to this {Formula}.
|
|
|
|
# e.g. `/usr/local/Library/Formula/this-formula.rb`
|
|
|
|
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
|
|
|
|
|
|
|
|
# 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
|
|
|
|
|
|
|
# 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
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# @private
|
2014-06-19 21:35:46 -05:00
|
|
|
def initialize(name, path, spec)
|
2012-03-09 10:18:12 -08:00
|
|
|
@name = name
|
2014-02-21 20:07:41 -05:00
|
|
|
@path = path
|
2014-03-05 20:12:51 -06:00
|
|
|
@revision = self.class.revision || 0
|
2013-04-13 17:40:12 -05:00
|
|
|
|
2015-12-06 22:16:08 +08:00
|
|
|
if path == Formulary.core_path(name)
|
|
|
|
@tap = CoreFormulaRepository.instance
|
|
|
|
@full_name = name
|
|
|
|
elsif path.to_s =~ HOMEBREW_TAP_PATH_REGEX
|
|
|
|
@tap = Tap.fetch($1, $2)
|
|
|
|
@full_name = "#{@tap}/#{name}"
|
2015-05-27 20:30:43 +08:00
|
|
|
else
|
2015-12-06 22:16:08 +08:00
|
|
|
@tap = nil
|
2015-05-27 20:30:43 +08:00
|
|
|
@full_name = name
|
|
|
|
end
|
|
|
|
|
2013-04-13 17:40:12 -05:00
|
|
|
set_spec :stable
|
|
|
|
set_spec :devel
|
|
|
|
set_spec :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)
|
2012-04-05 21:09:24 -05:00
|
|
|
end
|
|
|
|
|
2015-07-30 16:25:21 +08:00
|
|
|
# @private
|
|
|
|
def set_active_spec(spec_sym)
|
|
|
|
spec = send(spec_sym)
|
|
|
|
raise FormulaSpecificationError, "#{spec_sym} spec is not available for #{full_name}" unless spec
|
|
|
|
@active_spec = spec
|
|
|
|
@active_spec_sym = spec_sym
|
|
|
|
validate_attributes!
|
|
|
|
@build = active_spec.build
|
|
|
|
end
|
|
|
|
|
2014-12-06 11:27:17 +00:00
|
|
|
private
|
|
|
|
|
2013-04-13 17:40:12 -05:00
|
|
|
def set_spec(name)
|
|
|
|
spec = self.class.send(name)
|
2014-03-10 14:56:02 -05:00
|
|
|
if spec.url
|
2013-09-17 21:25:38 -05:00
|
|
|
spec.owner = self
|
2013-04-13 17:40:12 -05:00
|
|
|
instance_variable_set("@#{name}", spec)
|
|
|
|
end
|
|
|
|
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
|
|
|
|
if val.nil? || val.empty? || val =~ /\s/
|
2015-10-14 14:42:34 +02:00
|
|
|
raise FormulaValidationError.new(full_name, :version, val)
|
2013-04-13 17:40:12 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-12-06 11:27:17 +00:00
|
|
|
public
|
|
|
|
|
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
|
|
|
|
|
2015-09-14 19:51:04 +08:00
|
|
|
# @private
|
|
|
|
def bottle_unneeded?
|
|
|
|
active_spec.bottle_unneeded?
|
|
|
|
end
|
|
|
|
|
|
|
|
# @private
|
|
|
|
def bottle_disabled?
|
|
|
|
active_spec.bottle_disabled?
|
|
|
|
end
|
|
|
|
|
|
|
|
# @private
|
|
|
|
def bottle_disable_reason
|
|
|
|
active_spec.bottle_disable_reason
|
|
|
|
end
|
|
|
|
|
2015-11-01 20:33:24 +08:00
|
|
|
# Does the currently active {SoftwareSpec} has any bottle?
|
|
|
|
# @private
|
|
|
|
def bottle_defined?
|
|
|
|
active_spec.bottle_defined?
|
|
|
|
end
|
|
|
|
|
|
|
|
# Does the currently active {SoftwareSpec} has an installable bottle?
|
2015-01-20 22:25:24 -05:00
|
|
|
# @private
|
|
|
|
def bottled?
|
|
|
|
active_spec.bottled?
|
|
|
|
end
|
|
|
|
|
|
|
|
# @private
|
|
|
|
def bottle_specification
|
|
|
|
active_spec.bottle_specification
|
|
|
|
end
|
|
|
|
|
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.
|
|
|
|
# @see .desc
|
|
|
|
def desc
|
|
|
|
self.class.desc
|
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The homepage for the software.
|
|
|
|
# @see .homepage
|
2014-08-08 10:53:00 -05:00
|
|
|
def homepage
|
|
|
|
self.class.homepage
|
|
|
|
end
|
|
|
|
|
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.
|
|
|
|
# @see .version
|
|
|
|
def version
|
|
|
|
active_spec.version
|
|
|
|
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
|
|
|
|
|
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>
|
2013-08-06 19:52:58 -07:00
|
|
|
def resource(name)
|
2013-09-17 21:25:39 -05:00
|
|
|
active_spec.resource(name)
|
2013-08-06 19:52:58 -07:00
|
|
|
end
|
|
|
|
|
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
|
2015-08-09 14:46:07 +03:00
|
|
|
if formula_renames.value?(name)
|
|
|
|
formula_renames.to_a.rassoc(name).first
|
|
|
|
end
|
|
|
|
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
|
|
|
|
tap.alias_reverse_table[full_name] || []
|
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}.
|
2013-08-06 19:52:58 -07:00
|
|
|
def resources
|
2013-09-17 21:25:39 -05:00
|
|
|
active_spec.resources.values
|
2013-08-06 19:52:58 -07:00
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The {Dependency}s for the currently active {SoftwareSpec}.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-09-21 19:27:24 -05:00
|
|
|
def deps
|
|
|
|
active_spec.deps
|
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The {Requirement}s for the currently active {SoftwareSpec}.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2013-09-21 19:27:24 -05:00
|
|
|
def requirements
|
|
|
|
active_spec.requirements
|
|
|
|
end
|
|
|
|
|
2014-12-26 16:07:32 -05:00
|
|
|
# The cached download for the currently active {SoftwareSpec}.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-02-21 00:41:07 -05:00
|
|
|
def cached_download
|
2014-02-21 00:41:07 -05:00
|
|
|
active_spec.cached_download
|
2014-02-21 00:41:07 -05:00
|
|
|
end
|
|
|
|
|
2014-12-26 16:07:32 -05:00
|
|
|
# Deletes the download for the currently active {SoftwareSpec}.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-02-21 00:41:07 -05:00
|
|
|
def clear_cache
|
2014-02-21 00:41:07 -05:00
|
|
|
active_spec.clear_cache
|
2014-02-21 00:41:07 -05:00
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The list of patches for the currently active {SoftwareSpec}.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-03-13 19:51:23 -05:00
|
|
|
def patchlist
|
|
|
|
active_spec.patches
|
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The options for the currently active {SoftwareSpec}.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-08-10 21:45:24 -05:00
|
|
|
def options
|
|
|
|
active_spec.options
|
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# The deprecated options for the currently active {SoftwareSpec}.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-10-16 13:01:05 +01:00
|
|
|
def deprecated_options
|
|
|
|
active_spec.deprecated_options
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# The deprecated option flags for the currently active {SoftwareSpec}.
|
|
|
|
# @private
|
2014-12-27 14:26:56 -05:00
|
|
|
def deprecated_flags
|
|
|
|
active_spec.deprecated_flags
|
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# If a named option is defined for the currently active {SoftwareSpec}.
|
2014-07-31 19:37:39 -05:00
|
|
|
def option_defined?(name)
|
|
|
|
active_spec.option_defined?(name)
|
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# All the {.fails_with} for the currently active {SoftwareSpec}.
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-09-18 15:50:54 -05:00
|
|
|
def compiler_failures
|
|
|
|
active_spec.compiler_failures
|
2014-08-19 17:14:02 -05:00
|
|
|
end
|
|
|
|
|
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?
|
2013-04-09 19:40:08 -05:00
|
|
|
(dir = installed_prefix).directory? && dir.children.length > 0
|
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?
|
|
|
|
require "tab"
|
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
|
2014-12-26 20:24:12 +00:00
|
|
|
# The `LinkedKegs` 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
|
2013-04-15 15:00:57 -05:00
|
|
|
Pathname.new("#{HOMEBREW_LIBRARY}/LinkedKegs/#{name}")
|
2012-01-14 20:03:30 -06: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
|
2015-07-30 15:58:20 +08:00
|
|
|
if head && (head_prefix = prefix(PkgVersion.new(head.version, revision))).directory?
|
2010-09-24 11:55:21 -05:00
|
|
|
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.
|
|
|
|
# This directory contains the formula's name and version.
|
2015-08-03 13:09:07 +01:00
|
|
|
def prefix(v = pkg_version)
|
2013-05-25 18:31:49 -05:00
|
|
|
Pathname.new("#{HOMEBREW_CELLAR}/#{name}/#{v}")
|
2010-02-19 21:55:17 -08:00
|
|
|
end
|
2015-04-12 21:49:01 -07:00
|
|
|
|
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
|
|
|
|
prefix.parent
|
|
|
|
end
|
2010-02-19 21:55:17 -08:00
|
|
|
|
2015-11-29 15:13:56 +08:00
|
|
|
# All of current installed prefix directories.
|
|
|
|
# @private
|
|
|
|
def installed_prefixes
|
|
|
|
rack.directory? ? rack.subdirs : []
|
|
|
|
end
|
|
|
|
|
|
|
|
# All of current installed kegs.
|
|
|
|
# @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
|
|
|
|
prefix+"bin"
|
|
|
|
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
|
|
|
|
share+"doc"+name
|
|
|
|
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
|
|
|
|
prefix+"include"
|
|
|
|
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
|
|
|
|
share+"info"
|
|
|
|
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
|
|
|
|
prefix+"lib"
|
|
|
|
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
|
|
|
|
prefix+"libexec"
|
|
|
|
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
|
|
|
|
share+"man"
|
|
|
|
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
|
|
|
|
man+"man1"
|
|
|
|
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
|
|
|
|
man+"man2"
|
|
|
|
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
|
|
|
|
man+"man3"
|
|
|
|
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
|
|
|
|
man+"man4"
|
|
|
|
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
|
|
|
|
man+"man5"
|
|
|
|
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
|
|
|
|
man+"man6"
|
|
|
|
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
|
|
|
|
man+"man7"
|
|
|
|
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
|
|
|
|
man+"man8"
|
|
|
|
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
|
|
|
|
prefix+"sbin"
|
|
|
|
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
|
|
|
|
prefix+"share"
|
|
|
|
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
|
|
|
|
prefix+"share"+name
|
|
|
|
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
|
|
|
|
prefix+"share/emacs/site-lisp"+name
|
|
|
|
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
|
|
|
|
prefix+"Frameworks"
|
|
|
|
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
|
|
|
|
prefix+"Library/Extensions"
|
|
|
|
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
|
|
|
|
(HOMEBREW_PREFIX+"etc").extend(InstallRenamed)
|
|
|
|
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
|
|
|
|
HOMEBREW_PREFIX+"var"
|
|
|
|
end
|
2010-04-06 13:13:50 -07:00
|
|
|
|
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
|
|
|
|
prefix+"etc/bash_completion.d"
|
|
|
|
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
|
|
|
|
share+"zsh/site-functions"
|
|
|
|
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
|
|
|
|
share+"fish/vendor_completions.d"
|
|
|
|
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
|
|
|
|
prefix+".bottle"
|
|
|
|
end
|
2013-10-05 20:29:19 +01:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# The directory where the formula's installation logs will be written.
|
|
|
|
# @private
|
2015-04-25 22:07:06 -04:00
|
|
|
def logs
|
|
|
|
HOMEBREW_LOGS+name
|
|
|
|
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
|
|
|
|
# <pre>def plist; <<-EOS.undent
|
|
|
|
# <?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
# <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
|
|
# <plist version="1.0">
|
|
|
|
# <dict>
|
|
|
|
# <key>Label</key>
|
|
|
|
# <string>#{plist_name}</string>
|
|
|
|
# <key>ProgramArguments</key>
|
|
|
|
# <array>
|
|
|
|
# <string>#{opt_bin}/example</string>
|
|
|
|
# <string>--do-this</string>
|
|
|
|
# </array>
|
|
|
|
# <key>RunAtLoad</key>
|
|
|
|
# <true/>
|
|
|
|
# <key>KeepAlive</key>
|
|
|
|
# <true/>
|
|
|
|
# <key>StandardErrorPath</key>
|
|
|
|
# <string>/dev/null</string>
|
|
|
|
# <key>StandardOutPath</key>
|
|
|
|
# <string>/dev/null</string>
|
|
|
|
# </plist>
|
|
|
|
# EOS
|
|
|
|
#end</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def plist
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
alias_method :startup_plist, :plist
|
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
|
|
|
|
"homebrew.mxcl."+name
|
|
|
|
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
|
|
|
|
prefix+(plist_name+".plist")
|
|
|
|
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
|
|
|
|
opt_prefix+"bin"
|
|
|
|
end
|
|
|
|
|
|
|
|
def opt_include
|
|
|
|
opt_prefix+"include"
|
|
|
|
end
|
|
|
|
|
|
|
|
def opt_lib
|
|
|
|
opt_prefix+"lib"
|
|
|
|
end
|
|
|
|
|
|
|
|
def opt_libexec
|
|
|
|
opt_prefix+"libexec"
|
|
|
|
end
|
|
|
|
|
|
|
|
def opt_sbin
|
|
|
|
opt_prefix+"sbin"
|
|
|
|
end
|
|
|
|
|
|
|
|
def opt_share
|
|
|
|
opt_prefix+"share"
|
|
|
|
end
|
|
|
|
|
|
|
|
def opt_pkgshare
|
|
|
|
opt_prefix+"share"+name
|
|
|
|
end
|
|
|
|
|
2015-10-31 21:45:40 -07:00
|
|
|
def opt_elisp
|
|
|
|
opt_prefix+"share/emacs/site-lisp"+name
|
|
|
|
end
|
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
def opt_frameworks
|
|
|
|
opt_prefix+"Frameworks"
|
|
|
|
end
|
2014-03-05 21:01:24 -08:00
|
|
|
|
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.
|
2015-08-03 13:09:07 +01:00
|
|
|
def pour_bottle?
|
|
|
|
true
|
|
|
|
end
|
2013-01-27 19:22:56 +00:00
|
|
|
|
2013-04-01 20:33:12 +01:00
|
|
|
# Can be overridden to run commands on both source and bottle installation.
|
|
|
|
def post_install; end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-01-12 21:57:18 -05:00
|
|
|
def post_install_defined?
|
|
|
|
method(:post_install).owner == self.class
|
|
|
|
end
|
|
|
|
|
2015-02-06 22:36:53 -05:00
|
|
|
# @private
|
|
|
|
def run_post_install
|
2015-02-06 22:38:34 -05:00
|
|
|
build, self.build = self.build, Tab.for_formula(self)
|
2015-02-06 22:36:53 -05:00
|
|
|
post_install
|
2015-02-06 22:38:34 -05:00
|
|
|
ensure
|
|
|
|
self.build = build
|
2015-02-06 22:36:53 -05:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# Tell the user about any caveats regarding this package.
|
|
|
|
# @return [String]
|
|
|
|
# <pre>def caveats
|
|
|
|
# <<-EOS.undent
|
|
|
|
# Are optional. Something the user should know?
|
|
|
|
# EOS
|
|
|
|
# end</pre>
|
|
|
|
#
|
|
|
|
# <pre>def caveats
|
|
|
|
# s = <<-EOS.undent
|
|
|
|
# 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?
|
2014-08-16 15:40:58 -05:00
|
|
|
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.
|
|
|
|
return false unless path.stat.uid == File.stat(HOMEBREW_BREW_FILE).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)
|
2015-08-23 16:35:51 +08:00
|
|
|
rescue NotAKegError, Errno::ENOENT
|
|
|
|
# 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)
|
|
|
|
rescue FormulaUnavailableError
|
|
|
|
# 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("/") + "/") ||
|
|
|
|
/^#{Regexp.escape(p).gsub('\*', ".*?")}$/ === to_check
|
|
|
|
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
|
2015-01-22 17:04:38 -05:00
|
|
|
unless patchlist.empty?
|
|
|
|
ohai "Patching"
|
|
|
|
patchlist.each(&:apply)
|
|
|
|
end
|
2014-12-26 17:44:44 -05:00
|
|
|
end
|
|
|
|
|
2009-08-10 16:48:30 +01:00
|
|
|
# yields self with current working directory set to the uncompressed tarball
|
2014-12-26 20:24:12 +00:00
|
|
|
# @private
|
2009-08-10 16:48:30 +01:00
|
|
|
def brew
|
2009-08-11 12:20:55 -07:00
|
|
|
stage do
|
2014-12-26 17:44:44 -05:00
|
|
|
prepare_patches
|
|
|
|
|
2009-08-10 16:48:30 +01:00
|
|
|
begin
|
|
|
|
yield self
|
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
|
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
|
2015-08-18 19:33:24 +08:00
|
|
|
if oldname && (oldname_rack = HOMEBREW_CELLAR/oldname).exist? && oldname_rack.resolved_path == rack
|
|
|
|
@oldname_lock = FormulaLock.new(oldname)
|
|
|
|
@oldname_lock.lock
|
|
|
|
end
|
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
|
2013-02-09 18:19:50 -06:00
|
|
|
@lock.unlock unless @lock.nil?
|
2015-08-18 19:33:24 +08:00
|
|
|
@oldname_lock.unlock unless @oldname_lock.nil?
|
2013-01-23 00:26:25 -06:00
|
|
|
end
|
|
|
|
|
2015-11-27 15:11:00 +00:00
|
|
|
# @private
|
|
|
|
def outdated_versions
|
|
|
|
@outdated_versions ||= begin
|
|
|
|
all_versions = []
|
|
|
|
older_or_same_tap_versions = []
|
|
|
|
|
|
|
|
if oldname && !rack.exist? && (dir = HOMEBREW_CELLAR/oldname).directory? &&
|
|
|
|
!dir.subdirs.empty? && tap == Tab.for_keg(dir.subdirs.first).tap
|
2015-11-27 20:43:13 +00:00
|
|
|
raise Migrator::MigrationNeededError.new(self)
|
2015-11-27 15:11:00 +00:00
|
|
|
end
|
|
|
|
|
2015-11-29 15:22:22 +08:00
|
|
|
installed_kegs.each do |keg|
|
2015-11-27 15:11:00 +00:00
|
|
|
version = keg.version
|
|
|
|
all_versions << version
|
|
|
|
older_version = pkg_version <= version
|
|
|
|
|
|
|
|
tab_tap = Tab.for_keg(keg).tap
|
|
|
|
if tab_tap.nil? || tab_tap == tap || older_version
|
|
|
|
older_or_same_tap_versions << version
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if older_or_same_tap_versions.all? { |v| pkg_version > v }
|
|
|
|
all_versions
|
|
|
|
else
|
|
|
|
[]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# @private
|
|
|
|
def outdated?
|
|
|
|
outdated_versions.any?
|
|
|
|
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
|
2013-10-04 21:19:15 -05:00
|
|
|
alias_method :eql?, :==
|
|
|
|
|
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)
|
|
|
|
return unless Formula === other
|
|
|
|
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
|
2012-05-29 16:58:32 -07:00
|
|
|
%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
|
|
|
|
]
|
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
|
2015-12-06 21:41:06 +08:00
|
|
|
CoreFormulaRepository.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
|
2015-12-06 21:41:06 +08:00
|
|
|
CoreFormulaRepository.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
|
2015-08-06 17:12:35 +08:00
|
|
|
@tap_names ||= 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
|
2015-08-06 17:12:35 +08:00
|
|
|
@tap_files ||= 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
|
|
|
|
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|
|
|
|
|
rack.symlink? || rack.subdirs.empty?
|
|
|
|
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
|
|
|
|
@installed ||= racks.map do |rack|
|
|
|
|
begin
|
|
|
|
Formulary.from_rack(rack)
|
2015-10-07 17:34:29 +08:00
|
|
|
rescue FormulaUnavailableError, TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError
|
2015-08-13 20:35:22 +08:00
|
|
|
end
|
|
|
|
end.compact
|
|
|
|
end
|
|
|
|
|
2015-09-27 15:57:37 +08:00
|
|
|
# an array of all alias files of core {Formula}
|
|
|
|
# @private
|
|
|
|
def self.core_alias_files
|
2015-12-06 21:41:06 +08:00
|
|
|
CoreFormulaRepository.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
|
2015-12-06 21:41:06 +08:00
|
|
|
CoreFormulaRepository.instance.aliases
|
2015-09-12 19:14:38 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
# an array of all tap aliases
|
|
|
|
# @private
|
|
|
|
def self.tap_aliases
|
|
|
|
@tap_aliases ||= Tap.flat_map(&:aliases).sort
|
|
|
|
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
|
2015-12-06 21:41:06 +08:00
|
|
|
CoreFormulaRepository.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
|
2015-12-06 21:41:06 +08:00
|
|
|
CoreFormulaRepository.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?
|
|
|
|
tap && tap.core_formula_repository?
|
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?
|
|
|
|
tap && !tap.core_formula_repository?
|
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 = {})
|
2014-10-19 13:54:00 +01:00
|
|
|
if tap?
|
|
|
|
verb = options[:verb] || "Installing"
|
|
|
|
ohai "#{verb} #{name} from #{tap}"
|
|
|
|
end
|
|
|
|
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
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2012-08-15 22:08:40 -05:00
|
|
|
def to_hash
|
|
|
|
hsh = {
|
|
|
|
"name" => name,
|
2015-05-27 20:30:43 +08:00
|
|
|
"full_name" => full_name,
|
2015-05-19 13:06:06 -04:00
|
|
|
"desc" => desc,
|
2012-08-15 22:08:40 -05:00
|
|
|
"homepage" => homepage,
|
2015-08-09 14:46:07 +03:00
|
|
|
"oldname" => oldname,
|
2015-10-07 18:51:02 +08:00
|
|
|
"aliases" => aliases,
|
2012-08-15 22:08:40 -05:00
|
|
|
"versions" => {
|
|
|
|
"stable" => (stable.version.to_s if stable),
|
2013-05-05 10:55:39 -05:00
|
|
|
"bottle" => bottle ? true : false,
|
2012-08-15 22:08:40 -05:00
|
|
|
"devel" => (devel.version.to_s if devel),
|
|
|
|
"head" => (head.version.to_s if head)
|
|
|
|
},
|
2014-03-28 20:41:02 -05:00
|
|
|
"revision" => revision,
|
2012-08-15 22:08:40 -05:00
|
|
|
"installed" => [],
|
2014-04-05 12:17:19 -05:00
|
|
|
"linked_keg" => (linked_keg.resolved_path.basename.to_s if linked_keg.exist?),
|
2015-11-27 15:11:00 +00:00
|
|
|
"pinned" => pinned?,
|
|
|
|
"outdated" => outdated?,
|
2012-08-15 22:08:40 -05:00
|
|
|
"keg_only" => keg_only?,
|
cmd/info: prevent duplicate dependency display.
Before:
$ brew info llvm
==> Dependencies
Build: xz ✔, xz ✔, xz ✔, xz ✔, xz ✔, xz ✔
$ brew info --json=v1 llvm
... "dependencies":["xz","xz","xz","xz","xz","xz"], ...
After
$ brew info llvm
==> Dependencies
Build: xz ✔
$ brew info --json=v1 llvm
... "dependencies":["xz"], ...
Closes Homebrew/homebrew#36653.
Signed-off-by: Mike McQuaid <mike@mikemcquaid.com>
2015-02-08 23:20:45 +08:00
|
|
|
"dependencies" => deps.map(&:name).uniq,
|
2013-06-09 15:20:09 -05:00
|
|
|
"conflicts_with" => conflicts.map(&:name),
|
2012-08-15 22:08:40 -05:00
|
|
|
"caveats" => caveats
|
|
|
|
}
|
|
|
|
|
2015-06-06 19:56:46 +08:00
|
|
|
hsh["requirements"] = requirements.map do |req|
|
|
|
|
{
|
|
|
|
"name" => req.name,
|
|
|
|
"default_formula" => req.default_formula,
|
|
|
|
"cask" => req.cask,
|
|
|
|
"download" => req.download
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
hsh["options"] = options.map do |opt|
|
2014-03-28 20:42:55 -05:00
|
|
|
{ "option" => opt.flag, "description" => opt.description }
|
2015-08-03 13:09:07 +01:00
|
|
|
end
|
2012-08-15 22:08:40 -05:00
|
|
|
|
2015-09-13 12:59:13 +08:00
|
|
|
hsh["bottle"] = {}
|
|
|
|
%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 = {
|
|
|
|
"revision" => bottle_spec.revision,
|
|
|
|
"cellar" => (cellar = bottle_spec.cellar).is_a?(Symbol) ? \
|
|
|
|
cellar.inspect : cellar,
|
|
|
|
"prefix" => bottle_spec.prefix,
|
|
|
|
"root_url" => bottle_spec.root_url,
|
|
|
|
}
|
|
|
|
bottle_info["files"] = {}
|
2015-12-26 23:00:38 +01: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] = {
|
|
|
|
"url" => "#{bottle_spec.root_url}/#{Bottle::Filename.create(self, os, bottle_spec.revision)}",
|
|
|
|
checksum.hash_type.to_s => checksum.hexdigest,
|
|
|
|
}
|
|
|
|
end
|
|
|
|
hsh["bottle"][spec_sym] = bottle_info
|
|
|
|
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,
|
2015-11-29 15:22:22 +08:00
|
|
|
"poured_from_bottle" => tab.poured_from_bottle
|
|
|
|
}
|
2012-08-15 22:08:40 -05:00
|
|
|
end
|
|
|
|
|
2015-11-29 15:22:22 +08:00
|
|
|
hsh["installed"] = hsh["installed"].sort_by { |i| Version.new(i["version"]) }
|
|
|
|
|
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
|
2015-02-06 22:33:01 -05:00
|
|
|
old_home = ENV["HOME"]
|
2015-02-06 22:38:34 -05:00
|
|
|
build, self.build = self.build, Tab.for_formula(self)
|
2013-06-05 09:47:08 -07:00
|
|
|
mktemp do
|
|
|
|
@testpath = Pathname.pwd
|
2015-01-08 20:58:57 +00:00
|
|
|
ENV["HOME"] = @testpath
|
2015-10-17 10:05:41 -07:00
|
|
|
setup_home @testpath
|
2014-09-18 14:16:07 -05:00
|
|
|
test
|
2013-06-05 09:47:08 -07:00
|
|
|
end
|
2014-09-18 14:16:07 -05:00
|
|
|
ensure
|
|
|
|
@testpath = nil
|
2015-02-06 22:38:34 -05:00
|
|
|
self.build = build
|
2015-02-06 22:33:01 -05:00
|
|
|
ENV["HOME"] = old_home
|
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
|
2014-09-18 14:16:07 -05:00
|
|
|
def test
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-10-19 01:14:32 -05:00
|
|
|
def test_fixtures(file)
|
|
|
|
HOMEBREW_LIBRARY.join("Homebrew", "test", "fixtures", file)
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# This method is overriden in {Formula} subclasses to provide the installation instructions.
|
|
|
|
# The sources (from {.url}) are downloaded, hash-checked and
|
|
|
|
# Homebrew changes into a temporary directory where the
|
|
|
|
# archive was unpacked or repository cloned.
|
|
|
|
# <pre>def install
|
|
|
|
# system "./configure", "--prefix=#{prefix}"
|
|
|
|
# system "make", "install"
|
|
|
|
# end</pre>
|
2014-12-06 11:27:03 +00:00
|
|
|
def install
|
|
|
|
end
|
|
|
|
|
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
|
|
|
|
(user_site_packages/"homebrew.pth").write <<-EOS.undent
|
|
|
|
import site; site.addsitedir("#{HOMEBREW_PREFIX}/lib/python2.7/site-packages")
|
|
|
|
import sys; sys.path.insert(0, "#{HOMEBREW_PREFIX}/lib/python2.7/site-packages")
|
|
|
|
EOS
|
|
|
|
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
|
2015-08-03 13:09:07 +01: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
|
2015-08-03 13:09:07 +01:00
|
|
|
logfn = "#{logs}/%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.
|
|
|
|
if (Time.now - last_dot) > 60
|
|
|
|
print "."
|
|
|
|
$stdout.flush
|
|
|
|
last_dot = Time.now
|
|
|
|
end
|
|
|
|
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
|
|
|
|
2014-09-05 15:36:08 -05:00
|
|
|
unless $?.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
|
|
|
|
|
|
|
require "cmd/config"
|
2015-11-13 16:43:43 +01:00
|
|
|
require "build_environment"
|
2014-12-30 23:47:07 -05:00
|
|
|
|
|
|
|
env = ENV.to_hash
|
|
|
|
|
2014-12-30 23:33:50 -05:00
|
|
|
Homebrew.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?
|
|
|
|
eligible_kegs = installed_kegs.select { |k| pkg_version > k.version }
|
|
|
|
if eligible_kegs.any? && eligible_for_cleanup?
|
|
|
|
eligible_kegs.each do |keg|
|
|
|
|
if keg.linked?
|
|
|
|
opoo "Skipping (old) #{keg} due to it being linked"
|
|
|
|
else
|
|
|
|
eligible_for_cleanup << keg
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
eligible_kegs.each { |keg| opoo "Skipping (old) keg-only: #{keg}" }
|
|
|
|
end
|
|
|
|
elsif installed_prefixes.any? && !pinned?
|
|
|
|
# If the cellar only has one version installed, don't complain
|
|
|
|
# that we can't tell which one to keep. Don't complain at all if the
|
|
|
|
# only installed version is a pinned formula.
|
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
|
|
|
|
|
|
|
|
# @private
|
|
|
|
def eligible_for_cleanup?
|
|
|
|
# It used to be the case that keg-only kegs could not be cleaned up, because
|
|
|
|
# older brews were built against the full path to the keg-only keg. Then we
|
|
|
|
# introduced the opt symlink, and built against that instead. So provided
|
|
|
|
# no brew exists that was built against an old-style keg-only keg, we can
|
|
|
|
# remove it.
|
|
|
|
if !keg_only? || ARGV.force?
|
|
|
|
true
|
|
|
|
elsif opt_prefix.directory?
|
|
|
|
# SHA records were added to INSTALL_RECEIPTS the same day as opt symlinks
|
|
|
|
Formula.installed.select do |f|
|
|
|
|
f.deps.any? do |d|
|
|
|
|
d.to_formula.full_name == full_name rescue d.name == name
|
|
|
|
end
|
|
|
|
end.all? { |f| f.installed_prefixes.all? { |keg| Tab.for_keg(keg).HEAD } }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-04-07 00:49:56 -05:00
|
|
|
private
|
2012-03-04 16:48:00 -08:00
|
|
|
|
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
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
# TODO: system "xcodebuild" is deprecated, this should be removed soon.
|
2014-09-05 15:13:52 -05:00
|
|
|
if cmd.to_s.start_with? "xcodebuild"
|
|
|
|
ENV.remove_cc_etc
|
|
|
|
end
|
|
|
|
|
|
|
|
# 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" }
|
2014-12-10 00:29:11 -08:00
|
|
|
if setup_py_in_args || setuptools_shim_in_args
|
|
|
|
ENV.refurbish_args
|
|
|
|
end
|
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)
|
2014-09-05 15:13:52 -05:00
|
|
|
exec(cmd, *args) rescue nil
|
|
|
|
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
|
2013-09-17 21:25:38 -05:00
|
|
|
active_spec.stage do
|
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
|
|
|
|
|
|
|
|
old_home, ENV["HOME"] = ENV["HOME"], env_home
|
2015-10-17 10:05:41 -07:00
|
|
|
setup_home env_home
|
2015-06-05 22:35:08 +01:00
|
|
|
|
|
|
|
begin
|
|
|
|
yield
|
|
|
|
ensure
|
|
|
|
@buildpath = nil
|
|
|
|
ENV["HOME"] = old_home
|
|
|
|
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
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
def self.method_added(method)
|
2013-01-07 17:34:56 -06:00
|
|
|
case method
|
|
|
|
when :brew
|
2013-06-06 16:36:12 -07:00
|
|
|
raise "You cannot override Formula#brew in class #{name}"
|
2013-01-07 17:34:56 -06:00
|
|
|
when :test
|
2014-08-16 17:44:22 -05:00
|
|
|
define_method(:test_defined?) { true }
|
2014-08-10 21:45:23 -05:00
|
|
|
when :options
|
|
|
|
instance = allocate
|
|
|
|
|
|
|
|
specs.each do |spec|
|
|
|
|
instance.options.each do |opt, desc|
|
2014-08-10 23:17:23 -05:00
|
|
|
spec.option(opt[/^--(.+)$/, 1], desc)
|
2014-08-10 21:45:23 -05:00
|
|
|
end
|
|
|
|
end
|
2014-08-10 21:45:23 -05:00
|
|
|
|
|
|
|
remove_method(:options)
|
2013-01-07 17:34:56 -06:00
|
|
|
end
|
2009-07-31 14:17:56 +01:00
|
|
|
end
|
2009-08-21 20:20:44 +01:00
|
|
|
|
2013-06-05 09:47:08 -07:00
|
|
|
# The methods below define the formula DSL.
|
2009-09-28 14:06:53 -07:00
|
|
|
class << self
|
2014-06-22 15:00:15 -05:00
|
|
|
include BuildEnvironmentDSL
|
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
|
|
|
|
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
|
|
|
|
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.
|
2015-08-29 10:56:24 +01:00
|
|
|
# Optionally specify the download strategy with `:using => ...`
|
|
|
|
# `:git`, `:hg`, `:svn`, `:bzr`, `:cvs`,
|
|
|
|
# `:curl` (normal file download. Will also extract.)
|
|
|
|
# `:nounzip` (without extracting)
|
|
|
|
# `:post` (download via an HTTP POST)
|
|
|
|
# `S3DownloadStrategy` (download from S3 using signed request)
|
|
|
|
#
|
|
|
|
# <pre>url "https://packed.sources.and.we.prefer.https.example.com/archive-1.2.3.tar.bz2"</pre>
|
2015-12-06 22:18:16 +00: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.
|
|
|
|
# https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Bottles.md
|
|
|
|
# You can ignore this block entirely if submitting to Homebrew/Homebrew, It'll be
|
|
|
|
# handled for you by the Brew Test Bot.
|
|
|
|
#
|
|
|
|
# <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.
|
|
|
|
# revision 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.
|
|
|
|
# depends_on :tex # Homebrew does not provide a Tex Distribution.
|
|
|
|
# depends_on :fortran # Checks that `gfortran` is available or `FC` is set.
|
|
|
|
# depends_on :mpi => :cc # Needs MPI with `cc`
|
|
|
|
# depends_on :mpi => [:cc, :cxx, :optional] # Is optional. MPI with `cc` and `cxx`.
|
|
|
|
# depends_on :macos => :lion # Needs at least Mac OS X "Lion" aka. 10.7.
|
|
|
|
# depends_on :apr # If a formula requires the CLT-provided apr library to exist.
|
|
|
|
# depends_on :arch => :intel # If this formula only builds on Intel architecture.
|
|
|
|
# depends_on :arch => :x86_64 # If this formula only builds on Intel x86 64-bit.
|
|
|
|
# depends_on :arch => :ppc # Only builds on PowerPC?
|
|
|
|
# depends_on :ld64 # Sometimes ld fails on `MacOS.version < :leopard`. Then use this.
|
|
|
|
# depends_on :x11 # X11/XQuartz components. Non-optional X11 deps should go in Homebrew/Homebrew-x11
|
|
|
|
# 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.
|
|
|
|
# depends_on :mysql => :recommended</pre>
|
|
|
|
# <pre># It is possible to only depend on something if
|
|
|
|
# # `build.with?` or `build.without? "another_formula"`:
|
|
|
|
# depends_on :mysql # allows brewed or external mysql to be used
|
|
|
|
# depends_on :postgresql if build.without? "sqlite"
|
|
|
|
# depends_on :hg # Mercurial (external or brewed) is needed</pre>
|
|
|
|
#
|
|
|
|
# <pre># If any Python >= 2.7 < 3.x is okay (either from OS X or brewed):
|
|
|
|
# depends_on :python</pre>
|
|
|
|
# <pre># to depend on Python >= 2.7 but use system Python where possible
|
|
|
|
# depends_on :python if MacOS.version <= :snow_leopard</pre>
|
|
|
|
# <pre># Python 3.x if the `--with-python3` is given to `brew install example`
|
|
|
|
# depends_on :python3 => :optional</pre>
|
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.
|
|
|
|
# <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.
|
|
|
|
# <pre>conflicts_with "imagemagick", :because => "because this is just a stupid example"</pre>
|
2015-08-03 13:09:07 +01:00
|
|
|
def conflicts_with(*names)
|
2013-08-29 19:03:34 -05:00
|
|
|
opts = Hash === names.last ? names.pop : {}
|
|
|
|
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
|
|
|
|
# Homebrew. This way, we don't shadow software provided by OS X.
|
|
|
|
# <pre>keg_only :provided_by_osx</pre>
|
|
|
|
# <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:
|
2015-08-29 10:56:24 +01:00
|
|
|
# <pre>fails_with :llvm do # :llvm is really llvm-gcc
|
|
|
|
# build 2334
|
|
|
|
# cause "Segmentation fault during linking."
|
2013-09-28 12:21:16 -07:00
|
|
|
# end
|
|
|
|
#
|
2015-08-29 10:56:24 +01:00
|
|
|
# fails_with :clang do
|
|
|
|
# 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)
|
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>
|
|
|
|
#
|
|
|
|
# <pre>(testpath/"test.file").write <<-EOS.undent
|
|
|
|
# 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
|
|
|
|
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
|