| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | require 'formula' | 
					
						
							| 
									
										
										
										
											2010-11-14 03:52:59 +00:00
										 |  |  | require 'blacklist' | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Homebrew extend self | 
					
						
							| 
									
										
										
										
											2012-08-22 19:42:01 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   # Create a formula from a tarball URL | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |   def create | 
					
						
							| 
									
										
										
										
											2012-08-22 19:42:01 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Allow searching MacPorts or Fink. | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     if ARGV.include? '--macports' | 
					
						
							|  |  |  |       exec "open", "http://www.macports.org/ports.php?by=name&substr=#{ARGV.next}" | 
					
						
							|  |  |  |     elsif ARGV.include? '--fink' | 
					
						
							|  |  |  |       exec "open", "http://pdb.finkproject.org/pdb/browse.php?summary=#{ARGV.next}" | 
					
						
							| 
									
										
										
										
											2012-08-22 19:42:01 -07:00
										 |  |  |     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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if fc.name.nil? or fc.name.to_s.strip.empty? | 
					
						
							|  |  |  |       path = Pathname.new url | 
					
						
							|  |  |  |       print "Formula name [#{path.stem}]: " | 
					
						
							|  |  |  |       fc.name = __gets || path.stem | 
					
						
							|  |  |  |       fc.path = Formula.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 = Formula.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 | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-08-22 19:42:01 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     fc.generate! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     puts "Please `brew audit #{fc.name}` before submitting, thanks." | 
					
						
							|  |  |  |     exec_editor fc.path | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def __gets | 
					
						
							|  |  |  |     gots = $stdin.gets.chomp | 
					
						
							|  |  |  |     if gots.empty? then nil else gots end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FormulaCreator | 
					
						
							|  |  |  |   attr :url | 
					
						
							| 
									
										
										
										
											2012-03-07 18:52:21 +01:00
										 |  |  |   attr :sha1 | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |   attr :name, true | 
					
						
							| 
									
										
										
										
											2012-08-22 19:42:01 -07:00
										 |  |  |   attr :version, true | 
					
						
							| 
									
										
										
										
											2011-03-27 22:14:16 +02:00
										 |  |  |   attr :path, true | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |   attr :mode, true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def url= url | 
					
						
							|  |  |  |     @url = url | 
					
						
							| 
									
										
										
										
											2012-08-22 19:42:01 -07:00
										 |  |  |     path = Pathname.new(url) | 
					
						
							|  |  |  |     if @name.nil? | 
					
						
							|  |  |  |       /(.*?)[-_.]?#{path.version}/.match path.basename | 
					
						
							|  |  |  |       @name = $1 | 
					
						
							|  |  |  |       @path = Formula.path $1 unless $1.nil? | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       @path = Formula.path name | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     if @version.nil? | 
					
						
							|  |  |  |       @version = Pathname.new(url).version | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-22 19:42:01 -07:00
										 |  |  |   def generate! | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     raise "#{path} already exists" if path.exist? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     require 'digest' | 
					
						
							|  |  |  |     require 'erb' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if version.nil? | 
					
						
							|  |  |  |       opoo "Version cannot be determined from URL." | 
					
						
							|  |  |  |       puts "You'll need to add an explicit 'version' to the formula." | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-13 12:52:41 +00:00
										 |  |  |     unless ARGV.include? "--no-fetch" and version | 
					
						
							| 
									
										
										
										
											2012-06-26 12:44:43 -05:00
										 |  |  |       spec = SoftwareSpec.new(url, version) | 
					
						
							|  |  |  |       strategy = spec.download_strategy | 
					
						
							| 
									
										
										
										
											2012-06-26 01:35:37 -05:00
										 |  |  |       @sha1 = strategy.new(name, spec).fetch.sha1 if strategy == CurlDownloadStrategy | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     path.write ERB.new(template, nil, '>').result(binding) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def template; <<-EOS.undent
 | 
					
						
							|  |  |  |     require 'formula' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-01 13:25:10 +00:00
										 |  |  |     # Documentation: https://github.com/mxcl/homebrew/wiki/Formula-Cookbook | 
					
						
							|  |  |  |     # PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST! | 
					
						
							| 
									
										
										
										
											2012-02-29 02:00:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-09 21:11:03 -08:00
										 |  |  |     class #{Formula.class_s name} < Formula | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |       homepage '' | 
					
						
							| 
									
										
										
										
											2012-02-06 17:19:54 -06:00
										 |  |  |       url '#{url}' | 
					
						
							| 
									
										
										
										
											2012-08-22 19:42:01 -07:00
										 |  |  |     <% unless  version.nil? %> | 
					
						
							|  |  |  |       version '#{version}' | 
					
						
							|  |  |  |     <% end  %> | 
					
						
							| 
									
										
										
										
											2012-03-07 18:52:21 +01:00
										 |  |  |       sha1 '#{sha1}' | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     <% if  mode == :cmake %> | 
					
						
							| 
									
										
										
										
											2011-11-29 16:08:02 -06:00
										 |  |  |       depends_on 'cmake' => :build | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     <% elsif  mode == nil %> | 
					
						
							| 
									
										
										
										
											2011-11-29 16:08:02 -06:00
										 |  |  |       # depends_on 'cmake' => :build | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     <% end  %> | 
					
						
							| 
									
										
										
										
											2012-08-09 11:00:35 -05:00
										 |  |  |       depends_on :x11 # if your formula requires any X11/XQuartz components | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       def install | 
					
						
							| 
									
										
										
										
											2012-03-01 13:25:10 +00:00
										 |  |  |         # ENV.j1  # if your formula's build system can't parallelize | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     <% if  mode == :cmake %> | 
					
						
							| 
									
										
										
										
											2012-05-22 22:32:16 -05:00
										 |  |  |         system "cmake", ".", *std_cmake_args | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     <% elsif  mode == :autotools %> | 
					
						
							|  |  |  |         system "./configure", "--disable-debug", "--disable-dependency-tracking", | 
					
						
							|  |  |  |                               "--prefix=\#{prefix}" | 
					
						
							|  |  |  |     <% else  %> | 
					
						
							|  |  |  |         system "./configure", "--disable-debug", "--disable-dependency-tracking", | 
					
						
							|  |  |  |                               "--prefix=\#{prefix}" | 
					
						
							| 
									
										
										
										
											2012-05-22 22:32:16 -05:00
										 |  |  |         # system "cmake", ".", *std_cmake_args | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     <% end  %> | 
					
						
							| 
									
										
										
										
											2012-03-01 13:25:10 +00:00
										 |  |  |         system "make install" # if this fails, try separate make/make install steps | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-08-25 00:52:12 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       def test | 
					
						
							| 
									
										
										
										
											2012-03-01 13:25:10 +00:00
										 |  |  |         # 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}`. | 
					
						
							| 
									
										
										
										
											2011-09-20 03:38:30 +01:00
										 |  |  |         system "false" | 
					
						
							| 
									
										
										
										
											2011-08-25 00:52:12 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |