2010-11-09 12:57:41 +00:00
|
|
|
require 'exceptions'
|
2009-10-26 18:13:38 +00:00
|
|
|
require 'formula'
|
2011-08-23 23:30:52 +01:00
|
|
|
require 'keg'
|
2011-09-22 20:07:39 -07:00
|
|
|
require 'tab'
|
2012-03-07 21:30:03 -05:00
|
|
|
require 'bottles'
|
2009-10-26 18:13:38 +00:00
|
|
|
|
|
|
|
class FormulaInstaller
|
2011-08-23 23:30:52 +01:00
|
|
|
attr :f
|
2012-03-23 13:05:08 -05:00
|
|
|
attr :tab
|
2011-08-23 23:30:52 +01:00
|
|
|
attr :show_summary_heading, true
|
2010-11-09 12:57:41 +00:00
|
|
|
attr :ignore_deps, true
|
2011-08-23 23:30:52 +01:00
|
|
|
attr :install_bottle, true
|
|
|
|
attr :show_header, true
|
2009-10-26 18:13:38 +00:00
|
|
|
|
2012-03-23 13:05:08 -05:00
|
|
|
def initialize ff, tab=nil
|
2011-08-23 23:30:52 +01:00
|
|
|
@f = ff
|
2012-03-23 13:05:08 -05:00
|
|
|
@tab = tab
|
2011-08-23 23:30:52 +01:00
|
|
|
@show_header = true
|
2012-08-18 18:12:12 -05:00
|
|
|
@ignore_deps = ARGV.ignore_deps? || ARGV.interactive?
|
2012-03-07 21:30:03 -05:00
|
|
|
@install_bottle = install_bottle? ff
|
2012-03-07 11:16:27 +00:00
|
|
|
|
|
|
|
check_install_sanity
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_install_sanity
|
|
|
|
if f.installed?
|
2012-08-23 09:02:24 -04:00
|
|
|
msg = "#{f}-#{f.installed_version} already installed"
|
|
|
|
msg << ", it's just not linked" if not f.linked_keg.symlink? and not f.keg_only?
|
|
|
|
raise CannotInstallFormulaError, msg
|
2012-03-07 11:16:27 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
# Building head-only without --HEAD is an error
|
2012-04-05 21:09:24 -05:00
|
|
|
if not ARGV.build_head? and f.stable.nil?
|
2012-03-07 11:16:27 +00:00
|
|
|
raise CannotInstallFormulaError, <<-EOS.undent
|
|
|
|
#{f} is a head-only formula
|
|
|
|
Install with `brew install --HEAD #{f.name}
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
# Building stable-only with --HEAD is an error
|
2012-04-05 21:09:24 -05:00
|
|
|
if ARGV.build_head? and f.head.nil?
|
2012-03-07 11:16:27 +00:00
|
|
|
raise CannotInstallFormulaError, "No head is defined for #{f.name}"
|
|
|
|
end
|
2012-03-15 12:32:03 +00:00
|
|
|
|
2012-08-19 17:36:10 -04:00
|
|
|
unless ignore_deps
|
|
|
|
unlinked_deps = f.recursive_deps.select do |dep|
|
|
|
|
dep.installed? and not dep.keg_only? and not dep.linked_keg.directory?
|
2012-03-15 12:32:03 +00:00
|
|
|
end
|
2012-08-19 17:36:10 -04:00
|
|
|
raise CannotInstallFormulaError,
|
|
|
|
"You must `brew link #{unlinked_deps*' '}' before #{f} can be installed" unless unlinked_deps.empty?
|
|
|
|
end
|
2012-03-16 11:55:30 +00:00
|
|
|
|
|
|
|
rescue FormulaUnavailableError => e
|
|
|
|
# this is sometimes wrong if the dependency chain is more than one deep
|
|
|
|
# but can't easily fix this without a rewrite FIXME-brew2
|
|
|
|
e.dependent = f.name
|
|
|
|
raise
|
2009-10-26 18:13:38 +00:00
|
|
|
end
|
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
def install
|
2012-03-07 11:16:27 +00:00
|
|
|
# not in initialize so upgrade can unlink the active keg before calling this
|
|
|
|
# function but after instantiating this class so that it can avoid having to
|
|
|
|
# relink the active keg if possible (because it is slow).
|
|
|
|
if f.linked_keg.directory?
|
|
|
|
# some other version is already installed *and* linked
|
|
|
|
raise CannotInstallFormulaError, <<-EOS.undent
|
|
|
|
#{f}-#{f.linked_keg.realpath.basename} already installed
|
|
|
|
To install this version, first `brew unlink #{f}'
|
|
|
|
EOS
|
|
|
|
end
|
2011-03-09 21:01:23 -08:00
|
|
|
|
2012-08-14 23:13:18 -05:00
|
|
|
unless ignore_deps
|
2012-08-15 18:52:25 -05:00
|
|
|
needed_deps = []
|
|
|
|
needed_reqs = []
|
|
|
|
|
|
|
|
ARGV.filter_for_dependencies do
|
|
|
|
needed_deps = f.recursive_deps.reject{ |d| d.installed? }
|
|
|
|
needed_reqs = f.recursive_requirements.reject { |r| r.satisfied? }
|
|
|
|
end
|
|
|
|
|
|
|
|
unless needed_reqs.empty?
|
|
|
|
puts needed_reqs.map { |r| r.message } * "\n"
|
|
|
|
fatals = needed_reqs.select { |r| r.fatal? }
|
|
|
|
raise UnsatisfiedRequirements.new(f, fatals) unless fatals.empty?
|
2012-02-28 19:56:35 -08:00
|
|
|
end
|
2011-08-23 23:30:52 +01:00
|
|
|
|
2011-04-06 12:22:28 -07:00
|
|
|
unless needed_deps.empty?
|
|
|
|
needed_deps.each do |dep|
|
2011-11-26 21:03:46 -08:00
|
|
|
if dep.explicitly_requested?
|
|
|
|
install_dependency dep
|
|
|
|
else
|
|
|
|
ARGV.filter_for_dependencies do
|
|
|
|
# Re-create the formula object so that args like `--HEAD` won't
|
2011-11-29 10:43:02 -06:00
|
|
|
# affect properties like the installation prefix. Also need to
|
|
|
|
# re-check installed status as the Formula may have changed.
|
2011-12-26 11:55:05 -08:00
|
|
|
dep = Formula.factory dep.path
|
2011-11-29 10:43:02 -06:00
|
|
|
install_dependency dep unless dep.installed?
|
2011-11-26 21:03:46 -08:00
|
|
|
end
|
|
|
|
end
|
2011-04-06 12:22:28 -07:00
|
|
|
end
|
2011-08-23 23:30:52 +01:00
|
|
|
# now show header as all the deps stuff has clouded the original issue
|
|
|
|
show_header = true
|
2011-02-20 12:20:07 -05:00
|
|
|
end
|
2010-04-08 14:50:06 -07:00
|
|
|
end
|
2010-01-13 09:00:24 +00:00
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
oh1 "Installing #{f}" if show_header
|
|
|
|
|
|
|
|
@@attempted ||= Set.new
|
|
|
|
raise FormulaInstallationAlreadyAttemptedError, f if @@attempted.include? f
|
|
|
|
@@attempted << f
|
|
|
|
|
|
|
|
if install_bottle
|
|
|
|
pour
|
|
|
|
else
|
|
|
|
build
|
|
|
|
clean
|
2010-02-09 11:30:16 -08:00
|
|
|
end
|
2011-08-23 23:30:52 +01:00
|
|
|
|
2012-08-10 16:04:56 -04:00
|
|
|
opoo "Nothing was installed to #{f.prefix}" unless f.installed?
|
2010-02-09 11:30:16 -08:00
|
|
|
end
|
|
|
|
|
2011-11-26 21:03:46 -08:00
|
|
|
def install_dependency dep
|
2012-03-23 13:05:08 -05:00
|
|
|
dep_tab = Tab.for_formula(dep)
|
2012-03-07 13:48:04 +00:00
|
|
|
outdated_keg = Keg.new(dep.linked_keg.realpath) rescue nil
|
|
|
|
|
2012-03-23 13:05:08 -05:00
|
|
|
fi = FormulaInstaller.new(dep, dep_tab)
|
2011-11-26 21:03:46 -08:00
|
|
|
fi.ignore_deps = true
|
|
|
|
fi.show_header = false
|
|
|
|
oh1 "Installing #{f} dependency: #{dep}"
|
2012-03-07 13:48:04 +00:00
|
|
|
outdated_keg.unlink if outdated_keg
|
2011-11-26 21:03:46 -08:00
|
|
|
fi.install
|
|
|
|
fi.caveats
|
|
|
|
fi.finish
|
2012-03-07 13:48:04 +00:00
|
|
|
ensure
|
|
|
|
# restore previous installation state if build failed
|
|
|
|
outdated_keg.link if outdated_keg and not dep.installed? rescue nil
|
2011-11-26 21:03:46 -08:00
|
|
|
end
|
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
def caveats
|
2012-07-18 03:27:42 -05:00
|
|
|
unless f.caveats.to_s.strip.empty?
|
2011-08-23 23:30:52 +01:00
|
|
|
ohai "Caveats", f.caveats
|
|
|
|
@show_summary_heading = true
|
2010-02-09 11:30:16 -08:00
|
|
|
end
|
2011-12-20 20:11:54 -08:00
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
if f.keg_only?
|
|
|
|
ohai 'Caveats', f.keg_only_text
|
|
|
|
@show_summary_heading = true
|
|
|
|
else
|
2012-02-19 19:09:38 -08:00
|
|
|
audit_bin
|
2012-02-26 16:33:44 -08:00
|
|
|
audit_sbin
|
2012-02-19 19:09:38 -08:00
|
|
|
audit_lib
|
2011-08-23 23:30:52 +01:00
|
|
|
check_manpages
|
|
|
|
check_infopages
|
|
|
|
check_m4
|
|
|
|
end
|
2012-07-18 03:22:00 -05:00
|
|
|
|
|
|
|
keg = Keg.new(f.prefix)
|
|
|
|
|
|
|
|
if keg.completion_installed? :bash
|
|
|
|
ohai 'Caveats', <<-EOS.undent
|
|
|
|
Bash completion has been installed to:
|
|
|
|
#{HOMEBREW_PREFIX}/etc/bash_completion.d
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
if keg.completion_installed? :zsh
|
|
|
|
ohai 'Caveats', <<-EOS.undent
|
|
|
|
zsh completion has been installed to:
|
|
|
|
#{HOMEBREW_PREFIX}/share/zsh/site-functions
|
|
|
|
EOS
|
|
|
|
end
|
2011-08-23 23:30:52 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def finish
|
|
|
|
ohai 'Finishing up' if ARGV.verbose?
|
|
|
|
|
2012-08-10 16:33:22 -04:00
|
|
|
if f.keg_only?
|
|
|
|
begin
|
|
|
|
Keg.new(f.prefix).optlink
|
|
|
|
rescue Exception => e
|
|
|
|
onoe "Failed to create: #{f.opt_prefix}"
|
|
|
|
puts "Things that depend on #{f} will probably not build."
|
|
|
|
end
|
|
|
|
else
|
2011-09-13 19:40:51 -07:00
|
|
|
link
|
2012-08-10 16:33:22 -04:00
|
|
|
check_PATH unless f.keg_only?
|
2011-09-13 19:40:51 -07:00
|
|
|
end
|
2012-08-10 16:33:22 -04:00
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
fix_install_names
|
|
|
|
|
|
|
|
ohai "Summary" if ARGV.verbose? or show_summary_heading
|
|
|
|
print "#{f.prefix}: #{f.prefix.abv}"
|
|
|
|
print ", built in #{pretty_duration build_time}" if build_time
|
|
|
|
puts
|
2009-10-26 18:13:38 +00:00
|
|
|
end
|
2010-07-20 21:03:25 -07:00
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
def build_time
|
|
|
|
@build_time ||= Time.now - @start_time unless install_bottle or ARGV.interactive? or @start_time.nil?
|
|
|
|
end
|
2009-10-26 18:13:38 +00:00
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
def build
|
|
|
|
@start_time = Time.now
|
2009-10-26 18:13:38 +00:00
|
|
|
|
|
|
|
# 1. formulae can modify ENV, so we must ensure that each
|
2010-11-09 12:57:41 +00:00
|
|
|
# installation has a pristine ENV when it starts, forking now is
|
2009-10-26 18:13:38 +00:00
|
|
|
# the easiest way to do this
|
|
|
|
# 2. formulae have access to __END__ the only way to allow this is
|
|
|
|
# to make the formula script the executed script
|
|
|
|
read, write = IO.pipe
|
|
|
|
# I'm guessing this is not a good way to do this, but I'm no UNIX guru
|
|
|
|
ENV['HOMEBREW_ERROR_PIPE'] = write.to_i.to_s
|
|
|
|
|
2011-11-26 21:03:46 -08:00
|
|
|
args = ARGV.clone
|
2012-08-28 14:27:08 -05:00
|
|
|
args.concat tab.used_options unless tab.nil? or args.include? '--fresh'
|
|
|
|
# FIXME: enforce the download of the non-bottled package
|
|
|
|
# in the spawned Ruby process.
|
|
|
|
args << '--build-from-source'
|
|
|
|
args.uniq! # Just in case some dupes were added
|
2011-11-26 21:03:46 -08:00
|
|
|
|
2010-11-09 12:57:41 +00:00
|
|
|
fork do
|
|
|
|
begin
|
|
|
|
read.close
|
|
|
|
exec '/usr/bin/nice',
|
2012-05-19 19:57:56 -05:00
|
|
|
'/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby',
|
2012-08-06 13:06:16 -04:00
|
|
|
'-W0',
|
2010-11-09 12:57:41 +00:00
|
|
|
'-I', Pathname.new(__FILE__).dirname,
|
2011-08-24 13:12:36 +01:00
|
|
|
'-rbuild',
|
2010-11-09 12:57:41 +00:00
|
|
|
'--',
|
2011-06-21 06:57:07 -07:00
|
|
|
f.path,
|
2011-09-22 16:09:44 -07:00
|
|
|
*args.options_only
|
2010-11-09 12:57:41 +00:00
|
|
|
rescue Exception => e
|
|
|
|
Marshal.dump(e, write)
|
2009-10-26 18:13:38 +00:00
|
|
|
write.close
|
2010-11-09 12:57:41 +00:00
|
|
|
exit! 1
|
2009-10-26 18:13:38 +00:00
|
|
|
end
|
|
|
|
end
|
2010-11-09 12:57:41 +00:00
|
|
|
|
|
|
|
ignore_interrupts do # the fork will receive the interrupt and marshall it back
|
|
|
|
write.close
|
|
|
|
Process.wait
|
|
|
|
data = read.read
|
|
|
|
raise Marshal.load(data) unless data.nil? or data.empty?
|
2012-08-22 15:50:27 -04:00
|
|
|
raise Interrupt if $?.exitstatus == 130
|
2010-11-09 12:57:41 +00:00
|
|
|
raise "Suspicious installation failure" unless $?.success?
|
2012-08-10 16:04:56 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# This is the installation receipt. The reason this comment is necessary
|
|
|
|
# is because some numpty decided to call the class Tab rather than
|
|
|
|
# the far more appropriate InstallationReceipt :P
|
|
|
|
Tab.for_install(f, args).write
|
2011-09-22 20:07:39 -07:00
|
|
|
|
2012-08-10 16:04:56 -04:00
|
|
|
rescue Exception => e
|
|
|
|
ignore_interrupts do
|
|
|
|
# any exceptions must leave us with nothing installed
|
|
|
|
if f.prefix.directory?
|
|
|
|
puts "One sec, just cleaning up..." if e.kind_of? Interrupt
|
|
|
|
f.prefix.rmtree
|
|
|
|
end
|
|
|
|
f.rack.rmdir_if_possible
|
2010-11-09 12:57:41 +00:00
|
|
|
end
|
2012-08-10 16:04:56 -04:00
|
|
|
raise
|
2009-10-26 18:13:38 +00:00
|
|
|
end
|
2011-08-23 23:30:52 +01:00
|
|
|
|
|
|
|
def link
|
2012-02-21 11:40:06 +00:00
|
|
|
if f.linked_keg.directory? and f.linked_keg.realpath == f.prefix
|
|
|
|
opoo "This keg was marked linked already, continuing anyway"
|
|
|
|
# otherwise Keg.link will bail
|
|
|
|
f.linked_keg.unlink
|
|
|
|
end
|
|
|
|
|
2012-03-06 13:02:10 +00:00
|
|
|
keg = Keg.new(f.prefix)
|
|
|
|
|
2012-08-22 15:50:27 -04:00
|
|
|
begin
|
|
|
|
keg.link
|
|
|
|
rescue Exception => e
|
|
|
|
onoe "The `brew link` step did not complete successfully"
|
|
|
|
puts "The formula built, but is not symlinked into #{HOMEBREW_PREFIX}"
|
|
|
|
puts "You can try again using `brew link #{f.name}'"
|
|
|
|
ohai e, e.backtrace if ARGV.debug?
|
|
|
|
@show_summary_heading = true
|
|
|
|
ignore_interrupts{ keg.unlink }
|
|
|
|
raise unless e.kind_of? RuntimeError
|
|
|
|
end
|
2011-08-23 23:30:52 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def fix_install_names
|
|
|
|
Keg.new(f.prefix).fix_install_names
|
|
|
|
rescue Exception => e
|
|
|
|
onoe "Failed to fix install names"
|
|
|
|
puts "The formula built, but you may encounter issues using it or linking other"
|
|
|
|
puts "formula against it."
|
|
|
|
ohai e, e.backtrace if ARGV.debug?
|
|
|
|
@show_summary_heading = true
|
|
|
|
end
|
|
|
|
|
|
|
|
def clean
|
2012-08-29 15:43:28 -04:00
|
|
|
if f.class.skip_clean_all?
|
|
|
|
opoo "skip_clean :all is deprecated"
|
|
|
|
puts "Skip clean was commonly used to prevent brew from stripping binaries."
|
|
|
|
puts "brew no longer strips binaries, if skip_clean is required to prevent"
|
|
|
|
puts "brew from removing empty directories, you should specify exact paths"
|
|
|
|
puts "in the formula."
|
|
|
|
return
|
|
|
|
end
|
2011-08-23 23:30:52 +01:00
|
|
|
require 'cleaner'
|
2011-08-24 01:13:15 +01:00
|
|
|
Cleaner.new f
|
2011-08-23 23:30:52 +01:00
|
|
|
rescue Exception => e
|
|
|
|
opoo "The cleaning step did not complete successfully"
|
|
|
|
puts "Still, the installation was successful, so we will link it into your prefix"
|
|
|
|
ohai e, e.backtrace if ARGV.debug?
|
|
|
|
@show_summary_heading = true
|
|
|
|
end
|
|
|
|
|
2011-08-24 01:13:15 +01:00
|
|
|
def pour
|
2012-03-18 15:14:14 +13:00
|
|
|
fetched, downloader = f.fetch
|
2012-04-05 21:09:24 -05:00
|
|
|
f.verify_download_integrity fetched
|
2011-08-24 01:13:15 +01:00
|
|
|
HOMEBREW_CELLAR.cd do
|
|
|
|
downloader.stage
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
## checks
|
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
def check_PATH
|
|
|
|
# warn the user if stuff was installed outside of their PATH
|
|
|
|
[f.bin, f.sbin].each do |bin|
|
2011-08-24 17:33:28 -07:00
|
|
|
if bin.directory? and bin.children.length > 0
|
2012-09-11 00:34:36 -05:00
|
|
|
bin = (HOMEBREW_PREFIX/bin.basename).realpath
|
|
|
|
unless ORIGINAL_PATHS.include? bin
|
2011-08-23 23:30:52 +01:00
|
|
|
opoo "#{bin} is not in your PATH"
|
|
|
|
puts "You can amend this by altering your ~/.bashrc file"
|
|
|
|
@show_summary_heading = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_manpages
|
|
|
|
# Check for man pages that aren't in share/man
|
2012-09-11 00:34:36 -05:00
|
|
|
if (f.prefix+'man').directory?
|
2011-12-10 17:14:38 -06:00
|
|
|
opoo 'A top-level "man" directory was found.'
|
2011-08-23 23:30:52 +01:00
|
|
|
puts "Homebrew requires that man pages live under share."
|
|
|
|
puts 'This can often be fixed by passing "--mandir=#{man}" to configure.'
|
|
|
|
@show_summary_heading = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_infopages
|
|
|
|
# Check for info pages that aren't in share/info
|
2012-09-11 00:34:36 -05:00
|
|
|
if (f.prefix+'info').directory?
|
2011-12-10 17:14:38 -06:00
|
|
|
opoo 'A top-level "info" directory was found.'
|
2011-08-23 23:30:52 +01:00
|
|
|
puts "Homebrew suggests that info pages live under share."
|
|
|
|
puts 'This can often be fixed by passing "--infodir=#{info}" to configure.'
|
|
|
|
@show_summary_heading = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_jars
|
2012-09-11 00:34:36 -05:00
|
|
|
return unless f.lib.directory?
|
2012-02-19 19:09:38 -08:00
|
|
|
|
2012-02-25 20:57:00 -08:00
|
|
|
jars = f.lib.children.select{|g| g.to_s =~ /\.jar$/}
|
|
|
|
unless jars.empty?
|
2012-02-19 19:09:38 -08:00
|
|
|
opoo 'JARs were installed to "lib".'
|
|
|
|
puts "Installing JARs to \"lib\" can cause conflicts between packages."
|
|
|
|
puts "For Java software, it is typically better for the formula to"
|
|
|
|
puts "install to \"libexec\" and then symlink or wrap binaries into \"bin\"."
|
|
|
|
puts "See \"activemq\", \"jruby\", etc. for examples."
|
2012-02-25 20:57:00 -08:00
|
|
|
puts "The offending files are:"
|
|
|
|
puts jars
|
2012-02-19 19:09:38 -08:00
|
|
|
@show_summary_heading = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_non_libraries
|
2012-09-11 00:34:36 -05:00
|
|
|
return unless f.lib.directory?
|
2012-02-19 19:09:38 -08:00
|
|
|
|
2012-06-14 09:55:05 -07:00
|
|
|
valid_extensions = %w(.a .dylib .framework .jnilib .la .o .so
|
|
|
|
.jar .prl .pm)
|
2012-02-19 19:09:38 -08:00
|
|
|
non_libraries = f.lib.children.select do |g|
|
|
|
|
next if g.directory?
|
2012-06-14 09:55:05 -07:00
|
|
|
not valid_extensions.include? g.extname
|
2012-02-19 19:09:38 -08:00
|
|
|
end
|
|
|
|
|
|
|
|
unless non_libraries.empty?
|
|
|
|
opoo 'Non-libraries were installed to "lib".'
|
|
|
|
puts "Installing non-libraries to \"lib\" is bad practice."
|
|
|
|
puts "The offending files are:"
|
|
|
|
puts non_libraries
|
|
|
|
@show_summary_heading = true
|
2011-08-23 23:30:52 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-02-19 19:09:38 -08:00
|
|
|
def audit_bin
|
2012-09-11 00:34:36 -05:00
|
|
|
return unless f.bin.directory?
|
2012-02-19 19:09:38 -08:00
|
|
|
|
2012-09-11 00:34:36 -05:00
|
|
|
non_exes = f.bin.children.select { |g| g.directory? or not g.executable? }
|
2012-02-19 19:09:38 -08:00
|
|
|
|
|
|
|
unless non_exes.empty?
|
|
|
|
opoo 'Non-executables were installed to "bin".'
|
|
|
|
puts "Installing non-executables to \"bin\" is bad practice."
|
2012-02-26 16:33:44 -08:00
|
|
|
puts "The offending files are:"
|
|
|
|
puts non_exes
|
|
|
|
@show_summary_heading = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def audit_sbin
|
2012-09-11 00:34:36 -05:00
|
|
|
return unless f.sbin.directory?
|
2012-02-26 16:33:44 -08:00
|
|
|
|
2012-09-11 00:34:36 -05:00
|
|
|
non_exes = f.sbin.children.select { |g| g.directory? or not g.executable? }
|
2012-02-26 16:33:44 -08:00
|
|
|
|
|
|
|
unless non_exes.empty?
|
|
|
|
opoo 'Non-executables were installed to "sbin".'
|
|
|
|
puts "Installing non-executables to \"sbin\" is bad practice."
|
2012-02-19 19:09:38 -08:00
|
|
|
puts "The offending files are:"
|
|
|
|
puts non_exes
|
|
|
|
@show_summary_heading = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def audit_lib
|
|
|
|
check_jars
|
|
|
|
check_non_libraries
|
|
|
|
end
|
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
def check_m4
|
2012-07-09 08:39:23 -07:00
|
|
|
# Newer versions of Xcode don't come with autotools
|
2012-09-11 00:34:36 -05:00
|
|
|
return unless MacOS::Xcode.provides_autotools?
|
2012-02-27 00:41:17 +00:00
|
|
|
|
2012-07-09 08:39:23 -07:00
|
|
|
# If the user has added our path to dirlist, don't complain
|
2012-05-13 18:40:04 -05:00
|
|
|
return if File.open("/usr/share/aclocal/dirlist") do |dirlist|
|
|
|
|
dirlist.grep(%r{^#{HOMEBREW_PREFIX}/share/aclocal$}).length > 0
|
|
|
|
end rescue false
|
|
|
|
|
2012-07-09 08:39:23 -07:00
|
|
|
# Check for installed m4 files
|
2012-05-13 18:40:04 -05:00
|
|
|
if Dir[f.share+"aclocal/*.m4"].length > 0
|
2011-08-23 23:30:52 +01:00
|
|
|
opoo 'm4 macros were installed to "share/aclocal".'
|
|
|
|
puts "Homebrew does not append \"#{HOMEBREW_PREFIX}/share/aclocal\""
|
|
|
|
puts "to \"/usr/share/aclocal/dirlist\". If an autoconf script you use"
|
|
|
|
puts "requires these m4 macros, you'll need to add this path manually."
|
|
|
|
@show_summary_heading = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
class Formula
|
2011-09-01 10:06:28 -07:00
|
|
|
def keg_only_text
|
2012-08-10 16:34:20 -04:00
|
|
|
s = "This formula is keg-only: so it was not symlinked into #{HOMEBREW_PREFIX}."
|
|
|
|
s << "\n\n#{keg_only_reason.to_s}"
|
|
|
|
if lib.directory? or include.directory?
|
|
|
|
s <<
|
|
|
|
<<-EOS.undent_________________________________________________________72
|
2011-08-23 23:30:52 +01:00
|
|
|
|
|
|
|
|
2012-08-10 16:34:20 -04:00
|
|
|
Generally there are no consequences of this for you. If you build your
|
|
|
|
own software and it requires this formula, you'll need to add to your
|
|
|
|
build variables:
|
2011-08-23 23:30:52 +01:00
|
|
|
|
2012-08-10 16:34:20 -04:00
|
|
|
EOS
|
|
|
|
s << " LDFLAGS: -L#{HOMEBREW_PREFIX}/opt/#{name}/lib\n" if lib.directory?
|
|
|
|
s << " CPPFLAGS: -I#{HOMEBREW_PREFIX}/opt/#{name}/include\n" if include.directory?
|
|
|
|
end
|
|
|
|
s << "\n"
|
2011-08-23 23:30:52 +01:00
|
|
|
end
|
2009-10-26 18:13:38 +00:00
|
|
|
end
|