2019-11-10 04:58:04 +01:00
|
|
|
|
|
|
|
import os
|
|
|
|
from os.path import join as path_join
|
|
|
|
|
|
|
|
from options import RuntimeOpts
|
|
|
|
from os_utils import *
|
|
|
|
|
|
|
|
|
2019-11-13 21:09:19 +01:00
|
|
|
def setup_runtime_template(env: dict, opts: RuntimeOpts, product: str, target: str, host_triple: str, llvm: str=''):
|
2019-11-10 04:58:04 +01:00
|
|
|
BITNESS = ''
|
|
|
|
if any(s in host_triple for s in ['i686', 'i386']):
|
|
|
|
BITNESS = '-m32'
|
|
|
|
elif 'x86_64' in host_triple:
|
|
|
|
BITNESS = '-m64'
|
|
|
|
|
|
|
|
CFLAGS = []
|
|
|
|
CFLAGS += ['-O2', '-g'] if opts.release else ['-O0', '-ggdb3', '-fno-omit-frame-pointer']
|
|
|
|
CFLAGS += env.get('_%s-%s_CFLAGS' % (product, target), [])
|
|
|
|
CFLAGS += env.get('%s-%s_CFLAGS' % (product, target), [])
|
|
|
|
CFLAGS += [BITNESS] if BITNESS else []
|
|
|
|
|
|
|
|
CXXFLAGS = []
|
|
|
|
CXXFLAGS += ['-O2', '-g'] if opts.release else ['-O0', '-ggdb3', '-fno-omit-frame-pointer']
|
|
|
|
CXXFLAGS += env.get('_%s-%s_CXXFLAGS' % (product, target), [])
|
|
|
|
CXXFLAGS += env.get('%s-%s_CXXFLAGS' % (product, target), [])
|
|
|
|
CXXFLAGS += [BITNESS] if BITNESS else []
|
|
|
|
|
|
|
|
CPPFLAGS = []
|
|
|
|
CPPFLAGS += ['-O2', '-g'] if opts.release else ['-O0', '-ggdb3', '-fno-omit-frame-pointer']
|
|
|
|
CPPFLAGS += env.get('_%s-%s_CPPFLAGS' % (product, target), [])
|
|
|
|
CPPFLAGS += env.get('%s-%s_CPPFLAGS' % (product, target), [])
|
|
|
|
CPPFLAGS += [BITNESS] if BITNESS else []
|
|
|
|
|
|
|
|
CXXCPPFLAGS = []
|
|
|
|
CXXCPPFLAGS += ['-O2', '-g'] if opts.release else ['-O0', '-ggdb3', '-fno-omit-frame-pointer']
|
|
|
|
CXXCPPFLAGS += env.get('_%s-%s_CXXCPPFLAGS' % (product, target), [])
|
|
|
|
CXXCPPFLAGS += env.get('%s-%s_CXXCPPFLAGS' % (product, target), [])
|
|
|
|
CXXCPPFLAGS += [BITNESS] if BITNESS else []
|
|
|
|
|
|
|
|
LDFLAGS = []
|
|
|
|
LDFLAGS += env.get('_%s-%s_LDFLAGS' % (product, target), [])
|
|
|
|
LDFLAGS += env.get('%s-%s_LDFLAGS' % (product, target), [])
|
|
|
|
|
|
|
|
AC_VARS = []
|
|
|
|
AC_VARS += env.get('_%s-%s_AC_VARS' % (product, target), [])
|
|
|
|
AC_VARS += env.get('%s-%s_AC_VARS' % (product, target), [])
|
|
|
|
|
|
|
|
CONFIGURE_ENVIRONMENT = {}
|
|
|
|
|
|
|
|
def set_product_env_var(var_name):
|
|
|
|
val = env.get('_%s-%s_%s' % (product, target, var_name), '')
|
|
|
|
if val:
|
|
|
|
CONFIGURE_ENVIRONMENT[var_name] = val
|
|
|
|
|
|
|
|
set_product_env_var('AR')
|
|
|
|
set_product_env_var('AS')
|
|
|
|
set_product_env_var('CC')
|
|
|
|
set_product_env_var('CPP')
|
|
|
|
set_product_env_var('CXX')
|
|
|
|
set_product_env_var('CXXCPP')
|
|
|
|
set_product_env_var('DLLTOOL')
|
|
|
|
set_product_env_var('LD')
|
|
|
|
set_product_env_var('OBJDUMP')
|
|
|
|
set_product_env_var('RANLIB')
|
|
|
|
set_product_env_var('CMAKE')
|
|
|
|
set_product_env_var('STRIP')
|
|
|
|
|
|
|
|
CONFIGURE_ENVIRONMENT['CFLAGS'] = CFLAGS
|
|
|
|
CONFIGURE_ENVIRONMENT['CXXFLAGS'] = CXXFLAGS
|
|
|
|
CONFIGURE_ENVIRONMENT['CPPFLAGS'] = CPPFLAGS
|
|
|
|
CONFIGURE_ENVIRONMENT['CXXCPPFLAGS'] = CXXCPPFLAGS
|
|
|
|
CONFIGURE_ENVIRONMENT['LDFLAGS'] = LDFLAGS
|
|
|
|
|
|
|
|
CONFIGURE_ENVIRONMENT.update(env.get('_%s-%s_CONFIGURE_ENVIRONMENT' % (product, target), {}))
|
|
|
|
CONFIGURE_ENVIRONMENT.update(env.get('%s-%s_CONFIGURE_ENVIRONMENT' % (product, target), {}))
|
|
|
|
|
|
|
|
CONFIGURE_FLAGS = []
|
|
|
|
CONFIGURE_FLAGS += ['--host=%s' % host_triple] if host_triple else []
|
|
|
|
CONFIGURE_FLAGS += ['--cache-file=%s/%s-%s-%s.config.cache' % (opts.configure_dir, product, target, opts.configuration)]
|
|
|
|
CONFIGURE_FLAGS += ['--prefix=%s/%s-%s-%s' % (opts.install_dir, product, target, opts.configuration)]
|
|
|
|
CONFIGURE_FLAGS += ['--enable-cxx'] if opts.enable_cxx else []
|
|
|
|
CONFIGURE_FLAGS += env.get('_cross-runtime_%s-%s_CONFIGURE_FLAGS' % (product, target), [])
|
|
|
|
CONFIGURE_FLAGS += env.get('_%s-%s_CONFIGURE_FLAGS' % (product, target), [])
|
|
|
|
CONFIGURE_FLAGS += env.get('%s-%s_CONFIGURE_FLAGS' % (product, target), [])
|
|
|
|
|
2019-11-13 21:09:19 +01:00
|
|
|
if llvm:
|
|
|
|
CONFIGURE_FLAGS += ['--with-llvm=%s/llvm-%s' % (opts.install_dir, llvm)]
|
|
|
|
|
2019-11-10 04:58:04 +01:00
|
|
|
env['_runtime_%s-%s_AC_VARS' % (product, target)] = AC_VARS
|
|
|
|
env['_runtime_%s-%s_CONFIGURE_ENVIRONMENT' % (product, target)] = CONFIGURE_ENVIRONMENT
|
|
|
|
env['_runtime_%s-%s_CONFIGURE_FLAGS' % (product, target)] = CONFIGURE_FLAGS
|
|
|
|
|
|
|
|
|
|
|
|
def setup_runtime_cross_template(env: dict, opts: RuntimeOpts, product: str, target: str, host_triple: str,
|
|
|
|
target_triple: str, device_target: str, llvm: str, offsets_dumper_abi: str):
|
|
|
|
CONFIGURE_FLAGS = [
|
|
|
|
'--target=%s' % target_triple,
|
|
|
|
'--with-cross-offsets=%s.h' % target_triple,
|
2019-11-13 21:09:19 +01:00
|
|
|
'--with-llvm=%s/llvm-%s' % (opts.install_dir, llvm)
|
2019-11-10 04:58:04 +01:00
|
|
|
]
|
|
|
|
|
|
|
|
env['_cross-runtime_%s-%s_CONFIGURE_FLAGS' % (product, target)] = CONFIGURE_FLAGS
|
|
|
|
|
2020-04-16 15:28:25 +02:00
|
|
|
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
|
2019-11-10 04:58:04 +01:00
|
|
|
|
2020-04-16 15:28:25 +02:00
|
|
|
old_offsets_tool = not os.path.isfile(new_offsets_tool_path)
|
2019-11-10 04:58:04 +01:00
|
|
|
|
2020-04-16 15:28:25 +02:00
|
|
|
offsets_tool_env = None
|
2019-11-10 04:58:04 +01:00
|
|
|
|
2020-04-16 15:28:25 +02:00
|
|
|
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)
|
2019-11-10 04:58:04 +01:00
|
|
|
|
|
|
|
build_dir = '%s/%s-%s-%s' % (opts.configure_dir, product, target, opts.configuration)
|
|
|
|
mkdir_p(build_dir)
|
|
|
|
|
|
|
|
run_command('python3', [
|
2020-04-16 15:28:25 +02:00
|
|
|
old_offsets_tool_path if old_offsets_tool else new_offsets_tool_path,
|
2019-11-10 04:58:04 +01:00
|
|
|
'--targetdir=%s/%s-%s-%s' % (opts.configure_dir, product, device_target, opts.configuration),
|
|
|
|
'--abi=%s' % offsets_dumper_abi,
|
|
|
|
'--monodir=%s' % opts.mono_source_root,
|
|
|
|
'--outfile=%s/%s.h' % (build_dir, target_triple)
|
|
|
|
] + env['_%s-%s_OFFSETS_DUMPER_ARGS' % (product, target)],
|
|
|
|
env=offsets_tool_env, name='offsets-tool')
|
|
|
|
|
|
|
|
# Runtime template
|
|
|
|
setup_runtime_template(env, opts, product, target, host_triple)
|
|
|
|
|
|
|
|
|
|
|
|
def run_autogen(opts: RuntimeOpts):
|
|
|
|
autogen_env = os.environ.copy()
|
|
|
|
autogen_env['NOCONFIGURE'] = '1'
|
|
|
|
|
|
|
|
if not find_executable('glibtoolize') and 'CUSTOM_GLIBTOOLIZE_PATH' in os.environ:
|
|
|
|
autogen_env['PATH'] = os.environ['CUSTOM_GLIBTOOLIZE_PATH'] + ':' + autogen_env['PATH']
|
|
|
|
|
|
|
|
run_command(os.path.join(opts.mono_source_root, 'autogen.sh'), cwd=opts.mono_source_root, env=autogen_env, name='autogen')
|
|
|
|
|
|
|
|
|
|
|
|
def run_configure(env: dict, opts: RuntimeOpts, product: str, target: str):
|
|
|
|
build_dir = path_join(opts.configure_dir, '%s-%s-%s' % (product, target, opts.configuration))
|
|
|
|
mkdir_p(build_dir)
|
|
|
|
|
|
|
|
def str_dict_val(val):
|
|
|
|
if isinstance(val, list):
|
|
|
|
return ' '.join(val) # Don't need to surround with quotes
|
|
|
|
return val
|
|
|
|
|
|
|
|
ac_vars = env['_runtime_%s-%s_AC_VARS' % (product, target)]
|
|
|
|
configure_env_args = env['_runtime_%s-%s_CONFIGURE_ENVIRONMENT' % (product, target)]
|
|
|
|
configure_env_args = [('%s=%s' % (key, str_dict_val(value))) for (key, value) in configure_env_args.items()]
|
|
|
|
configure_flags = env['_runtime_%s-%s_CONFIGURE_FLAGS' % (product, target)]
|
|
|
|
|
|
|
|
configure = path_join(opts.mono_source_root, 'configure')
|
|
|
|
configure_args = ac_vars + configure_env_args + configure_flags
|
|
|
|
|
|
|
|
configure_env = os.environ.copy()
|
|
|
|
target_extra_path = env.get('_%s-%s_PATH' % (product, target), '')
|
|
|
|
if target_extra_path:
|
|
|
|
configure_env['PATH'] += ':' + target_extra_path
|
|
|
|
|
|
|
|
run_command(configure, args=configure_args, cwd=build_dir, env=configure_env, name='configure')
|