brew/Library/Homebrew/keg_fix_install_names.rb
Jack Nagel 7bb1894df5 fix_install_names: use Mach-O methods to find dylibs
Some libraries do not have the .dylib extension (e.g. Qt framework
libs), but need to have their install names rewritten to prevent other
packages from breaking due to upgrades. Use the new Pathname#dylib?
instead.
2012-05-30 22:32:48 -05:00

59 lines
1.8 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|
new_name = bad_name
new_name = Pathname.new(bad_name).basename unless (dylib.parent + new_name).exist?
# this fixes some problems, maybe not all. opencv seems to have badnames of the type
# "lib/libblah.dylib"
if (dylib.parent + new_name).exist?
system "install_name_tool", "-change", bad_name, "@loader_path/#{new_name}", dylib
else
opoo "Could not fix install names for #{dylib}"
end
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
require 'find'
dylibs = []
if (lib = join 'lib').directory?
lib.find do |pn|
next if pn.symlink? or pn.directory?
dylibs << pn if pn.dylib?
end
end
dylibs
end
end