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'
|
2013-01-01 17:26:50 +00:00
|
|
|
require 'caveats'
|
2009-10-26 18:13:38 +00:00
|
|
|
|
|
|
|
class FormulaInstaller
|
2011-08-23 23:30:52 +01:00
|
|
|
attr :f
|
2013-01-23 00:26:27 -06:00
|
|
|
attr :tab, true
|
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
|
|
|
|
2013-01-23 00:26:27 -06:00
|
|
|
def initialize ff
|
2011-08-23 23:30:52 +01:00
|
|
|
@f = ff
|
2012-08-22 19:49:17 -05:00
|
|
|
@show_header = false
|
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
|
|
|
|
2013-01-13 15:39:50 -06:00
|
|
|
@@attempted ||= Set.new
|
|
|
|
|
2013-01-23 00:26:25 -06:00
|
|
|
lock
|
2012-03-07 11:16:27 +00:00
|
|
|
check_install_sanity
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_install_sanity
|
2013-01-08 19:54:32 -06:00
|
|
|
raise FormulaInstallationAlreadyAttemptedError, f if @@attempted.include? f
|
|
|
|
|
2012-03-07 11:16:27 +00:00
|
|
|
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
|
|
|
|
2013-01-23 00:26:24 -06:00
|
|
|
unless ignore_deps
|
2012-11-11 18:07:03 -06:00
|
|
|
# HACK: If readline is present in the dependency tree, it will clash
|
|
|
|
# with the stdlib's Readline module when the debugger is loaded
|
|
|
|
if f.recursive_deps.any? { |d| d.name == "readline" } and ARGV.debug?
|
|
|
|
ENV['HOMEBREW_NO_READLINE'] = '1'
|
|
|
|
end
|
|
|
|
|
2013-01-23 00:26:25 -06:00
|
|
|
check_requirements
|
|
|
|
install_dependencies
|
2010-04-08 14:50:06 -07:00
|
|
|
end
|
2010-01-13 09:00:24 +00:00
|
|
|
|
2012-11-13 12:50:24 +01:00
|
|
|
oh1 "Installing #{Tty.green}#{f}#{Tty.reset}" if show_header
|
2011-08-23 23:30:52 +01:00
|
|
|
|
2013-01-13 15:39:50 -06:00
|
|
|
@@attempted << f
|
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
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
|
|
|
|
|
2013-01-23 00:26:24 -06:00
|
|
|
def check_requirements
|
|
|
|
needed_reqs = ARGV.filter_for_dependencies do
|
|
|
|
f.recursive_requirements.reject(&:satisfied?)
|
|
|
|
end
|
|
|
|
|
2013-01-23 00:26:25 -06:00
|
|
|
needed_reqs.reject!(&:build?) if install_bottle
|
|
|
|
|
2013-01-23 00:26:24 -06:00
|
|
|
unless needed_reqs.empty?
|
|
|
|
puts needed_reqs.map(&:message) * "\n"
|
|
|
|
fatals = needed_reqs.select(&:fatal?)
|
|
|
|
raise UnsatisfiedRequirements.new(f, fatals) unless fatals.empty?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-01-23 00:26:25 -06:00
|
|
|
def dep_needed? dep
|
|
|
|
dep_f = dep.to_formula
|
|
|
|
if dep_f.installed?
|
|
|
|
# If the dep is already installed, skip it.
|
|
|
|
false
|
2013-01-23 00:26:25 -06:00
|
|
|
elsif install_bottle and dep.build?
|
|
|
|
# We skip build-time deps when installing bottles.
|
|
|
|
false
|
2013-01-23 00:26:25 -06:00
|
|
|
else
|
|
|
|
# Otherwise, we need to install it.
|
|
|
|
true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def effective_deps
|
|
|
|
@deps ||= begin
|
|
|
|
deps = Set.new
|
|
|
|
|
|
|
|
# If a dep was also requested on the command line, we let it honor
|
|
|
|
# any influential flags (--HEAD, --devel, etc.) the user has passed
|
|
|
|
# when we check the installed status.
|
|
|
|
requested_deps = f.recursive_dependencies.select do |dep|
|
|
|
|
dep_f = dep.to_formula
|
|
|
|
dep_f.requested? and not dep_f.installed?
|
|
|
|
end
|
|
|
|
|
|
|
|
# Otherwise, we filter these influential flags so that they do not
|
|
|
|
# affect installation prefixes and other properties when we decide
|
|
|
|
# whether or not the dep is needed.
|
|
|
|
necessary_deps = ARGV.filter_for_dependencies do
|
|
|
|
f.recursive_dependencies.select { |d| dep_needed? d }
|
|
|
|
end
|
|
|
|
|
|
|
|
deps.merge(requested_deps)
|
|
|
|
deps.merge(necessary_deps)
|
|
|
|
|
|
|
|
# Now that we've determined which deps we need, map them back
|
|
|
|
# onto recursive_dependencies to preserve installation order
|
|
|
|
f.recursive_dependencies.select { |d| deps.include? d }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def install_dependencies
|
|
|
|
effective_deps.each do |dep|
|
|
|
|
if dep.requested?
|
|
|
|
install_dependency(dep)
|
|
|
|
else
|
|
|
|
ARGV.filter_for_dependencies { install_dependency(dep) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
@show_header = true unless effective_deps.empty?
|
|
|
|
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)
|
2013-01-23 00:26:25 -06:00
|
|
|
dep = dep.to_formula
|
2013-01-23 00:26:27 -06:00
|
|
|
|
2012-03-07 13:48:04 +00:00
|
|
|
outdated_keg = Keg.new(dep.linked_keg.realpath) rescue nil
|
|
|
|
|
2013-01-23 00:26:27 -06:00
|
|
|
fi = FormulaInstaller.new(dep)
|
|
|
|
fi.tab = dep_tab
|
2011-11-26 21:03:46 -08:00
|
|
|
fi.ignore_deps = true
|
|
|
|
fi.show_header = false
|
2012-11-13 12:50:24 +01:00
|
|
|
oh1 "Installing #{f} dependency: #{Tty.green}#{dep}#{Tty.reset}"
|
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
|
2013-01-01 17:26:50 +00:00
|
|
|
if (not f.keg_only?) and ARGV.homebrew_developer?
|
2012-12-31 17:51:57 +00:00
|
|
|
audit_bin
|
|
|
|
audit_sbin
|
|
|
|
audit_lib
|
|
|
|
check_manpages
|
|
|
|
check_infopages
|
2011-08-23 23:30:52 +01:00
|
|
|
end
|
2012-07-18 03:22:00 -05:00
|
|
|
|
2013-01-12 13:08:29 -06:00
|
|
|
c = Caveats.new(f)
|
|
|
|
|
|
|
|
unless c.empty?
|
|
|
|
@show_summary_heading = true
|
|
|
|
ohai 'Caveats', c.caveats
|
|
|
|
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
|
|
|
|
2012-09-11 20:57:41 -04:00
|
|
|
install_plist
|
2011-08-23 23:30:52 +01:00
|
|
|
fix_install_names
|
|
|
|
|
2013-01-12 13:08:29 -06:00
|
|
|
ohai "Summary" if ARGV.verbose? or show_summary_heading
|
2013-01-15 10:28:07 +01:00
|
|
|
unless ENV['HOMEBREW_NO_EMOJI']
|
|
|
|
print "🍺 " if MacOS.version >= :lion
|
|
|
|
end
|
2011-08-23 23:30:52 +01:00
|
|
|
print "#{f.prefix}: #{f.prefix.abv}"
|
|
|
|
print ", built in #{pretty_duration build_time}" if build_time
|
|
|
|
puts
|
2013-01-23 00:26:25 -06:00
|
|
|
|
|
|
|
unlock if hold_locks?
|
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
|
2012-09-11 20:59:59 -04:00
|
|
|
FileUtils.rm Dir["#{HOMEBREW_LOGS}/#{f}/*"]
|
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
@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
|
2013-01-23 00:26:23 -06:00
|
|
|
args.concat(tab.used_options.as_flags) unless tab.nil? or args.include? '--fresh'
|
2012-08-28 14:27:08 -05:00
|
|
|
# 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
|
|
|
|
2012-09-11 20:59:59 -04:00
|
|
|
ignore_interrupts(:quietly) do # the fork will receive the interrupt and marshall it back
|
2010-11-09 12:57:41 +00:00
|
|
|
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
|
|
|
|
|
2012-09-11 20:59:59 -04:00
|
|
|
raise "Empty installation" if Dir["#{f.prefix}/*"].empty?
|
|
|
|
|
2013-01-23 00:26:20 -06:00
|
|
|
Tab.create(f, args).write # INSTALL_RECEIPT.json
|
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
|
2012-09-11 20:59:59 -04:00
|
|
|
f.prefix.rmtree if f.prefix.directory?
|
2012-08-10 16:04:56 -04:00
|
|
|
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
|
|
|
|
|
2012-09-11 20:57:41 -04:00
|
|
|
def install_plist
|
2012-11-25 15:06:41 +00:00
|
|
|
return unless f.plist
|
|
|
|
# A plist may already exist if we are installing from a bottle
|
|
|
|
f.plist_path.unlink if f.plist_path.exist?
|
|
|
|
f.plist_path.write f.plist
|
|
|
|
f.plist_path.chmod 0644
|
2012-09-11 20:57:41 -04:00
|
|
|
end
|
|
|
|
|
2011-08-23 23:30:52 +01:00
|
|
|
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-09-18 16:25:44 -04:00
|
|
|
ohai "Cleaning" if ARGV.verbose?
|
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-11-25 14:33:52 +00:00
|
|
|
f.verify_download_integrity fetched unless downloader.local_bottle_path
|
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
|
2012-09-18 00:45:24 +02:00
|
|
|
.jar .prl .pm .sh)
|
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
|
2013-01-23 00:26:25 -06:00
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def hold_locks?
|
|
|
|
@hold_locks || false
|
|
|
|
end
|
|
|
|
|
|
|
|
def lock
|
|
|
|
if (@@locked ||= []).empty?
|
|
|
|
f.recursive_deps.each { |d| @@locked << d } unless ignore_deps
|
|
|
|
@@locked.unshift(f)
|
|
|
|
@@locked.each(&:lock)
|
|
|
|
@hold_locks = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def unlock
|
|
|
|
if hold_locks?
|
|
|
|
@@locked.each(&:unlock)
|
|
|
|
@@locked.clear
|
|
|
|
@hold_locks = false
|
|
|
|
end
|
|
|
|
end
|
2011-08-23 23:30:52 +01:00
|
|
|
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
|