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)
 | 
					  def each_linkage_for(file, linkage_type, &block)
 | 
				
			||||||
    links = file.method(linkage_type)
 | 
					    links = file.method(linkage_type)
 | 
				
			||||||
                .call
 | 
					                .call(resolve_variable_references: false)
 | 
				
			||||||
                .grep_v(/^@(loader_|executable_|r)path/)
 | 
					                .grep_v(/^@(loader_|executable_|r)path/)
 | 
				
			||||||
    links.each(&block)
 | 
					    links.each(&block)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
@ -31,6 +31,7 @@ class LinkageChecker
 | 
				
			|||||||
    @unwanted_system_dylibs = []
 | 
					    @unwanted_system_dylibs = []
 | 
				
			||||||
    @version_conflict_deps = []
 | 
					    @version_conflict_deps = []
 | 
				
			||||||
    @files_missing_rpaths = []
 | 
					    @files_missing_rpaths = []
 | 
				
			||||||
 | 
					    @executable_path_dylibs = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    check_dylibs(rebuild_cache: rebuild_cache)
 | 
					    check_dylibs(rebuild_cache: rebuild_cache)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@ -39,13 +40,14 @@ class LinkageChecker
 | 
				
			|||||||
    display_items "System libraries", @system_dylibs
 | 
					    display_items "System libraries", @system_dylibs
 | 
				
			||||||
    display_items "Homebrew libraries", @brewed_dylibs
 | 
					    display_items "Homebrew libraries", @brewed_dylibs
 | 
				
			||||||
    display_items "Indirect dependencies with linkage", @indirect_deps
 | 
					    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 "Missing libraries", @broken_dylibs
 | 
				
			||||||
    display_items "Broken dependencies", @broken_deps
 | 
					    display_items "Broken dependencies", @broken_deps
 | 
				
			||||||
    display_items "Undeclared dependencies with linkage", @undeclared_deps
 | 
					    display_items "Undeclared dependencies with linkage", @undeclared_deps
 | 
				
			||||||
    display_items "Dependencies with no linkage", @unnecessary_deps
 | 
					    display_items "Dependencies with no linkage", @unnecessary_deps
 | 
				
			||||||
    display_items "Unwanted system libraries", @unwanted_system_dylibs
 | 
					    display_items "Unwanted system libraries", @unwanted_system_dylibs
 | 
				
			||||||
    display_items "Files with missing rpath", @files_missing_rpaths
 | 
					    display_items "Files with missing rpath", @files_missing_rpaths
 | 
				
			||||||
 | 
					    display_items "@executable_path references in libraries", @executable_path_dylibs
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
  alias generic_display_normal_output display_normal_output
 | 
					  alias generic_display_normal_output display_normal_output
 | 
				
			||||||
  private :generic_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 "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 "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
 | 
					  end
 | 
				
			||||||
  alias generic_display_test_output display_test_output
 | 
					  alias generic_display_test_output display_test_output
 | 
				
			||||||
  private :generic_display_test_output
 | 
					  private :generic_display_test_output
 | 
				
			||||||
@ -85,7 +88,7 @@ class LinkageChecker
 | 
				
			|||||||
    issues = [@broken_deps, unexpected_broken_dylibs]
 | 
					    issues = [@broken_deps, unexpected_broken_dylibs]
 | 
				
			||||||
    if test
 | 
					    if test
 | 
				
			||||||
      issues += [@unwanted_system_dylibs, @version_conflict_deps, unexpected_present_dylibs]
 | 
					      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
 | 
					    end
 | 
				
			||||||
    issues.any?(&:present?)
 | 
					    issues.any?(&:present?)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@ -182,9 +185,12 @@ class LinkageChecker
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        checked_dylibs << dylib
 | 
					        checked_dylibs << dylib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if dylib.start_with? "@"
 | 
					        if dylib.start_with? "@rpath"
 | 
				
			||||||
          @variable_dylibs << dylib
 | 
					          @variable_dylibs << dylib
 | 
				
			||||||
          next
 | 
					          next
 | 
				
			||||||
 | 
					        elsif dylib.start_with?("@executable_path") && !Pathname(file).binary_executable?
 | 
				
			||||||
 | 
					          @executable_path_dylibs << dylib
 | 
				
			||||||
 | 
					          next
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        begin
 | 
					        begin
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ require "macho"
 | 
				
			|||||||
module MachOShim
 | 
					module MachOShim
 | 
				
			||||||
  extend Forwardable
 | 
					  extend Forwardable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  delegate [:dylib_id, :rpaths] => :macho
 | 
					  delegate [:dylib_id] => :macho
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def macho
 | 
					  def macho
 | 
				
			||||||
    @macho ||= MachO.open(to_s)
 | 
					    @macho ||= MachO.open(to_s)
 | 
				
			||||||
@ -79,10 +79,32 @@ module MachOShim
 | 
				
			|||||||
    macho.write!
 | 
					    macho.write!
 | 
				
			||||||
  end
 | 
					  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 = 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
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def archs
 | 
					  def archs
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user