brew/Library/Homebrew/cmd/create.rb

194 lines
5.7 KiB
Ruby
Raw Normal View History

require "formula"
require "blacklist"
require "digest"
require "erb"
module Homebrew
# Create a formula from a tarball URL
def create
# Allow searching MacPorts or Fink.
if ARGV.include? "--macports"
opoo "`brew create --macports` is deprecated; use `brew search --macports` instead"
exec_browser "https://www.macports.org/ports.php?by=name&substr=#{ARGV.next}"
elsif ARGV.include? "--fink"
opoo "`brew create --fink` is deprecated; use `brew search --fink` instead"
2012-12-27 23:34:29 -06:00
exec_browser "http://pdb.finkproject.org/pdb/browse.php?summary=#{ARGV.next}"
end
raise UsageError if ARGV.named.empty?
# Ensure that the cache exists so we can fetch the tarball
HOMEBREW_CACHE.mkpath
url = ARGV.named.first # Pull the first (and only) url from ARGV
version = ARGV.next if ARGV.include? "--set-version"
name = ARGV.next if ARGV.include? "--set-name"
fc = FormulaCreator.new
fc.name = name
fc.version = version
fc.url = url
fc.mode = if ARGV.include? "--cmake"
:cmake
elsif ARGV.include? "--autotools"
:autotools
end
2014-07-17 19:40:44 -05:00
if fc.name.nil? || fc.name.strip.empty?
stem = Pathname.new(url).stem
print "Formula name [#{stem}]: "
fc.name = __gets || stem
fc.path = Formulary.path(fc.name)
end
# Don't allow blacklisted formula, or names that shadow aliases,
# unless --force is specified.
unless ARGV.force?
if msg = blacklisted?(fc.name)
raise "#{fc.name} is blacklisted for creation.\n#{msg}\nIf you really want to create this formula use --force."
end
if Formula.aliases.include? fc.name
realname = Formulary.canonical_name(fc.name)
raise <<-EOS.undent
The formula #{realname} is already aliased to #{fc.name}
Please check that you are not creating a duplicate.
To force creation use --force.
EOS
end
end
fc.generate!
puts "Please `brew audit --strict #{fc.name}` before submitting, thanks."
exec_editor fc.path
end
def __gets
gots = $stdin.gets.chomp
if gots.empty? then nil else gots end
end
end
class FormulaCreator
attr_reader :url, :sha256
attr_accessor :name, :version, :path, :mode
def url=(url)
@url = url
path = Pathname.new(url)
if @name.nil?
case url
when %r{github\.com/\S+/(\S+)\.git}
@name = $1
@head = true
when %r{github\.com/\S+/(\S+)/archive/}
@name = $1
else
/(.*?)[-_.]?#{path.version}/.match path.basename
@name = $1
end
@path = Formulary.path @name unless @name.nil?
else
@path = Formulary.path name
end
if @version
@version = Version.new(@version)
else
@version = Pathname.new(url).version
end
end
2014-02-22 20:17:04 -05:00
def fetch?
!head? && !ARGV.include?("--no-fetch")
end
def head?
@head || ARGV.build_head?
2014-02-22 20:17:04 -05:00
end
def generate!
raise "#{path} already exists" if path.exist?
if version.nil?
opoo "Version cannot be determined from URL."
puts "You'll need to add an explicit 'version' to the formula."
end
2014-02-22 20:17:04 -05:00
if fetch? && version
r = Resource.new
r.url(url)
r.version(version)
r.owner = self
@sha256 = r.fetch.sha256 if r.download_strategy == CurlDownloadStrategy
end
path.write ERB.new(template, nil, ">").result(binding)
end
def template; <<-EOS.undent
# Documentation: https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Formula-Cookbook.md
# http://www.rubydoc.info/github/Homebrew/brew/master/Formula
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!
2012-02-29 02:00:33 +00:00
2014-02-22 20:17:04 -05:00
class #{Formulary.class_s(name)} < Formula
desc ""
2014-01-07 08:10:31 +00:00
homepage ""
<% if head? %>
head "#{url}"
<% else %>
2014-01-07 08:10:31 +00:00
url "#{url}"
2013-09-16 16:12:25 -05:00
<% unless version.nil? or version.detected_from_url? %>
2014-01-07 08:10:31 +00:00
version "#{version}"
<% end %>
sha256 "#{sha256}"
<% end %>
<% if mode == :cmake %>
2014-01-07 08:10:31 +00:00
depends_on "cmake" => :build
2013-06-26 18:47:00 -05:00
<% elsif mode.nil? %>
2014-01-07 08:10:31 +00:00
# depends_on "cmake" => :build
<% end %>
2012-08-09 11:00:35 -05:00
depends_on :x11 # if your formula requires any X11/XQuartz components
def install
# ENV.deparallelize # if your formula fails when building in parallel
<% if mode == :cmake %>
system "cmake", ".", *std_cmake_args
<% elsif mode == :autotools %>
# Remove unrecognized options if warned by configure
system "./configure", "--disable-debug",
"--disable-dependency-tracking",
"--disable-silent-rules",
"--prefix=\#{prefix}"
<% else %>
# Remove unrecognized options if warned by configure
system "./configure", "--disable-debug",
"--disable-dependency-tracking",
"--disable-silent-rules",
"--prefix=\#{prefix}"
# system "cmake", ".", *std_cmake_args
<% end %>
2013-04-03 11:24:45 -07:00
system "make", "install" # if this fails, try separate make/make install steps
end
2013-02-23 08:42:34 +00:00
test do
# `test do` will create, run in and delete a temporary directory.
#
# This test will fail and we won't accept that! It's enough to just replace
# "false" with the main program this formula installs, but it'd be nice if you
# were more thorough. Run the test with `brew test #{name}`. Options passed
# to `brew install` such as `--HEAD` also need to be provided to `brew test`.
#
# The installed folder is not in the path, so use the entire path to any
2014-01-07 08:10:31 +00:00
# executables being tested: `system "\#{bin}/program", "do", "something"`.
system "false"
end
end
EOS
end
end