offsets-tool: new location and OSXCross support

Also fixed:
- 'os_utils.find_executable' was not working.
- Wrong macOS OSXCross tool prefix (was using target arch instead of host arch).
This commit is contained in:
Ignacio Etcheverry 2020-04-16 15:28:25 +02:00
parent 562afa310e
commit 33622ee670
4 changed files with 84 additions and 12 deletions

28
ios.py
View File

@ -302,6 +302,7 @@ class iOSCrossTable:
def setup_ios_cross_template(env: dict, opts: iOSOpts, target: str, host_arch: str):
target_triple = iOSCrossTable.target_triples[target]
device_target = iOSCrossTable.device_targets[target]
offsets_dumper_abi = iOSCrossTable.offsets_dumper_abis[target]
@ -334,7 +335,7 @@ def setup_ios_cross_template(env: dict, opts: iOSOpts, target: str, host_arch: s
env['_ios-%s_PATH' % target] = osxcross_bin
wrapper_path = create_osxcross_wrapper(opts, 'ios', target, opts.osx_toolchain_path)
name_fmt = path_join(osxcross_bin, target + '-apple-' + opts.osx_triple_abi + '-%s')
name_fmt = path_join(osxcross_bin, host_arch + '-apple-' + opts.osx_triple_abi + '-%s')
name_fmt = "%s %s" % (wrapper_path, name_fmt)
else:
tools_path = path_join(opts.osx_toolchain_path, 'usr', 'bin')
@ -348,13 +349,34 @@ def setup_ios_cross_template(env: dict, opts: iOSOpts, target: str, host_arch: s
env['_ios-%s_RANLIB' % target] = name_fmt % 'ranlib'
env['_ios-%s_STRIP' % target] = name_fmt % 'strip'
libclang = path_join(opts.ios_toolchain_path, 'usr', 'lib', 'libclang.dylib') if sys.platform == 'darwin' else os.environ['LIBCLANG_PATH']
libclang = os.environ.get('LIBCLANG_PATH', '')
if libclang and not os.path.isfile(libclang):
raise RuntimeError('Specified libclang file not found: \'%s\'' % libclang)
env['_ios-%s_OFFSETS_DUMPER_ARGS' % target] = [
if not libclang:
libclang = try_find_libclang(toolchain_path=opts.ios_toolchain_path)
if not libclang:
raise RuntimeError('Cannot find libclang shared library; specify a path manually with the \'LIBCLANG_PATH\' environment variable.')
offsets_dumper_args = [
'--libclang=%s' % libclang,
'--sysroot=%s' % ios_sysroot_path
]
if sys.platform != 'darwin':
# Needed in order to locate the iOS toolchain's clang to use with offsets-tool
setup_ios_device_template(env, opts, device_target)
ios_clang = env['_ios-%s_CC' % device_target]
# Extra CFLAGS needed in order to make offsets-tool work with OSXCross.
offsets_dumper_args += ['--extra-cflag=' + cflag for cflag in [
'-target', 'aarch64-apple-darwin',
'-resource-dir', get_clang_resource_dir(ios_clang)
]]
env['_ios-%s_OFFSETS_DUMPER_ARGS' % target] = offsets_dumper_args
AC_VARS = ['ac_cv_func_shm_open_working_with_mmap=no']
CFLAGS = ['-isysroot', osx_sysroot_path, '-mmacosx-version-min=10.9', '-Qunused-arguments']

View File

@ -72,8 +72,8 @@ ENV_PATH_SEP = ';' if os.name == 'nt' else ':'
def find_executable(name) -> str:
is_windows = os.name == 'nt'
windows_exts = ENV_PATH_SEP.split(os.environ['PATHEXT']) if is_windows else None
path_dirs = ENV_PATH_SEP.split(os.environ['PATH'])
windows_exts = os.environ['PATHEXT'].split(ENV_PATH_SEP) if is_windows else None
path_dirs = os.environ['PATH'].split(ENV_PATH_SEP)
search_dirs = path_dirs + [os.getcwd()] # cwd is last in the list
@ -160,6 +160,44 @@ def chmod_plus_x(file):
os.chmod(file, st.st_mode | ((stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) & ~umask))
def get_clang_resource_dir(clang_command):
import shlex
from subprocess import check_output
return check_output(shlex.split(clang_command) + ['-print-resource-dir']).strip().decode('utf-8')
def try_find_libclang(toolchain_path: str = '', llvm_config=''):
import sys
from subprocess import check_output
hint_paths = []
if toolchain_path:
libclang = os.path.join(toolchain_path, 'usr', 'lib', 'libclang.dylib')
if os.path.isfile(libclang):
print('Found libclang at: \'%s\'' % libclang)
return libclang
if not llvm_config:
llvm_config = find_executable('llvm-config')
if not llvm_config:
print('WARNING: llvm-config not found')
return ''
elif not os.path.isfile(llvm_config):
raise RuntimeError('Specified llvm-config file not found: \'%s\'' % llvm_config)
llvm_libdir = check_output([llvm_config, '--libdir']).strip().decode('utf-8')
if llvm_libdir:
libsuffix = '.dylib' if sys.platform == 'darwin' else '.so'
hints = ['libclang', 'clang']
libclang = next((p for p in [os.path.join(llvm_libdir, h + libsuffix) for h in hints] if os.path.isfile(p)), '')
if libclang:
print('Found libclang at: \'%s\'' % libclang)
return libclang
return ''
def create_osxcross_wrapper(opts: RuntimeOpts, product: str, target: str, toolchain_path : str):
# OSXCROSS toolchain executables use rpath to locate the toolchain's shared libraries.
# However, when moving the toolchain without care, the rpaths can be broken.

View File

@ -32,6 +32,11 @@ def main(raw_args):
'mono_ios_asl_log_deprecated.diff'
]
if os.path.isfile(os.path.join(mono_source_root, 'mono/tools/offsets-tool/offsets-tool.py')):
patches += ['offsets-tool-extra-cflags_new.diff']
else:
patches += ['offsets-tool-extra-cflags_old.diff']
from subprocess import Popen
from sys import exit
for patch in patches:

View File

@ -101,21 +101,28 @@ def setup_runtime_cross_template(env: dict, opts: RuntimeOpts, product: str, tar
env['_cross-runtime_%s-%s_CONFIGURE_FLAGS' % (product, target)] = CONFIGURE_FLAGS
# Setup offsets-tool-py
run_command('make', ['-C', '%s/tools/offsets-tool-py' % opts.mono_source_root, 'setup'], name='make offsets-tool-py')
new_offsets_tool_path = '%s/mono/tools/offsets-tool/offsets-tool.py' % opts.mono_source_root
old_offsets_tool_path = '%s/tools/offsets-tool-py/offsets-tool.py' % opts.mono_source_root
# Run offsets-tool in its virtual env
old_offsets_tool = not os.path.isfile(new_offsets_tool_path)
virtualenv_vars = source('%s/tools/offsets-tool-py/offtool/bin/activate' % opts.mono_source_root)
offsets_tool_env = None
offsets_tool_env = os.environ.copy()
offsets_tool_env.update(virtualenv_vars)
if old_offsets_tool:
# Setup old offsets-tool-py if present (new location doesn't require setup)
run_command('make', ['-C', '%s/tools/offsets-tool-py' % opts.mono_source_root, 'setup'], name='make offsets-tool-py')
# Run offsets-tool in its virtual env
virtualenv_vars = source('%s/tools/offsets-tool-py/offtool/bin/activate' % opts.mono_source_root)
offsets_tool_env = os.environ.copy()
offsets_tool_env.update(virtualenv_vars)
build_dir = '%s/%s-%s-%s' % (opts.configure_dir, product, target, opts.configuration)
mkdir_p(build_dir)
run_command('python3', [
'%s/tools/offsets-tool-py/offsets-tool.py' % opts.mono_source_root,
old_offsets_tool_path if old_offsets_tool else new_offsets_tool_path,
'--targetdir=%s/%s-%s-%s' % (opts.configure_dir, product, device_target, opts.configuration),
'--abi=%s' % offsets_dumper_abi,
'--monodir=%s' % opts.mono_source_root,