A install name fix step during install
We currently only fix relative paths, but we should expand this more.
This commit is contained in:
parent
123f7cd00e
commit
521f1ec959
@ -120,6 +120,18 @@ def install f
|
|||||||
|
|
||||||
ohai 'Finishing up' if ARGV.verbose?
|
ohai 'Finishing up' if ARGV.verbose?
|
||||||
|
|
||||||
|
keg = Keg.new f.prefix
|
||||||
|
|
||||||
|
begin
|
||||||
|
keg.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
|
||||||
|
|
||||||
begin
|
begin
|
||||||
require 'cleaner'
|
require 'cleaner'
|
||||||
Cleaner.new f
|
Cleaner.new f
|
||||||
@ -177,10 +189,10 @@ def install f
|
|||||||
|
|
||||||
# link from Cellar to Prefix
|
# link from Cellar to Prefix
|
||||||
begin
|
begin
|
||||||
Keg.new(f.prefix).link
|
keg.link
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
onoe "The linking step did not complete successfully"
|
onoe "The linking step did not complete successfully"
|
||||||
puts "The package built, but is not symlinked into #{HOMEBREW_PREFIX}"
|
puts "The formula built, but is not symlinked into #{HOMEBREW_PREFIX}"
|
||||||
puts "You can try again using `brew link #{f.name}'"
|
puts "You can try again using `brew link #{f.name}'"
|
||||||
if ARGV.debug?
|
if ARGV.debug?
|
||||||
ohai e, e.backtrace
|
ohai e, e.backtrace
|
||||||
|
|||||||
@ -122,3 +122,5 @@ protected
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
require 'keg_fix_install_names'
|
||||||
|
|||||||
45
Library/Homebrew/keg_fix_install_names.rb
Normal file
45
Library/Homebrew/keg_fix_install_names.rb
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
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.start_with? '/' }
|
||||||
|
|
||||||
|
unless install_names.empty? and id == dylib # avoid the work if possible
|
||||||
|
yield dylib, install_names
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def dylibs
|
||||||
|
if (lib = join 'lib').directory?
|
||||||
|
lib.children.select{ |pn| pn.extname == '.dylib' and not pn.symlink? }
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
x
Reference in New Issue
Block a user