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-08-09 14:46:07 +03:00
require " formula_renames "
2015-08-23 16:35:51 +08:00
require " keg "
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
# 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
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-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 )
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-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
@oldname || = if core_formula?
if FORMULA_RENAMES && FORMULA_RENAMES . value? ( name )
FORMULA_RENAMES . to_a . rassoc ( name ) . first
end
elsif tap?
user , repo = tap . split ( " / " )
2015-09-27 16:52:14 +08:00
formula_renames = Tap . fetch ( user , repo . sub ( " homebrew- " , " " ) ) . 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
@aliases || = if core_formula?
Formula . core_alias_reverse_table [ name ] || [ ]
elsif tap?
user , repo = tap . split ( " / " )
Tap . fetch ( user , repo . sub ( " homebrew- " , " " ) ) . alias_reverse_table [ full_name ] || [ ]
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 "
rack . directory? && rack . subdirs . any? { | keg | ( keg / Tab :: FILENAME ) . file? }
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-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-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
# The {.plist} name (the name of the launchd service).
2015-08-03 13:09:07 +01:00
def plist_name
" homebrew.mxcl. " + name
end
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
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-09-28 22:47:53 +01:00
tap = Tab . for_keg ( keg ) . tap
return false if tap . nil? # this keg doesn't below to any core/tap formula, most likely coming from a DIY install.
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-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-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-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
2015-08-29 10:56:24 +01:00
# @private
2015-05-08 19:54:29 +08:00
def self . core_names
2015-09-13 17:04:04 +08:00
@core_names || = core_files . map { | f | f . basename ( " .rb " ) . to_s } . sort
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
@core_files || = Pathname . glob ( " #{ HOMEBREW_LIBRARY } /Formula/*.rb " )
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?
HOMEBREW_CELLAR . subdirs . reject ( & :symlink? )
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
@core_alias_files || = Pathname . glob ( " #{ HOMEBREW_LIBRARY } /Aliases/* " )
end
2015-09-12 19:14:38 +08:00
# an array of all core aliases
# @private
def self . core_aliases
2015-09-27 15:57:37 +08:00
@core_aliases || = core_alias_files . map { | f | f . basename . to_s } . sort
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
return @core_alias_table if @core_alias_table
@core_alias_table = Hash . new
core_alias_files . each do | alias_file |
@core_alias_table [ alias_file . basename . to_s ] = alias_file . resolved_path . basename ( " .rb " ) . to_s
end
@core_alias_table
end
# a table mapping core formula name to aliases
# @private
def self . core_alias_reverse_table
return @core_alias_reverse_table if @core_alias_reverse_table
@core_alias_reverse_table = Hash . new
core_alias_table . each do | alias_name , formula_name |
@core_alias_reverse_table [ formula_name ] || = [ ]
@core_alias_reverse_table [ formula_name ] << alias_name
end
@core_alias_reverse_table
end
2014-02-24 20:25:16 -08:00
def self . [] ( name )
Formulary . factory ( name )
end
2015-08-29 10:56:24 +01:00
# @private
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
2015-08-29 10:56:24 +01:00
# @private
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
2015-08-03 13:09:07 +01: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
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
2013-06-23 16:15:11 -07:00
# True if this formula is provided by Homebrew itself
2015-08-29 10:56:24 +01:00
# @private
2013-06-23 16:15:11 -07:00
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
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? ) ,
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 )
next unless ( bottle_spec = spec . bottle_specification ) . checksums . any?
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 " ] = { }
bottle_spec . collector . keys . each do | os |
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
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
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-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
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-08-03 13:09:07 +01:00
def setup_test_home ( home )
2015-04-08 12:56:32 -07:00
# 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
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 "
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 )
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
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
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>
# <pre>url "https://some.dont.provide.archives.example.com", :using => :git, :tag => "1.2.3"</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.
# It will be installed automatically if there is a binary package for your platform and you haven't passed or previously used any options on this formula.
# If you maintain your own repository, you can add your own bottle links.
# 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
# root_url "http://mikemcquaid.com" # Optional root to calculate bottle URLs
# 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.
# sha256 "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" => :yosemite
# sha256 "53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3" => :mavericks
# sha256 "1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2" => :mountain_lion
# end</pre>
2015-08-03 13:09:07 +01:00
def bottle ( * , & block )
2014-03-10 14:56:02 -05:00
stable . bottle ( & block )
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-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