pebble/applib-targets/emscripten/wscript

138 lines
4.6 KiB
Text
Raw Permalink Normal View History

from waflib import Logs
def em_resource(task):
packager = task.env.EMSCRIPTEN_ROOT + '/tools/file_packager.py'
task.exec_command(['python',
packager,
task.outputs[0].abspath(),
'--embed',
task.inputs[0].abspath(),
'--js-output=' + task.outputs[0].abspath()])
def configure(conf):
conf.find_program('node', var='NODE', errmsg='node is not installed')
# Make sure we're about to modify the 'local' conf:
prev_env = conf.env
conf.set_env(conf.all_envs['local'])
conf.load('emscripten')
# The standard lib emscripten bundles uses a different format
# for its stack guard!!
conf.env.CFLAGS.append('-D_TIME_H')
# For unit tests: DUMA depends on pthread,
# which I didn't get to work with emscripten.
conf.env.DEFINES.append('DUMA_DISABLED')
# Flags that emcc doesn't support, just remove them:
unwanted_cflags = ['-gdwarf-4']
if 'RELEASE' not in conf.env.DEFINES:
conf.env.EMCC_DEBUG = 2
conf.env['CFLAGS'].extend(['-g4'])
unwanted_cflags.extend(['-g3', '-g'])
conf.env['CFLAGS'] = filter(
lambda flag: flag not in unwanted_cflags,
conf.env['CFLAGS']
)
conf.env.EMX_OTHER_SETTINGS = [
'SAFE_HEAP=1',
# absurdly large value so we don't worry:
'RESERVED_FUNCTION_POINTERS=1000',
'ERROR_ON_UNDEFINED_SYMBOLS=1'
]
conf.add_platform_defines(conf.env)
conf.recurse('integration_tests')
conf.setenv('emscripten', conf.env)
conf.set_env(prev_env)
def apply_config_for_applib_and_test_rocky_emx_builds(bld):
bld.env.DEFINES.append("APPLIB_EMSCRIPTEN=1")
# __builtin_return_address() doesn't seem to be supported by Emscripten,
# it fail at runtime due to a missing `llvm_return_address` function.
bld.env.CFLAGS.extend(['-D__builtin_return_address(level)=(0)'])
jerry_api_js = bld.path.make_node('jerry_api.js')
timeshift_js = bld.path.find_node('timeshift-js/timeshift.js')
html_binding_js = bld.path.make_node('html-binding.js')
bld.env.EMX_PRE_JS_FILES = [jerry_api_js, timeshift_js]
bld.env.EMX_POST_JS_FILES = [html_binding_js]
# use external transformation script instead of --pre-js and --post-js so
# we can replace functions and wrap entire file without interfering with
# --embed-file
transform_js_node_and_args = [bld.path.make_node('transform_js.py')]
if bld.variant == 'test_rocky_emx':
transform_js_node_and_args.append(' --unittest')
bld.env.EMX_TRANSFORM_JS_NODE_AND_ARGS = transform_js_node_and_args
def build(bld):
if bld.variant == 'test':
bld.recurse('tests')
return
# Extend waf's 'cprogram' feature with Emscripten-specific things:
bld.load('emscripten')
apply_config_for_applib_and_test_rocky_emx_builds(bld)
# Fine to use 'stlib' here vs emscripten_program, because we're only
# invoking emcc to generate an archive file, so only 'standard' compiler
# flags need to be passed.
bld.objects(source=['emscripten_jerry_api.c'],
target='emscripten_jerry_api',
use=['jerry_port_includes'])
if bld.variant == 'test_rocky_emx':
return
# Copy stuff from html folder:
html_node = bld.path.find_dir('html')
html_bld_node = bld.path.get_bld().make_node('html')
for file in html_node.ant_glob('**/*'):
bld(rule="cp ${SRC} ${TGT}",
source=file,
target=html_bld_node.make_node(file.path_from(html_node)))
pbpack = bld.path.parent.parent.get_bld().make_node('system_resources.pbpack')
exported_functions = bld.path.make_node('exported_functions.json')
sources = bld.path.ant_glob('*.c', excl='emscripten_jerry_api.c')
rockyjs_node = html_bld_node.make_node('rocky.js')
bld.program(source=sources,
target=rockyjs_node,
emx_pre_js_files=[],
emx_post_js_files=[],
emx_exported_functions=exported_functions,
emx_other_settings=[],
emx_embed_files=[pbpack],
use=['emscripten_jerry_api',
'applib',
'applib_includes',
'nanopb',
'fw_includes',
'libutil',
'upng'])
bld.recurse('integration_tests')
def print_index_html_path(bld):
index_html_path = html_bld_node.find_node('index.html').abspath()
Logs.pprint('PINK',
'Built Rocky Simulator: file://{}'.format(index_html_path))
bld.add_post_fun(print_index_html_path)
# vim:filetype=python