brew/Library/Homebrew/cleaner.rb
Jack Nagel d60f4ffcd8 Restore cleaning of lib/charset.alias
Even though we now prevent linking of this file into the prefix in
Keg#link, its presence still triggers a "non-lib in lib" warning during
installation. So keep cleaning it, and leave the check in Keg#link so
things that skip_clean 'lib' still won't have it linked.

Signed-off-by: Jack Nagel <jacknagel@gmail.com>
2012-03-09 12:41:22 -06:00

89 lines
2.4 KiB
Ruby

class Cleaner
def initialize f
@f = Formula.factory f
[f.bin, f.sbin, f.lib].select{ |d| d.exist? }.each{ |d| clean_dir d }
if ENV['HOMEBREW_KEEP_INFO']
# Get rid of the directory file, so it no longer bother us at link stage.
info_dir_file = f.info + 'dir'
if info_dir_file.file? and not f.skip_clean? info_dir_file
puts "rm #{info_dir_file}" if ARGV.verbose?
info_dir_file.unlink
end
else
f.info.rmtree if f.info.directory? and not f.skip_clean? f.info
end
# Hunt for empty folders and nuke them unless they are protected by
# f.skip_clean? We want post-order traversal, so put the dirs in a stack
# and then pop them off later.
paths = []
f.prefix.find do |path|
paths << path if path.directory?
end
paths.each do |d|
if d.children.empty? and not f.skip_clean? d
puts "rmdir: #{d} (empty)" if ARGV.verbose?
d.rmdir
end
end
end
private
def strip path, args=''
return if @f.skip_clean? path
puts "strip #{path}" if ARGV.verbose?
path.chmod 0644 # so we can strip
unless path.stat.nlink > 1
system "/usr/bin/strip", *(args+path)
else
path = path.to_s.gsub ' ', '\\ '
# strip unlinks the file and recreates it, thus breaking hard links!
# is this expected behaviour? patch does it too… still, this fixes it
tmp = `/usr/bin/mktemp -t homebrew_strip`.chomp
begin
`/usr/bin/strip #{args} -o #{tmp} #{path}`
`/bin/cat #{tmp} > #{path}`
ensure
FileUtils.rm tmp
end
end
end
def clean_file path
perms = 0444
case `/usr/bin/file -h '#{path}'`
when /Mach-O dynamically linked shared library/
# Stripping libraries is causing no end of trouble. Lets just give up,
# and try to do it manually in instances where it makes sense.
#strip path, '-SxX'
when /Mach-O [^ ]* ?executable/
strip path
perms = 0555
when /text executable/
perms = 0555
end
path.chmod perms
end
def clean_dir d
d.find do |path|
if path.directory?
Find.prune if @f.skip_clean? path
elsif not path.file?
next
elsif path.extname == '.la'
# *.la files are stupid
path.unlink unless @f.skip_clean? path
elsif path == @f.lib+'charset.alias'
path.unlink unless @f.skip_clean? path
elsif not path.symlink?
clean_file path
end
end
end
end