mirror of https://github.com/google/pebble
				
				
				
			
		
			
				
	
	
		
			138 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
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
 |