Merge pull request #7213 from rmNULL/linux-shelless-elftools
Use patchelf.rb to set interpreter instead of patchelf. First step towards shelless elftools
This commit is contained in:
		
						commit
						f908b355b2
					
				@ -18,10 +18,7 @@ class Keg
 | 
				
			|||||||
  def change_rpath(file, old_prefix, new_prefix)
 | 
					  def change_rpath(file, old_prefix, new_prefix)
 | 
				
			||||||
    return if !file.elf? || !file.dynamic_elf?
 | 
					    return if !file.elf? || !file.dynamic_elf?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    patchelf = DevelopmentTools.locate "patchelf"
 | 
					    updated = {}
 | 
				
			||||||
    odie "Could not locate patchelf, please: brew install patchelf." if patchelf.nil?
 | 
					 | 
				
			||||||
    cmd = [patchelf]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    old_rpath = file.rpath
 | 
					    old_rpath = file.rpath
 | 
				
			||||||
    new_rpath = if old_rpath
 | 
					    new_rpath = if old_rpath
 | 
				
			||||||
      rpath = old_rpath.split(":")
 | 
					      rpath = old_rpath.split(":")
 | 
				
			||||||
@ -30,11 +27,10 @@ class Keg
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      lib_path = "#{new_prefix}/lib"
 | 
					      lib_path = "#{new_prefix}/lib"
 | 
				
			||||||
      rpath << lib_path unless rpath.include? lib_path
 | 
					      rpath << lib_path unless rpath.include? lib_path
 | 
				
			||||||
      new_rpath = rpath.join(":")
 | 
					 | 
				
			||||||
      cmd.push  "--force-rpath", "--set-rpath", new_rpath
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      new_rpath
 | 
					      rpath.join(":")
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					    updated[:rpath] = new_rpath if old_rpath != new_rpath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    old_interpreter = file.interpreter
 | 
					    old_interpreter = file.interpreter
 | 
				
			||||||
    new_interpreter = if old_interpreter.nil?
 | 
					    new_interpreter = if old_interpreter.nil?
 | 
				
			||||||
@ -44,11 +40,9 @@ class Keg
 | 
				
			|||||||
    else
 | 
					    else
 | 
				
			||||||
      old_interpreter.sub old_prefix, new_prefix
 | 
					      old_interpreter.sub old_prefix, new_prefix
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    cmd << "--set-interpreter" << new_interpreter if old_interpreter != new_interpreter
 | 
					    updated[:interpreter] = new_interpreter if old_interpreter != new_interpreter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return if old_rpath == new_rpath && old_interpreter == new_interpreter
 | 
					    file.patch!(interpreter: updated[:interpreter], rpath: updated[:rpath])
 | 
				
			||||||
 | 
					 | 
				
			||||||
    safe_system(*cmd, file)
 | 
					 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def detect_cxx_stdlibs(options = {})
 | 
					  def detect_cxx_stdlibs(options = {})
 | 
				
			||||||
 | 
				
			|||||||
@ -98,6 +98,16 @@ module ELFShim
 | 
				
			|||||||
    @interpreter = patchelf_patcher.interpreter
 | 
					    @interpreter = patchelf_patcher.interpreter
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def patch!(interpreter: nil, rpath: nil)
 | 
				
			||||||
 | 
					    return if interpreter.blank? && rpath.blank?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if HOMEBREW_PATCHELF_RB_WRITE
 | 
				
			||||||
 | 
					      save_using_patchelf_rb interpreter, rpath
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      save_using_patchelf interpreter, rpath
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def dynamic_elf?
 | 
					  def dynamic_elf?
 | 
				
			||||||
    return @dynamic_elf if defined? @dynamic_elf
 | 
					    return @dynamic_elf if defined? @dynamic_elf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -148,13 +158,30 @@ module ELFShim
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
  private_constant :Metadata
 | 
					  private_constant :Metadata
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def save_using_patchelf(new_interpreter, new_rpath)
 | 
				
			||||||
 | 
					    patchelf = DevelopmentTools.locate "patchelf"
 | 
				
			||||||
 | 
					    odie "Could not locate patchelf, please: brew install patchelf." if patchelf.blank?
 | 
				
			||||||
 | 
					    args = []
 | 
				
			||||||
 | 
					    args << "--set-interpreter" << new_interpreter if new_interpreter.present?
 | 
				
			||||||
 | 
					    args << "--force-rpath" << "--set-rpath" << new_rpath if new_rpath.present?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Homebrew.safe_system(patchelf, *args, to_s)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def save_using_patchelf_rb(new_interpreter, new_rpath)
 | 
				
			||||||
 | 
					    patcher = patchelf_patcher
 | 
				
			||||||
 | 
					    patcher.interpreter = new_interpreter if new_interpreter.present?
 | 
				
			||||||
 | 
					    patcher.rpath = new_rpath if new_rpath.present?
 | 
				
			||||||
 | 
					    patcher.save(patchelf_compatible: true)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def rpath_using_patchelf_rb
 | 
					  def rpath_using_patchelf_rb
 | 
				
			||||||
    patchelf_patcher.runpath || patchelf_patcher.rpath
 | 
					    patchelf_patcher.runpath || patchelf_patcher.rpath
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def patchelf_patcher
 | 
					  def patchelf_patcher
 | 
				
			||||||
    require "patchelf"
 | 
					    require "patchelf"
 | 
				
			||||||
    @patchelf_patcher ||= PatchELF::Patcher.new to_s, on_error: :silent
 | 
					    @patchelf_patcher ||= ::PatchELF::Patcher.new to_s, on_error: :silent
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def metadata
 | 
					  def metadata
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,8 @@
 | 
				
			|||||||
# frozen_string_literal: true
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# enables experimental patchelf.rb write support.
 | 
				
			||||||
 | 
					HOMEBREW_PATCHELF_RB_WRITE = ENV["HOMEBREW_PATCHELF_RB_WRITE"].present?.freeze
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module Homebrew
 | 
					module Homebrew
 | 
				
			||||||
  DEFAULT_PREFIX ||= if Homebrew::EnvConfig.force_homebrew_on_linux?
 | 
					  DEFAULT_PREFIX ||= if Homebrew::EnvConfig.force_homebrew_on_linux?
 | 
				
			||||||
    HOMEBREW_DEFAULT_PREFIX
 | 
					    HOMEBREW_DEFAULT_PREFIX
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user