mac/keg_relocate: use relative install names

This commit is contained in:
Gabriel Gerlero 2023-07-06 12:36:15 -03:00
parent 9f9ae1edeb
commit 4cfe70ce50

View File

@ -45,20 +45,24 @@ class Keg
change_dylib_id(dylib_id_for(file), file) if file.dylib? change_dylib_id(dylib_id_for(file), file) if file.dylib?
each_linkage_for(file, :dynamically_linked_libraries) do |bad_name| each_linkage_for(file, :dynamically_linked_libraries) do |bad_name|
# Don't fix absolute paths unless they are rooted in the build directory # Don't fix absolute paths unless they are rooted in the build directory.
next if bad_name.start_with?("/") && new_name = if bad_name.start_with?("/") && !rooted_in_build_directory?(bad_name)
!rooted_in_build_directory?(bad_name) bad_name
else
new_name = fixed_name(file, bad_name) fixed_name(file, bad_name)
change_install_name(bad_name, new_name, file) if new_name != 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 end
each_linkage_for(file, :rpaths) do |bad_name| each_linkage_for(file, :rpaths) do |bad_name|
# Strip duplicate rpaths and rpaths rooted in the build directory. # Strip duplicate rpaths and rpaths rooted in the build directory.
next if !rooted_in_build_directory?(bad_name) && if rooted_in_build_directory?(bad_name) || (file.rpaths.count(bad_name) > 1)
(file.rpaths.count(bad_name) == 1) delete_rpath(bad_name, file)
else
delete_rpath(bad_name, file) loader_name = loader_name_for(file, bad_name)
change_rpath(bad_name, loader_name, file) if loader_name != bad_name
end
end end
end end
end end
@ -66,6 +70,15 @@ class Keg
generic_fix_dynamic_linkage generic_fix_dynamic_linkage
end 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 # 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 # bad_name relative to the lib directory, so that we can skip the more
# expensive recursive search if possible. # expensive recursive search if possible.