diff options
Diffstat (limited to 'Library/Homebrew/cmd/create.rb')
| -rw-r--r-- | Library/Homebrew/cmd/create.rb | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/Library/Homebrew/cmd/create.rb b/Library/Homebrew/cmd/create.rb new file mode 100644 index 000000000..e21c9a524 --- /dev/null +++ b/Library/Homebrew/cmd/create.rb @@ -0,0 +1,153 @@ +require 'formula' + +module Homebrew extend self + def create + 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}" + elsif ARGV.named.empty? + raise UsageError + else + paths = ARGV.named.map do |url| + fc = FormulaCreator.new + fc.url = url + fc.mode = if ARGV.include? '--cmake' + :cmake + elsif ARGV.include? '--autotools' + :autotools + end + + if fc.name.to_s.strip.empty? + path = Pathname.new url + print "Formula name [#{path.stem}]: " + fc.name = __gets || path.stem + end + + unless ARGV.force? + if msg = blacklisted?(fc.name) + raise "#{msg}\n\nIf you really want to make this formula use --force." + end + + if Formula.aliases.include? fc.name + realname = Formula.caniconical_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 + fc.path + end + exec_editor *paths + end + end + + def __gets + gots = $stdin.gets.chomp + if gots.empty? then nil else gots end + end + + def blacklisted? name + case name.downcase + when 'vim', 'screen' then <<-EOS.undent + #{name} is blacklisted for creation + Apple distributes this program with OS X. + EOS + when 'libarchive', 'libpcap' then <<-EOS.undent + #{name} is blacklisted for creation + Apple distributes this library with OS X, you can find it in /usr/lib. + EOS + when 'libxml', 'libxlst', 'freetype', 'libpng' then <<-EOS.undent + #{name} is blacklisted for creation + Apple distributes this library with OS X, you can find it in /usr/X11/lib. + However not all build scripts look here, so you may need to call ENV.x11 or + ENV.libxml2 in your formula's install function. + EOS + when /^rubygems?$/ + "Sorry RubyGems comes with OS X so we don't package it." + when 'wxwidgets' then <<-EOS.undent + #{name} is blacklisted for creation + An older version of wxWidgets is provided by Apple with OS X, but + a formula for wxWidgets 2.8.10 is provided: + + brew install wxmac + EOS + end + end +end + +class FormulaCreator + attr :url + attr :md5 + attr :name, true + attr :path + attr :mode, true + + def url= url + @url = url + path = Pathname.new url + /(.*?)[-_.]?#{path.version}/.match path.basename + @name = $1 + @path = Formula.path $1 + end + + def version + Pathname.new(url).version + end + + def generate + raise "#{path} already exists" if path.exist? + raise VersionUndetermined if version.nil? + + 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." + else + puts "Version detected as #{version}." + end + + unless ARGV.include? "--no-md5" and version + strategy = detect_download_strategy url + @md5 = strategy.new(url, name, version, nil).fetch.md5 if strategy == CurlDownloadStrategy + end + + path.write ERB.new(template, nil, '>').result(binding) + end + + def template; <<-EOS.undent + require 'formula' + + class #{Formula.class_s name} <Formula + url '#{url}' + homepage '' + md5 '#{md5}' + + <% if mode == :cmake %> + depends_on 'cmake' + <% elsif mode == nil %> + # depends_on 'cmake' + <% end %> + + def install + <% if mode == :cmake %> + system "cmake . \#{std_cmake_parameters}" + <% elsif mode == :autotools %> + system "./configure", "--disable-debug", "--disable-dependency-tracking", + "--prefix=\#{prefix}" + <% else %> + system "./configure", "--disable-debug", "--disable-dependency-tracking", + "--prefix=\#{prefix}" + # system "cmake . \#{std_cmake_parameters}" + <% end %> + system "make install" + end + end + EOS + end +end |
