blob: a27243245f2bc42a1ed4af9e307b908bad8d6098 [file] [log] [blame]
require "fileutils"
@current_dir = File.expand_path(File.dirname(__FILE__))
@new_dylib_path = File.join(@current_dir, "..", "bin", "darwin_ruby", "dylibs")
FileUtils.mkdir_p(@new_dylib_path)
def fix_dylib_for_file(file)
results = `otool -L "#{file}"` #Will get information about which dylibs to link
if results.is_a?(String) && results != "" && !results.include?("is not an object file") && !results.include?("Assertion failed:")
# puts "---------------------------------"
puts "--RELINKING--: #{file}"
# puts "---------------------------------"
expanded = File.expand_path(file)
#Setting new ID for this if needed
id_path = File.join("darwin_ruby", "dylibs", File.split(expanded)[-1])
id_reset_results = `install_name_tool -id #{id_path} #{file} 2> /dev/null` #Will link the current file to itself
lines = results.split("\n")
lines = [] unless lines
itterate = lines[1..-1]
itterate = [] unless itterate
itterate.each do |libfile_line|
libfile = libfile_line.split(" (compatibility version")[0].strip
libfile = libfile.split("(")[0]
next if libfile.include?(@new_dylib_path) # We have already fixed this one
next if libfile.include?("/usr/lib/") # These are global and assumed to be present on all versions of osx
next if libfile.include?("/System/Library/") # Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
new_libfile = File.join(@new_dylib_path, File.split(libfile)[-1])
unless File.file?(new_libfile)
FileUtils.copy(libfile, new_libfile)
puts "--COPIED-- #{new_libfile}"
fix_dylib_for_file(new_libfile)
end
relink_command_results = `install_name_tool -change #{libfile} #{new_libfile} #{file} 2> /dev/null` # Will relink external library
puts "Linked: #{new_libfile} to #{file}"
if relink_command_results != "" && !relink_command_results.include?("error:")
puts "relinked in #{file} link: #{libfile} to #{new_libfile}"
end
end
end
end
puts "Relinking files from: #{File.dirname(File.expand_path($0))}"
folders = [File.expand_path(File.join(File.dirname(File.expand_path($0)), "..", "bin", "darwin_ruby"))]
full = folders.map{|f| Dir[File.join(f, '**', '*')]}
actual_files = full.flatten(1).uniq.select{|e| File.file? e}
actual_files.each do |file|
fix_dylib_for_file(file)
end
puts "Relinking of dylib done"