adium/adium
Clone
Summary
Browse
Changes
Graph
1.5.10.3b1
adium-1.5.10.3
2017-03-23, Evan D. Schoenberg, M.D.
6d760b7b1d69
1.5.10.3b1
#!/usr/bin/env python
'''This module provides functions that shell out to install_name_tool to perform
black magic on dylibs and make them universal.
'''
import
os
import
sys
import
otool_parse
LIPO_BINARY_NAME
=
'lipo'
CREATE_FLAG
=
'-create'
ARCH_FLAG
=
'-arch'
OUTPUT_FLAG
=
'-output'
INSTALL_NAME_TOOL
=
'install_name_tool'
# TODO(durin42) this function is begging to be refactored into lipo_files and
# find_and_replace_on_files, but I just need to get this into the repo.
def
lipo_files
(
source_files
,
replace_paths
,
target_file
):
'''Collect the files located at the paths to the target path using lipo.
Args: source_files: dict of arch:source file (single arch per source only)
replace_paths: dict of replacements. Will replace any path or path
fragment in shared library load paths. Key is replaced with value.
target_file: target path
Returns: nothing.
'''
args
=
[
LIPO_BINARY_NAME
,
CREATE_FLAG
,
]
for
arch
,
source
in
source_files
.
items
():
args
.
append
(
ARCH_FLAG
)
args
.
append
(
arch
)
args
.
append
(
source
)
args
.
append
(
OUTPUT_FLAG
)
args
.
append
(
target_file
)
status
=
os
.
spawnvp
(
os
.
P_WAIT
,
LIPO_BINARY_NAME
,
args
)
if
status
!=
0
:
print
'The following command failed:'
print
' '
.
join
(
args
)
sys
.
exit
(
status
)
# Gather all the third party deps, we don't want to replace paths to system
# deps anyway.
info
=
otool_parse
.
otool_library
(
target_file
,
'i386'
)
all_third_libs
=
info
.
third_party_shlib_deps
()
info
=
otool_parse
.
otool_library
(
target_file
,
'ppc'
)
all_third_libs
.
extend
(
info
.
third_party_shlib_deps
())
# run install_name_tool to change the file's own path
args
=
[
INSTALL_NAME_TOOL
,
'-id'
,
target_file
,
target_file
]
status
=
os
.
spawnvp
(
os
.
P_WAIT
,
INSTALL_NAME_TOOL
,
args
)
if
status
!=
0
:
print
'The following command failed:'
print
' '
.
join
(
args
)
sys
.
exit
(
status
)
# Do find-and-replace on third-party lib paths using install_name_tool
for
old_path
,
new_path
in
replace_paths
.
items
():
for
lib_path
in
all_third_libs
:
if
old_path
in
lib_path
:
path_new
=
lib_path
.
replace
(
old_path
,
new_path
)
args
=
[
INSTALL_NAME_TOOL
,
'-change'
,
lib_path
,
path_new
,
target_file
]
status
=
os
.
spawnvp
(
os
.
P_WAIT
,
INSTALL_NAME_TOOL
,
args
)
if
status
!=
0
:
print
'The following command failed:'
print
' '
.
join
(
args
)
sys
.
exit
(
status
)
def
_print_usage
():
print
'Usage:'
,
sys
.
argv
[
0
],
'arch:/path/to/old_lib.dylib'
,
print
'arch:/path/to/old_lib.dylib'
,
'/path/to_new.dylib'
,
print
'[oldpath:newpath] [oldpath:newpath]'
print
print
'You MUST pass full paths - partial ones will create malformed libs.'
print
'You may pass partial paths for the replacements.'
if
__name__
==
'__main__'
:
if
len
(
sys
.
argv
)
<
3
:
_print_usage
()
replacement_arr
=
sys
.
argv
[
1
:]
platform_libs
=
{}
for
arg
in
sys
.
argv
[
1
:]:
replacement_arr
.
remove
(
arg
)
if
arg
.
count
(
':'
)
==
0
:
target_file
=
arg
break
arch
,
lib
=
arg
.
split
(
':'
)
platform_libs
[
arch
]
=
lib
replacements
=
{}
for
repl
in
replacement_arr
:
old
,
new
=
repl
.
split
(
':'
)
replacements
[
old
]
=
new
lipo_files
(
platform_libs
,
replacements
,
target_file
)