Merge pull request #12225 from carlocab/two-level
mac/formula_cellar_checks: check for flat namespace libraries
This commit is contained in:
		
						commit
						556b8f16c6
					
				@ -88,12 +88,38 @@ module FormulaCellarChecks
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def check_flat_namespace(formula)
 | 
			
		||||
    return unless formula.prefix.directory?
 | 
			
		||||
    return if formula.tap.present? && tap_audit_exception(:flat_namespace_allowlist, formula.name)
 | 
			
		||||
 | 
			
		||||
    keg = Keg.new(formula.prefix)
 | 
			
		||||
    flat_namespace_files = keg.mach_o_files.reject do |file|
 | 
			
		||||
      next true unless file.dylib?
 | 
			
		||||
 | 
			
		||||
      macho = MachO.open(file)
 | 
			
		||||
      if MachO::Utils.fat_magic?(macho.magic)
 | 
			
		||||
        macho.machos.map(&:header).all? { |h| h.flag? :MH_TWOLEVEL }
 | 
			
		||||
      else
 | 
			
		||||
        macho.header.flag? :MH_TWOLEVEL
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    return if flat_namespace_files.empty?
 | 
			
		||||
 | 
			
		||||
    <<~EOS
 | 
			
		||||
      Libraries were compiled with a flat namespace.
 | 
			
		||||
      This can cause linker errors due to name collisions, and
 | 
			
		||||
      is often due to a bug in detecting the macOS version.
 | 
			
		||||
        #{flat_namespace_files * "\n  "}
 | 
			
		||||
    EOS
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def audit_installed
 | 
			
		||||
    generic_audit_installed
 | 
			
		||||
    problem_if_output(check_shadowed_headers)
 | 
			
		||||
    problem_if_output(check_openssl_links)
 | 
			
		||||
    problem_if_output(check_python_framework_links(formula.lib))
 | 
			
		||||
    check_linkage
 | 
			
		||||
    problem_if_output(check_flat_namespace(formula))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def valid_library_extension?(filename)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user