mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00

This file is installed by a number of packages, but it really shouldn't be. It is meant to be updated by packages that use it, but this is broken (1) by software that doesn't do this correctly and (2) by the symlink being overwritten by Homebrew's linking code. It's presence can cause issues with tools that use libiconv/gettext. Instead let's follow MacPorts' example and just remove it during the clean stage. Signed-off-by: Jack Nagel <jacknagel@gmail.com>
89 lines
2.4 KiB
Ruby
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
|