brew/Library/Homebrew/keg_fix_install_names.rb
Max Howell 870f36769e Fix install_name massaging for keg-only brews
Fixes Homebrew/homebrew#6065.

My pre-emptive fix that avoided calling Pathname.ensure_writable because I was not convinced it worked broke this function due to incorrect logic.

The lesson is, don’t write pre-emptive fixes. Wait until you've seen the bug first. All code has bugs in, so write less. I'm an idiot sometimes.
2011-06-28 17:28:37 +01:00

48 lines
1.4 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class Keg
def fix_install_names
dylibs.each do |dylib|
bad_install_names_for dylib do |id, bad_names|
dylib.ensure_writable do
system "install_name_tool", "-id", id, dylib
bad_names.each do |bad_name|
# we should be more careful here, check the path we point to exists etc.
system "install_name_tool", "-change", bad_name, "@loader_path/#{bad_name}", dylib
end
end
end
end
end
private
OTOOL_RX = /\t(.*) \(compatibility version (\d+\.)*\d+, current version (\d+\.)*\d+\)/
def bad_install_names_for dylib
dylib = dylib.to_s
ENV['HOMEBREW_DYLIB'] = dylib # solves all shell escaping problems
install_names = `otool -L "$HOMEBREW_DYLIB"`.split "\n"
install_names.shift # first line is fluff
install_names.map!{ |s| OTOOL_RX =~ s && $1 }
id = install_names.shift
install_names.compact!
install_names.reject!{ |fn| fn =~ /^@(loader|executable)_path/ }
install_names.reject!{ |fn| fn[0,1] == '/' }
# the shortpath ensures that library upgrades dont break installed tools
shortpath = HOMEBREW_PREFIX + Pathname.new(dylib).relative_path_from(self)
id = if shortpath.exist? then shortpath else dylib end
yield id, install_names
end
def dylibs
if (lib = join 'lib').directory?
lib.children.select{ |pn| pn.extname == '.dylib' and not pn.symlink? }
else
[]
end
end
end