def test_binaryen(self): import tools.ports.binaryen as binaryen tag_file = Cache.get_path('binaryen_tag_' + binaryen.TAG + '.txt') assert not os.environ.get('BINARYEN') # must not have binaryen env var set # test in 2 modes - with BINARYEN_ROOT in the config file, set to '', and without it entirely for binaryen_root_in_config in [1, 0]: print('binaryen_root_in_config:', binaryen_root_in_config) def prep(): restore_and_set_up() print('clearing ports...') print(self.do([PYTHON, EMCC, '--clear-ports'])) wipe() self.do([PYTHON, EMCC]) # first run stage try_delete(tag_file) # if BINARYEN_ROOT is set, we don't build the port. Check we do build it if not if binaryen_root_in_config: config = open(CONFIG_FILE).read() assert '''BINARYEN_ROOT = os.path.expanduser(os.getenv('BINARYEN', ''))''' in config, config # setup created it to be '' print('created config:') print(config) restore_and_set_up() config = open(CONFIG_FILE).read() config = config.replace('BINARYEN_ROOT', '''BINARYEN_ROOT = os.path.expanduser(os.getenv('BINARYEN', '')) # ''') else: restore_and_set_up() config = open(CONFIG_FILE).read() config = config.replace('BINARYEN_ROOT', '#') print('modified config:') print(config) open(CONFIG_FILE, 'w').write(config) print('build using embuilder') prep() run_process([PYTHON, EMBUILDER, 'build', 'binaryen']) assert os.path.exists(tag_file) run_process([PYTHON, EMCC] + MINIMAL_HELLO_WORLD + ['-s', 'BINARYEN=1', '-s', 'BINARYEN_METHOD="interpret-binary"']) self.assertContained('hello, world!', run_js('a.out.js')) print('see we show an error for emmake (we cannot build natively under emmake)') prep() try_delete('a.out.js') out = self.do([PYTHON, path_from_root('emmake.py'), EMCC] + MINIMAL_HELLO_WORLD + ['-s', 'BINARYEN=1', '-s', 'BINARYEN_METHOD="interpret-binary"']) assert not os.path.exists(tag_file) assert not os.path.exists('a.out.js') self.assertContained('For example, for binaryen, do "python embuilder.py build binaryen"', out) if not binaryen_root_in_config: print('build on demand') for side_module in (False, True): print(side_module) prep() assert not os.path.exists(tag_file) try_delete('a.out.js') try_delete('a.out.wasm') cmd = [PYTHON, EMCC] if not side_module: cmd += MINIMAL_HELLO_WORLD else: # EM_ASM doesn't work in a wasm side module, build a normal program cmd += [path_from_root('tests', 'hello_world.c'), '-s', 'SIDE_MODULE=1'] cmd += ['-s', 'BINARYEN=1', '-s', 'BINARYEN_METHOD="interpret-binary"'] run_process(cmd) assert os.path.exists(tag_file) assert os.path.exists('a.out.wasm') if not side_module: assert os.path.exists('a.out.js') self.assertContained('hello, world!', run_js('a.out.js'))
def test_embuilder(self): restore_and_set_up() tests = [ ([PYTHON, EMBUILDER], ['Emscripten System Builder Tool', 'build libc', 'native_optimizer'], True, []), ([PYTHON, EMBUILDER, 'build', 'waka'], 'ERROR', False, []), ([PYTHON, EMBUILDER, 'build', 'struct_info'], ['building and verifying struct_info', 'success'], True, ['generated_struct_info.json']), ([PYTHON, EMBUILDER, 'build', 'libc'], ['building and verifying libc', 'success'], True, ['libc.bc']), ([PYTHON, EMBUILDER, 'build', 'libc-mt'], ['building and verifying libc-mt', 'success'], True, ['libc-mt.bc']), ([PYTHON, EMBUILDER, 'build', 'libc-extras'], ['building and verifying libc-extras', 'success'], True, ['libc-extras.bc']), ([PYTHON, EMBUILDER, 'build', 'dlmalloc'], ['building and verifying dlmalloc', 'success'], True, ['dlmalloc.bc']), ([PYTHON, EMBUILDER, 'build', 'dlmalloc_debug'], ['building and verifying dlmalloc', 'success'], True, ['dlmalloc_debug.bc']), ([PYTHON, EMBUILDER, 'build', 'dlmalloc_threadsafe'], ['building and verifying dlmalloc_threadsafe', 'success'], True, ['dlmalloc_threadsafe.bc']), ([PYTHON, EMBUILDER, 'build', 'dlmalloc_threadsafe_debug'], ['building and verifying dlmalloc', 'success'], True, ['dlmalloc_threadsafe_debug.bc']), ([PYTHON, EMBUILDER, 'build', 'emmalloc'], ['building and verifying emmalloc', 'success'], True, ['emmalloc.bc']), ([PYTHON, EMBUILDER, 'build', 'emmalloc_debug'], ['building and verifying emmalloc', 'success'], True, ['emmalloc_debug.bc']), ([PYTHON, EMBUILDER, 'build', 'pthreads'], ['building and verifying pthreads', 'success'], True, ['pthreads.bc']), ([PYTHON, EMBUILDER, 'build', 'libcxx'], ['success'], True, ['libcxx.a']), ([PYTHON, EMBUILDER, 'build', 'libcxx_noexcept'], ['success'], True, ['libcxx_noexcept.a']), ([PYTHON, EMBUILDER, 'build', 'libcxxabi'], ['success'], True, ['libcxxabi.bc']), ([PYTHON, EMBUILDER, 'build', 'gl'], ['success'], True, ['gl.bc']), ([PYTHON, EMBUILDER, 'build', 'native_optimizer'], ['success'], True, ['optimizer.2.exe']), ([PYTHON, EMBUILDER, 'build', 'zlib'], ['building and verifying zlib', 'success'], True, ['zlib.bc']), ([PYTHON, EMBUILDER, 'build', 'libpng'], ['building and verifying libpng', 'success'], True, ['libpng.bc']), ([PYTHON, EMBUILDER, 'build', 'bullet'], ['building and verifying bullet', 'success'], True, ['bullet.bc']), ([PYTHON, EMBUILDER, 'build', 'vorbis'], ['building and verifying vorbis', 'success'], True, ['vorbis.bc']), ([PYTHON, EMBUILDER, 'build', 'ogg'], ['building and verifying ogg', 'success'], True, ['ogg.bc']), ([PYTHON, EMBUILDER, 'build', 'sdl2'], ['success'], True, ['sdl2.bc']), ([PYTHON, EMBUILDER, 'build', 'sdl2-gfx'], ['success'], True, ['sdl2-gfx.bc']), ([PYTHON, EMBUILDER, 'build', 'sdl2-image'], ['success'], True, ['sdl2-image.bc']), ([PYTHON, EMBUILDER, 'build', 'freetype'], ['building and verifying freetype', 'success'], True, ['freetype.bc']), ([PYTHON, EMBUILDER, 'build', 'harfbuzz'], ['building and verifying harfbuzz', 'success'], True, ['harfbuzz.bc']), ([PYTHON, EMBUILDER, 'build', 'icu'], ['building and verifying icu', 'success'], True, ['icu.bc']), ([PYTHON, EMBUILDER, 'build', 'sdl2-ttf'], ['building and verifying sdl2-ttf', 'success'], True, ['sdl2-ttf.bc']), ([PYTHON, EMBUILDER, 'build', 'sdl2-net'], ['building and verifying sdl2-net', 'success'], True, ['sdl2-net.bc']), ([PYTHON, EMBUILDER, 'build', 'binaryen'], ['building and verifying binaryen', 'success'], True, []), ([PYTHON, EMBUILDER, 'build', 'cocos2d'], ['building and verifying cocos2d', 'success'], True, ['libCocos2d.bc']), ([PYTHON, EMBUILDER, 'build', 'wasm-libc'], ['building and verifying wasm-libc', 'success'], True, ['wasm-libc.bc']), ] if Settings.WASM_BACKEND: tests.append(([PYTHON, EMBUILDER, 'build', 'wasm_compiler_rt'], ['building and verifying wasm_compiler_rt', 'success'], True, ['wasm_compiler_rt.a']),) Cache.erase() for command, expected, success, result_libs in tests: print(command) for lib in result_libs: if os.path.sep in lib: dirname = os.path.dirname(Cache.get_path(lib)) print(' erase dir', dirname) try_delete(dirname) else: print(' erase file', lib) try_delete(Cache.get_path(lib)) proc = run_process(command, stdout=PIPE, stderr=STDOUT, check=False) out = proc.stdout if success and proc.returncode != 0: print(out) assert (proc.returncode == 0) == success if not isinstance(expected, list): expected = [expected] for ex in expected: print(' seek', ex) assert ex in out, out for lib in result_libs: print(' verify', lib) assert os.path.exists(Cache.get_path(lib))