os/mac: optionally use ruby_macho.
- and branch for dylib_id_and_dylibs - add branches for dylib id changing and change_install_name - rename MachO module to HomebrewMachO to prevent namespace clashes with MachO in ruby-macho. this will eventually be replaced entirely with direct calls to ruby-macho methods - break ruby-macho implementation out into separate RubyMachO module, and include either RubyMachO or CctoolsMachO (the original implementation) based on the HOMEBREW_RUBY_MACHO env var - move ArchitectureListExtension and RubyMachO into separate files - create {ruby_,cctools_,,}relocate.rb for isolation of different methods of mach-o relocation (ruby-macho vs. cctools) - fill in require_install_name_tool? for ruby_relocate.rb - rename {ruby_,cctools_,,}relocate.rb to keg, isolate requires in os/mac Closes Homebrew/homebrew#45001. Signed-off-by: Mike McQuaid <mike@mikemcquaid.com>
This commit is contained in:
parent
1cb6a2ad18
commit
afe0fde49c
@ -70,16 +70,6 @@ class Keg
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def change_dylib_id(id, file)
|
|
||||||
puts "Changing dylib ID of #{file}\n from #{file.dylib_id}\n to #{id}" if ARGV.debug?
|
|
||||||
install_name_tool("-id", id, file)
|
|
||||||
end
|
|
||||||
|
|
||||||
def change_install_name(old, new, file)
|
|
||||||
puts "Changing install name in #{file}\n from #{old}\n to #{new}" if ARGV.debug?
|
|
||||||
install_name_tool("-change", old, new, file)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Detects the C++ dynamic libraries in place, scanning the dynamic links
|
# Detects the C++ dynamic libraries in place, scanning the dynamic links
|
||||||
# of the files within the keg.
|
# of the files within the keg.
|
||||||
# Note that this doesn't attempt to distinguish between libstdc++ versions,
|
# Note that this doesn't attempt to distinguish between libstdc++ versions,
|
||||||
@ -110,16 +100,6 @@ class Keg
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def install_name_tool(*args)
|
|
||||||
@require_install_name_tool = true
|
|
||||||
tool = MacOS.install_name_tool
|
|
||||||
system(tool, *args) || raise(ErrorDuringExecution.new(tool, args))
|
|
||||||
end
|
|
||||||
|
|
||||||
def require_install_name_tool?
|
|
||||||
!!@require_install_name_tool
|
|
||||||
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.
|
||||||
|
@ -4,6 +4,7 @@ require "os/mac/xcode"
|
|||||||
require "os/mac/xquartz"
|
require "os/mac/xquartz"
|
||||||
require "os/mac/pathname"
|
require "os/mac/pathname"
|
||||||
require "os/mac/sdk"
|
require "os/mac/sdk"
|
||||||
|
require "os/mac/keg"
|
||||||
|
|
||||||
module OS
|
module OS
|
||||||
module Mac
|
module Mac
|
||||||
|
21
Library/Homebrew/os/mac/cctools_keg.rb
Normal file
21
Library/Homebrew/os/mac/cctools_keg.rb
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
module CctoolsKeg
|
||||||
|
def install_name_tool(*args)
|
||||||
|
@require_install_name_tool = true
|
||||||
|
tool = MacOS.install_name_tool
|
||||||
|
system(tool, *args) || raise(ErrorDuringExecution.new(tool, args))
|
||||||
|
end
|
||||||
|
|
||||||
|
def require_install_name_tool?
|
||||||
|
!!@require_install_name_tool
|
||||||
|
end
|
||||||
|
|
||||||
|
def change_dylib_id(id, file)
|
||||||
|
puts "Changing dylib ID of #{file}\n from #{file.dylib_id}\n to #{id}" if ARGV.debug?
|
||||||
|
install_name_tool("-id", id, file)
|
||||||
|
end
|
||||||
|
|
||||||
|
def change_install_name(old, new, file)
|
||||||
|
puts "Changing install name in #{file}\n from #{old}\n to #{new}" if ARGV.debug?
|
||||||
|
install_name_tool("-change", old, new, file)
|
||||||
|
end
|
||||||
|
end
|
@ -1,4 +1,4 @@
|
|||||||
require "os/mac/mach"
|
require "os/mac/pathname"
|
||||||
|
|
||||||
module MacCPUs
|
module MacCPUs
|
||||||
OPTIMIZATION_FLAGS = {
|
OPTIMIZATION_FLAGS = {
|
||||||
|
9
Library/Homebrew/os/mac/keg.rb
Normal file
9
Library/Homebrew/os/mac/keg.rb
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
class Keg
|
||||||
|
if ENV["HOMEBREW_RUBY_MACHO"]
|
||||||
|
require "os/mac/ruby_keg"
|
||||||
|
include RubyKeg
|
||||||
|
else
|
||||||
|
require "os/mac/cctools_keg"
|
||||||
|
include CctoolsKeg
|
||||||
|
end
|
||||||
|
end
|
@ -1,5 +1,9 @@
|
|||||||
require "os/mac/mach"
|
|
||||||
|
|
||||||
class Pathname
|
class Pathname
|
||||||
include MachO
|
if ENV["HOMEBREW_RUBY_MACHO"]
|
||||||
|
require "os/mac/ruby_mach"
|
||||||
|
include RubyMachO
|
||||||
|
else
|
||||||
|
require "os/mac/cctools_mach"
|
||||||
|
include CctoolsMachO
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
19
Library/Homebrew/os/mac/ruby_keg.rb
Normal file
19
Library/Homebrew/os/mac/ruby_keg.rb
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
require "vendor/macho/macho"
|
||||||
|
|
||||||
|
module RubyKeg
|
||||||
|
def change_dylib_id(id, file)
|
||||||
|
@require_install_name_tool = true
|
||||||
|
puts "Changing dylib ID of #{file}\n from #{file.dylib_id}\n to #{id}" if ARGV.debug?
|
||||||
|
MachO::Tools.change_dylib_id(file, id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def change_install_name(old, new, file)
|
||||||
|
@require_install_name_tool = true
|
||||||
|
puts "Changing install name in #{file}\n from #{old}\n to #{new}" if ARGV.debug?
|
||||||
|
MachO::Tools.change_install_name(file, old, new)
|
||||||
|
end
|
||||||
|
|
||||||
|
def require_install_name_tool?
|
||||||
|
!!@require_install_name_tool
|
||||||
|
end
|
||||||
|
end
|
103
Library/Homebrew/os/mac/ruby_mach.rb
Normal file
103
Library/Homebrew/os/mac/ruby_mach.rb
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
require "vendor/macho/macho"
|
||||||
|
require "os/mac/architecture_list"
|
||||||
|
|
||||||
|
module RubyMachO
|
||||||
|
# @private
|
||||||
|
def macho
|
||||||
|
@macho ||= begin
|
||||||
|
MachO.open(to_s)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# @private
|
||||||
|
def mach_data
|
||||||
|
@mach_data ||= begin
|
||||||
|
machos = []
|
||||||
|
mach_data = []
|
||||||
|
|
||||||
|
if MachO.fat_magic?(macho.magic)
|
||||||
|
machos = macho.machos
|
||||||
|
else
|
||||||
|
machos << macho
|
||||||
|
end
|
||||||
|
|
||||||
|
machos.each do |m|
|
||||||
|
arch = case m.cputype
|
||||||
|
when "CPU_TYPE_I386" then :i386
|
||||||
|
when "CPU_TYPE_X86_64" then :x86_64
|
||||||
|
when "CPU_TYPE_POWERPC" then :ppc7400
|
||||||
|
when "CPU_TYPE_POWERPC64" then :ppc64
|
||||||
|
else :dunno
|
||||||
|
end
|
||||||
|
|
||||||
|
type = case m.filetype
|
||||||
|
when "MH_EXECUTE" then :executable
|
||||||
|
when "MH_DYLIB" then :dylib
|
||||||
|
when "MH_BUNDLE" then :bundle
|
||||||
|
else :dunno
|
||||||
|
end
|
||||||
|
|
||||||
|
mach_data << { :arch => arch, :type => type }
|
||||||
|
end
|
||||||
|
|
||||||
|
mach_data
|
||||||
|
rescue
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def archs
|
||||||
|
mach_data.map { |m| m.fetch :arch }.extend(ArchitectureListExtension)
|
||||||
|
end
|
||||||
|
|
||||||
|
def arch
|
||||||
|
case archs.length
|
||||||
|
when 0 then :dunno
|
||||||
|
when 1 then archs.first
|
||||||
|
else :universal
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def universal?
|
||||||
|
arch == :universal
|
||||||
|
end
|
||||||
|
|
||||||
|
def i386?
|
||||||
|
arch == :i386
|
||||||
|
end
|
||||||
|
|
||||||
|
def x86_64?
|
||||||
|
arch == :x86_64
|
||||||
|
end
|
||||||
|
|
||||||
|
def ppc7400?
|
||||||
|
arch == :ppc7400
|
||||||
|
end
|
||||||
|
|
||||||
|
def ppc64?
|
||||||
|
arch == :ppc64
|
||||||
|
end
|
||||||
|
|
||||||
|
# @private
|
||||||
|
def dylib?
|
||||||
|
mach_data.any? { |m| m.fetch(:type) == :dylib }
|
||||||
|
end
|
||||||
|
|
||||||
|
# @private
|
||||||
|
def mach_o_executable?
|
||||||
|
mach_data.any? { |m| m.fetch(:type) == :executable }
|
||||||
|
end
|
||||||
|
|
||||||
|
# @private
|
||||||
|
def mach_o_bundle?
|
||||||
|
mach_data.any? { |m| m.fetch(:type) == :bundle }
|
||||||
|
end
|
||||||
|
|
||||||
|
def dynamically_linked_libraries
|
||||||
|
macho.linked_dylibs
|
||||||
|
end
|
||||||
|
|
||||||
|
def dylib_id
|
||||||
|
macho.dylib_id
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user