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