linkage_checker: resolve some variable install names on macOS
This commit is contained in:
		
							parent
							
								
									4cfe70ce50
								
							
						
					
					
						commit
						15a0c7fd7d
					
				@ -103,7 +103,7 @@ class Keg
 | 
			
		||||
 | 
			
		||||
  def each_linkage_for(file, linkage_type, &block)
 | 
			
		||||
    links = file.method(linkage_type)
 | 
			
		||||
                .call
 | 
			
		||||
                .call(resolve_variable_references: false)
 | 
			
		||||
                .grep_v(/^@(loader_|executable_|r)path/)
 | 
			
		||||
    links.each(&block)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,7 @@ class LinkageChecker
 | 
			
		||||
    @unwanted_system_dylibs = []
 | 
			
		||||
    @version_conflict_deps = []
 | 
			
		||||
    @files_missing_rpaths = []
 | 
			
		||||
    @executable_path_dylibs = []
 | 
			
		||||
 | 
			
		||||
    check_dylibs(rebuild_cache: rebuild_cache)
 | 
			
		||||
  end
 | 
			
		||||
@ -39,13 +40,14 @@ class LinkageChecker
 | 
			
		||||
    display_items "System libraries", @system_dylibs
 | 
			
		||||
    display_items "Homebrew libraries", @brewed_dylibs
 | 
			
		||||
    display_items "Indirect dependencies with linkage", @indirect_deps
 | 
			
		||||
    display_items "Variable-referenced libraries", @variable_dylibs
 | 
			
		||||
    display_items "@rpath-referenced libraries", @variable_dylibs
 | 
			
		||||
    display_items "Missing libraries", @broken_dylibs
 | 
			
		||||
    display_items "Broken dependencies", @broken_deps
 | 
			
		||||
    display_items "Undeclared dependencies with linkage", @undeclared_deps
 | 
			
		||||
    display_items "Dependencies with no linkage", @unnecessary_deps
 | 
			
		||||
    display_items "Unwanted system libraries", @unwanted_system_dylibs
 | 
			
		||||
    display_items "Files with missing rpath", @files_missing_rpaths
 | 
			
		||||
    display_items "@executable_path references in libraries", @executable_path_dylibs
 | 
			
		||||
  end
 | 
			
		||||
  alias generic_display_normal_output display_normal_output
 | 
			
		||||
  private :generic_display_normal_output
 | 
			
		||||
@ -74,6 +76,7 @@ class LinkageChecker
 | 
			
		||||
 | 
			
		||||
    display_items "Undeclared dependencies with linkage", @undeclared_deps, puts_output: puts_output
 | 
			
		||||
    display_items "Files with missing rpath", @files_missing_rpaths, puts_output: puts_output
 | 
			
		||||
    display_items "@executable_path references in libraries", @executable_path_dylibs, puts_output: puts_output
 | 
			
		||||
  end
 | 
			
		||||
  alias generic_display_test_output display_test_output
 | 
			
		||||
  private :generic_display_test_output
 | 
			
		||||
@ -85,7 +88,7 @@ class LinkageChecker
 | 
			
		||||
    issues = [@broken_deps, unexpected_broken_dylibs]
 | 
			
		||||
    if test
 | 
			
		||||
      issues += [@unwanted_system_dylibs, @version_conflict_deps, unexpected_present_dylibs]
 | 
			
		||||
      issues += [@undeclared_deps, @files_missing_rpaths] if strict
 | 
			
		||||
      issues += [@undeclared_deps, @files_missing_rpaths, @executable_path_dylibs] if strict
 | 
			
		||||
    end
 | 
			
		||||
    issues.any?(&:present?)
 | 
			
		||||
  end
 | 
			
		||||
@ -182,9 +185,12 @@ class LinkageChecker
 | 
			
		||||
 | 
			
		||||
        checked_dylibs << dylib
 | 
			
		||||
 | 
			
		||||
        if dylib.start_with? "@"
 | 
			
		||||
        if dylib.start_with? "@rpath"
 | 
			
		||||
          @variable_dylibs << dylib
 | 
			
		||||
          next
 | 
			
		||||
        elsif dylib.start_with?("@executable_path") && !Pathname(file).binary_executable?
 | 
			
		||||
          @executable_path_dylibs << dylib
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        begin
 | 
			
		||||
 | 
			
		||||
@ -9,7 +9,7 @@ require "macho"
 | 
			
		||||
module MachOShim
 | 
			
		||||
  extend Forwardable
 | 
			
		||||
 | 
			
		||||
  delegate [:dylib_id, :rpaths] => :macho
 | 
			
		||||
  delegate [:dylib_id] => :macho
 | 
			
		||||
 | 
			
		||||
  def macho
 | 
			
		||||
    @macho ||= MachO.open(to_s)
 | 
			
		||||
@ -79,10 +79,32 @@ module MachOShim
 | 
			
		||||
    macho.write!
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def dynamically_linked_libraries(except: :none)
 | 
			
		||||
  def dynamically_linked_libraries(except: :none, resolve_variable_references: true)
 | 
			
		||||
    lcs = macho.dylib_load_commands.reject { |lc| lc.type == except }
 | 
			
		||||
 | 
			
		||||
    lcs.map(&:name).map(&:to_s).uniq
 | 
			
		||||
    names = lcs.map(&:name).map(&:to_s).uniq
 | 
			
		||||
 | 
			
		||||
    names.map! { |name| resolve_variable_name(name) } if resolve_variable_references
 | 
			
		||||
 | 
			
		||||
    names
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def rpaths(resolve_variable_references: true)
 | 
			
		||||
    names = macho.rpaths.uniq
 | 
			
		||||
 | 
			
		||||
    names.map! { |name| resolve_variable_name(name) } if resolve_variable_references
 | 
			
		||||
 | 
			
		||||
    names
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def resolve_variable_name(name)
 | 
			
		||||
    if name.start_with? "@loader_path"
 | 
			
		||||
      Pathname(name.sub("@loader_path", dirname)).cleanpath.to_s
 | 
			
		||||
    elsif name.start_with?("@executable_path") && binary_executable?
 | 
			
		||||
      Pathname(name.sub("@executable_path", dirname)).cleanpath.to_s
 | 
			
		||||
    else
 | 
			
		||||
      name
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def archs
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user