2012-02-04 18:45:08 -08:00
|
|
|
require 'formula_support'
|
2013-02-09 18:19:50 -06:00
|
|
|
require 'formula_lock'
|
2013-03-11 16:41:08 +01:00
|
|
|
require 'formula_pin'
|
2012-02-25 15:22:32 -08:00
|
|
|
require 'hardware'
|
2012-03-07 21:30:03 -05:00
|
|
|
require 'bottles'
|
2012-09-14 07:54:14 -07:00
|
|
|
require 'build_environment'
|
2013-01-23 00:26:23 -06:00
|
|
|
require 'build_options'
|
2013-06-08 20:58:43 -07:00
|
|
|
require 'formulary'
|
2013-09-14 10:16:52 -05:00
|
|
|
require 'software_spec'
|
2013-10-06 22:04:46 +01:00
|
|
|
require 'install_renamed'
|
2014-03-05 20:12:51 -06:00
|
|
|
require 'pkg_version'
|
2015-06-10 16:00:09 +08:00
|
|
|
require 'tap'
|
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
|
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
|
|
|
|
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
|
|
|
|
|
|
|
|
# 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.
|
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
|
|
|
|
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
|
|
|
|
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
|
|
|
|
|
|
|
# The {PkgVersion} for this formula with version and {#revision} information.
|
|
|
|
attr_reader :pkg_version
|
|
|
|
|
|
|
|
# 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`.
|
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.
|
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-05-27 20:30:43 +08:00
|
|
|
if path.to_s =~ HOMEBREW_TAP_PATH_REGEX
|
|
|
|
@full_name = "#{$1}/#{$2.gsub(/^homebrew-/, "")}/#{name}"
|
|
|
|
else
|
|
|
|
@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)
|
2014-12-26 16:08:12 -05:00
|
|
|
validate_attributes!
|
2014-03-10 14:56:02 -05:00
|
|
|
@pkg_version = PkgVersion.new(version, revision)
|
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
|
|
|
|
|
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
|
|
|
|
spec or 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/
|
|
|
|
raise FormulaValidationError.new(:name, name)
|
|
|
|
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/
|
|
|
|
raise FormulaValidationError.new(:url, url)
|
|
|
|
end
|
|
|
|
|
|
|
|
val = version.respond_to?(:to_str) ? version.to_str : version
|
|
|
|
if val.nil? || val.empty? || val =~ /\s/
|
|
|
|
raise FormulaValidationError.new(: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?
|
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?
|
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?
|
2014-10-29 23:32:38 -05:00
|
|
|
def head?
|
|
|
|
active_spec == head
|
|
|
|
end
|
|
|
|
|
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
|
|
|
|
|
|
|
|
# A named Resource for the currently active {SoftwareSpec}.
|
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
|
|
|
|
|
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}.
|
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}.
|
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}.
|
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}.
|
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}.
|
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}.
|
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}.
|
2014-10-16 13:01:05 +01:00
|
|
|
def deprecated_options
|
|
|
|
active_spec.deprecated_options
|
|
|
|
end
|
|
|
|
|
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}.
|
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.
|
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-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}
|
2010-09-24 11:55:21 -05:00
|
|
|
def installed_prefix
|
2013-05-25 18:31:49 -05:00
|
|
|
if head && (head_prefix = prefix(head.version)).directory?
|
2010-09-24 11:55:21 -05:00
|
|
|
head_prefix
|
2013-05-25 18:31:49 -05:00
|
|
|
elsif devel && (devel_prefix = prefix(devel.version)).directory?
|
2012-04-05 21:09:24 -05:00
|
|
|
devel_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.
|
2012-08-18 18:37:32 -05:00
|
|
|
def installed_version
|
|
|
|
require 'keg'
|
|
|
|
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.
|
2014-03-05 20:12:51 -06: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
|
2011-09-11 12:57:53 -07:00
|
|
|
def rack; prefix.parent end
|
2010-02-19 21:55:17 -08:00
|
|
|
|
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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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}.
|
2012-10-28 08:54:54 -07: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}
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
2012-10-28 08:54:54 -07: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.
|
|
|
|
def pkgshare; prefix+'share'+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`.
|
2013-05-03 09:28:45 -07: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`.
|
2013-04-21 10:44:24 +02:00
|
|
|
def kext_prefix; prefix+'Library/Extensions' end
|
|
|
|
|
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.
|
2013-10-05 20:39:51 +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.
|
2010-07-04 14:17:03 -07: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-05-17 01:12:12 +02: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-05-17 01:12:12 +02:00
|
|
|
def zsh_completion; share+'zsh/site-functions' end
|
|
|
|
|
|
|
|
# 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.
|
|
|
|
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.
|
2013-10-05 20:29:19 +01:00
|
|
|
def bottle_prefix; prefix+'.bottle' end
|
|
|
|
|
2015-04-25 22:07:06 -04:00
|
|
|
def logs
|
|
|
|
HOMEBREW_LOGS+name
|
|
|
|
end
|
|
|
|
|
2012-09-08 12:18:52 -07:00
|
|
|
# override this to provide a plist
|
2012-11-25 15:06:41 +00:00
|
|
|
def plist; nil; end
|
|
|
|
alias :startup_plist :plist
|
2011-12-30 23:56:52 -06:00
|
|
|
# plist name, i.e. the name of the launchd service
|
|
|
|
def plist_name; 'homebrew.mxcl.'+name end
|
|
|
|
def plist_path; prefix+(plist_name+'.plist') end
|
2012-11-25 15:06:41 +00:00
|
|
|
def plist_manual; self.class.plist_manual end
|
|
|
|
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.
|
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
|
|
|
|
2014-03-05 21:01:24 -08: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
|
2015-06-17 21:31:06 -04: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.
|
2013-02-11 20:24:06 -08: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-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
|
|
|
|
|
2009-09-28 14:06:53 -07:00
|
|
|
# tell the user about any caveats regarding this package, return a string
|
2009-08-10 16:48:30 +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
|
|
|
|
|
|
|
|
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
|
2009-09-28 14:06:53 -07:00
|
|
|
def skip_clean? path
|
2012-09-09 10:01:59 -07:00
|
|
|
return true if path.extname == '.la' and 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
|
|
|
|
|
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
|
|
|
|
|
2014-08-16 01:33:41 -05:00
|
|
|
def require_universal_deps?
|
|
|
|
false
|
|
|
|
end
|
|
|
|
|
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
|
|
|
|
2013-01-23 00:26:25 -06:00
|
|
|
def lock
|
2013-02-09 18:19:50 -06:00
|
|
|
@lock = FormulaLock.new(name)
|
|
|
|
@lock.lock
|
2013-01-23 00:26:25 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
def unlock
|
2013-02-09 18:19:50 -06:00
|
|
|
@lock.unlock unless @lock.nil?
|
2013-01-23 00:26:25 -06:00
|
|
|
end
|
|
|
|
|
2013-05-21 22:41:21 -05:00
|
|
|
def pinnable?
|
|
|
|
@pin.pinnable?
|
|
|
|
end
|
|
|
|
|
|
|
|
def pinned?
|
|
|
|
@pin.pinned?
|
|
|
|
end
|
|
|
|
|
|
|
|
def pin
|
|
|
|
@pin.pin
|
|
|
|
end
|
|
|
|
|
|
|
|
def unpin
|
|
|
|
@pin.unpin
|
|
|
|
end
|
|
|
|
|
2013-10-04 21:19:15 -05: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?, :==
|
|
|
|
|
2010-09-11 20:22:54 +01:00
|
|
|
def hash
|
|
|
|
name.hash
|
|
|
|
end
|
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
|
|
|
|
2013-03-20 22:23:36 -05:00
|
|
|
def inspect
|
2015-01-04 21:35:20 -05:00
|
|
|
s = "#<Formula #{name} ("
|
|
|
|
s << if head? then "head" elsif devel? then "devel" else "stable" end
|
|
|
|
s << ") #{path}>"
|
2013-03-20 22:23:36 -05:00
|
|
|
end
|
2010-09-11 20:22:54 +01:00
|
|
|
|
2015-07-05 19:43:01 -07:00
|
|
|
def file_modified?
|
|
|
|
return false unless which("git")
|
|
|
|
path.parent.cd do
|
|
|
|
diff = Utils.popen_read("git", "diff", "origin/master", "--", "#{path}")
|
|
|
|
!diff.empty? && $?.exitstatus == 0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
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-03-03 15:24:51 +00:00
|
|
|
-DCMAKE_C_FLAGS_RELEASE=
|
|
|
|
-DCMAKE_CXX_FLAGS_RELEASE=
|
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
|
|
|
|
def self.core_names
|
2015-06-20 14:46:24 +08:00
|
|
|
@core_names ||= Dir["#{HOMEBREW_LIBRARY}/Formula/*.rb"].map{ |f| File.basename f, ".rb" }.sort
|
2015-05-08 19:54:29 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
# an array of all tap {Formula} names
|
|
|
|
def self.tap_names
|
2015-06-20 14:46:24 +08:00
|
|
|
@tap_names ||= Tap.map(&:formula_names).flatten.sort
|
2015-05-08 19:54:29 +08:00
|
|
|
end
|
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# an array of all {Formula} names
|
2010-03-09 02:18:08 +00:00
|
|
|
def self.names
|
2015-06-20 14:46:24 +08:00
|
|
|
@names ||= (core_names + tap_names.map { |name| name.split("/")[-1] }).sort.uniq
|
2015-05-08 19:54:29 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
# an array of all {Formula} names, which the tap formulae have the fully-qualified name
|
|
|
|
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
|
|
|
|
|
2010-09-11 20:22:54 +01:00
|
|
|
def self.each
|
2015-05-08 19:54:29 +08:00
|
|
|
full_names.each do |name|
|
2013-04-14 23:29:15 -05:00
|
|
|
begin
|
2014-02-24 20:25:16 -08:00
|
|
|
yield Formulary.factory(name)
|
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.
|
2012-08-21 11:39:45 -04:00
|
|
|
onoe "Failed to import: #{name}"
|
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
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# An array of all installed {Formula}
|
2012-08-10 16:05:30 -04:00
|
|
|
def self.installed
|
2015-06-20 14:46:24 +08:00
|
|
|
@installed ||= if HOMEBREW_CELLAR.directory?
|
|
|
|
HOMEBREW_CELLAR.subdirs.map do |rack|
|
|
|
|
begin
|
|
|
|
Formulary.from_rack(rack)
|
|
|
|
rescue FormulaUnavailableError, TapFormulaAmbiguityError
|
|
|
|
end
|
|
|
|
end.compact
|
|
|
|
else
|
|
|
|
[]
|
|
|
|
end
|
2012-08-10 16:05:30 -04:00
|
|
|
end
|
|
|
|
|
2010-03-09 02:18:08 +00:00
|
|
|
def self.aliases
|
2013-10-30 13:20:48 -07:00
|
|
|
Dir["#{HOMEBREW_LIBRARY}/Aliases/*"].map{ |f| File.basename f }.sort
|
2009-11-16 15:35:58 -08:00
|
|
|
end
|
2009-08-21 20:20:44 +01:00
|
|
|
|
2014-02-24 20:25:16 -08:00
|
|
|
def self.[](name)
|
|
|
|
Formulary.factory(name)
|
|
|
|
end
|
|
|
|
|
2013-10-29 15:46:10 -04:00
|
|
|
def tap?
|
2014-04-06 00:31:07 -05:00
|
|
|
HOMEBREW_TAP_DIR_REGEX === path
|
2013-10-29 15:46:10 -04:00
|
|
|
end
|
|
|
|
|
2012-03-16 12:29:47 +00:00
|
|
|
def tap
|
2014-04-06 00:31:07 -05:00
|
|
|
if path.to_s =~ HOMEBREW_TAP_DIR_REGEX
|
2012-03-16 12:29:47 +00:00
|
|
|
"#$1/#$2"
|
2013-06-23 16:21:48 -07:00
|
|
|
elsif core_formula?
|
2013-12-14 18:15:59 +00:00
|
|
|
"Homebrew/homebrew"
|
2012-03-16 12:29:47 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-10-19 13:54:00 +01:00
|
|
|
def print_tap_action options={}
|
|
|
|
if tap?
|
|
|
|
verb = options[:verb] || "Installing"
|
|
|
|
ohai "#{verb} #{name} from #{tap}"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-06-23 16:15:11 -07:00
|
|
|
# True if this formula is provided by Homebrew itself
|
|
|
|
def core_formula?
|
2015-05-08 18:59:08 +08:00
|
|
|
path == Formulary.core_path(name)
|
2013-06-23 16:15:11 -07:00
|
|
|
end
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
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.
|
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
|
|
|
|
|
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,
|
|
|
|
"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?),
|
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
|
|
|
|
|
2014-08-10 21:45:24 -05:00
|
|
|
hsh["options"] = options.map { |opt|
|
2014-03-28 20:42:55 -05:00
|
|
|
{ "option" => opt.flag, "description" => opt.description }
|
|
|
|
}
|
2012-08-15 22:08:40 -05:00
|
|
|
|
|
|
|
if rack.directory?
|
2014-04-20 00:03:18 -04:00
|
|
|
rack.subdirs.each do |keg_path|
|
|
|
|
keg = Keg.new keg_path
|
|
|
|
tab = Tab.for_keg keg_path
|
2012-08-15 22:08:40 -05:00
|
|
|
|
|
|
|
hsh["installed"] << {
|
2014-03-28 20:41:02 -05:00
|
|
|
"version" => keg.version.to_s,
|
2014-08-14 01:00:23 -05:00
|
|
|
"used_options" => tab.used_options.as_flags,
|
2013-03-15 00:28:18 +00:00
|
|
|
"built_as_bottle" => tab.built_bottle,
|
|
|
|
"poured_from_bottle" => tab.poured_from_bottle
|
2012-08-15 22:08:40 -05:00
|
|
|
}
|
|
|
|
end
|
2015-02-07 09:21:20 +08:00
|
|
|
|
2015-02-19 00:21:25 +08:00
|
|
|
hsh["installed"] = hsh["installed"].sort_by { |i| Version.new(i["version"]) }
|
2012-08-15 22:08:40 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
hsh
|
|
|
|
|
|
|
|
end
|
|
|
|
|
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
|
|
|
|
|
|
|
|
def verify_download_integrity fn
|
|
|
|
active_spec.verify_download_integrity(fn)
|
|
|
|
end
|
|
|
|
|
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-04-08 12:56:32 -07:00
|
|
|
setup_test_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
|
|
|
|
|
|
|
|
def test_defined?
|
2014-08-16 17:44:22 -05:00
|
|
|
false
|
2013-06-05 09:47:08 -07:00
|
|
|
end
|
|
|
|
|
2014-09-18 14:16:07 -05:00
|
|
|
def test
|
|
|
|
end
|
|
|
|
|
2014-10-19 01:14:32 -05:00
|
|
|
def test_fixtures(file)
|
|
|
|
HOMEBREW_LIBRARY.join("Homebrew", "test", "fixtures", file)
|
|
|
|
end
|
|
|
|
|
2014-12-06 11:27:03 +00:00
|
|
|
def install
|
|
|
|
end
|
|
|
|
|
2014-12-12 22:27:34 -05:00
|
|
|
protected
|
|
|
|
|
2015-04-08 12:56:32 -07:00
|
|
|
def setup_test_home home
|
|
|
|
# keep Homebrew's site-packages in sys.path when testing with system Python
|
|
|
|
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
|
|
|
|
|
2009-07-24 15:10:01 +01:00
|
|
|
# Pretty titles the command and buffers stdout/stderr
|
|
|
|
# Throws if there's an error
|
2009-08-10 16:48:30 +01:00
|
|
|
def system cmd, *args
|
2014-09-05 15:13:53 -05:00
|
|
|
verbose = ARGV.verbose?
|
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
|
2014-09-05 15:13:53 -05:00
|
|
|
if cmd == "./configure" and not 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
|
2011-07-07 18:06:21 +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-04-25 22:07:06 -04:00
|
|
|
logfn = "#{logs}/%02d.%s" % [@exec_count, File.basename(cmd).split(' ').first]
|
|
|
|
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
|
|
|
|
|
|
|
|
while buf = rd.gets
|
|
|
|
log.puts buf
|
|
|
|
puts buf
|
|
|
|
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?
|
|
|
|
log.flush
|
|
|
|
Kernel.system "/usr/bin/tail", "-n", "5", logfn unless verbose
|
|
|
|
log.puts
|
2014-12-30 23:47:07 -05:00
|
|
|
|
|
|
|
require "cmd/config"
|
|
|
|
require "cmd/--env"
|
|
|
|
|
|
|
|
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
|
|
|
|
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)
|
2014-09-05 15:13:52 -05:00
|
|
|
ENV['HOMEBREW_CC_LOG_PATH'] = logfn
|
|
|
|
|
|
|
|
# TODO system "xcodebuild" is deprecated, this should be removed soon.
|
|
|
|
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
|
2014-09-05 15:13:52 -05:00
|
|
|
args.collect!{|arg| arg.to_s}
|
|
|
|
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
|
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
|
|
|
|
|
|
|
|
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
|
2014-03-13 19:51:23 -05:00
|
|
|
active_spec.add_legacy_patches(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-01-22 17:03:54 -05:00
|
|
|
patchlist.select(&:external?).each do |patch|
|
2014-03-13 19:51:23 -05:00
|
|
|
patch.verify_download_integrity(patch.fetch)
|
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
|
|
|
|
2012-04-06 17:28:44 -05: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`.
|
|
|
|
attr_rw :desc
|
|
|
|
|
2015-01-04 14:25:59 -05:00
|
|
|
# @!attribute [w]
|
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`.
|
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-01-04 14:25:59 -05:00
|
|
|
# @!attribute [w]
|
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.
|
|
|
|
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.
|
2013-09-22 16:04:25 -05: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.
|
2013-09-22 16:04:25 -05: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}.
|
2013-09-22 16:04:25 -05: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-01-04 14:25:59 -05:00
|
|
|
# @!attribute [w] sha1
|
2014-12-26 20:24:12 +00:00
|
|
|
# @scope class
|
|
|
|
# To verify the {#cached_download}'s integrity and security we verify the
|
|
|
|
# SHA-1 hash matches what we've declared in the {Formula}. To quickly fill
|
|
|
|
# this value you can leave it blank and run `brew fetch --force` and it'll
|
|
|
|
# tell you the currently valid value.
|
|
|
|
|
2015-01-04 14:25:59 -05:00
|
|
|
# @!attribute [w] sha256
|
2014-12-26 20:24:12 +00:00
|
|
|
# @scope class
|
|
|
|
# Similar to {.sha1} but using a SHA-256 hash instead.
|
|
|
|
|
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
|
|
|
|
|
2014-03-10 14:56:02 -05:00
|
|
|
def bottle *, &block
|
|
|
|
stable.bottle(&block)
|
|
|
|
end
|
|
|
|
|
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
|
|
|
|
2012-01-22 22:32:15 -06: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
|
|
|
|
|
2012-04-05 21:09:24 -05: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
|
|
|
|
2013-09-13 11:13:12 -05: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
|
|
|
|
2014-12-26 20:24:12 +00:00
|
|
|
# Define a named resource using a {SoftwareSpec} style block
|
2014-06-02 23:32:42 -07: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
|
|
|
|
|
2014-06-02 23:32:42 -07: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
|
|
|
|
|
2012-02-28 19:56:35 -08: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
|
|
|
|
2014-08-08 01:34:45 -05: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
|
|
|
|
2014-10-16 13:01:05 +01:00
|
|
|
def deprecated_option hash
|
|
|
|
specs.each { |spec| spec.deprecated_option(hash) }
|
|
|
|
end
|
|
|
|
|
2014-07-29 16:06:07 -05:00
|
|
|
def patch strip=:p1, src=nil, &block
|
|
|
|
specs.each { |spec| spec.patch(strip, src, &block) }
|
2014-03-13 19:51:23 -05:00
|
|
|
end
|
|
|
|
|
2012-11-25 15:06:41 +00:00
|
|
|
def plist_options options
|
|
|
|
@plist_startup = options[:startup]
|
|
|
|
@plist_manual = options[:manual]
|
|
|
|
end
|
2012-07-30 11:32:56 -07:00
|
|
|
|
2013-06-09 13:44:59 -05:00
|
|
|
def conflicts
|
|
|
|
@conflicts ||= []
|
|
|
|
end
|
|
|
|
|
2013-08-29 19:03:34 -05:00
|
|
|
def conflicts_with *names
|
|
|
|
opts = Hash === names.last ? names.pop : {}
|
|
|
|
names.each { |name| conflicts << FormulaConflict.new(name, opts[:because]) }
|
2012-07-28 13:02:46 -03:00
|
|
|
end
|
|
|
|
|
2012-10-21 13:03:35 -07: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
|
|
|
|
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
|
|
|
|
2014-08-08 01:34:45 -05:00
|
|
|
def keg_only reason, explanation=""
|
|
|
|
@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
|
2014-04-21 18:50:22 +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
|
|
|
|
|
2013-09-28 12:21:16 -07:00
|
|
|
# For Apple compilers, this should be in the format:
|
|
|
|
# fails_with compiler do
|
|
|
|
# cause "An explanation for why the build doesn't work."
|
|
|
|
# build "The Apple build number for the newest incompatible release."
|
|
|
|
# end
|
|
|
|
#
|
|
|
|
# The block may be omitted, and if present the build may be omitted;
|
|
|
|
# if so, then the compiler will be blacklisted for *all* versions.
|
|
|
|
#
|
|
|
|
# For GNU GCC compilers, this should be in the format:
|
|
|
|
# fails_with compiler => major_version do
|
|
|
|
# cause
|
|
|
|
# version "The official release number for the latest incompatible
|
|
|
|
# version, for instance 4.8.1"
|
|
|
|
# end
|
2014-01-04 12:49:48 +00:00
|
|
|
#
|
2013-09-28 12:21:16 -07:00
|
|
|
# `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
|
|
|
#
|
2013-09-28 12:21:16 -07:00
|
|
|
# fails_with :gcc => '4.8' do
|
|
|
|
# version '4.8.1'
|
|
|
|
# end
|
2014-08-19 17:14:02 -05:00
|
|
|
def fails_with compiler, &block
|
|
|
|
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
|
|
|
|
2014-04-04 21:16:09 -07: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
|
|
|
|
|
2012-11-01 14:40:59 -05: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
|
2009-09-28 14:06:53 -07:00
|
|
|
end
|
2009-07-24 15:10:01 +01:00
|
|
|
end
|