diff --git a/Library/Homebrew/extend/os/mac/keg_relocate.rb b/Library/Homebrew/extend/os/mac/keg_relocate.rb index 24435b0b76..83888fb51d 100644 --- a/Library/Homebrew/extend/os/mac/keg_relocate.rb +++ b/Library/Homebrew/extend/os/mac/keg_relocate.rb @@ -45,20 +45,24 @@ class Keg change_dylib_id(dylib_id_for(file), file) if file.dylib? each_linkage_for(file, :dynamically_linked_libraries) do |bad_name| - # Don't fix absolute paths unless they are rooted in the build directory - next if bad_name.start_with?("/") && - !rooted_in_build_directory?(bad_name) - - new_name = fixed_name(file, bad_name) - change_install_name(bad_name, new_name, file) if new_name != bad_name + # Don't fix absolute paths unless they are rooted in the build directory. + new_name = if bad_name.start_with?("/") && !rooted_in_build_directory?(bad_name) + bad_name + else + fixed_name(file, bad_name) + end + loader_name = loader_name_for(file, new_name) + change_install_name(bad_name, loader_name, file) if loader_name != bad_name end each_linkage_for(file, :rpaths) do |bad_name| # Strip duplicate rpaths and rpaths rooted in the build directory. - next if !rooted_in_build_directory?(bad_name) && - (file.rpaths.count(bad_name) == 1) - - delete_rpath(bad_name, file) + if rooted_in_build_directory?(bad_name) || (file.rpaths.count(bad_name) > 1) + delete_rpath(bad_name, file) + else + loader_name = loader_name_for(file, bad_name) + change_rpath(bad_name, loader_name, file) if loader_name != bad_name + end end end end @@ -66,6 +70,15 @@ class Keg generic_fix_dynamic_linkage end + def loader_name_for(file, target) + # Use @loader_path-relative install names for other Homebrew-installed binaries. + if ENV["HOMEBREW_RELOCATABLE_INSTALL_NAMES"] && target.start_with?(HOMEBREW_PREFIX) + "@loader_path/#{Pathname(target).relative_path_from(file.dirname)}" + else + target + end + end + # If file is a dylib or bundle itself, look for the dylib named by # bad_name relative to the lib directory, so that we can skip the more # expensive recursive search if possible.