"""Unpackages a bazel emscripten archive for use in a bazel BUILD rule. This script will take a tar archive containing the output of the emscripten toolchain. This file contains any output files produced by a wasm_cc_binary or a cc_binary built with --config=wasm. The files are extracted into the given output paths. The contents of the archive are expected to match the given outputs extnames. This script and its accompanying Bazel rule should allow you to extract a WebAssembly binary into a larger web application. """ import argparse import os import tarfile def ensure(f): if not os.path.exists(f): with open(f, 'w'): pass def main(): parser = argparse.ArgumentParser() parser.add_argument('--archive', help='The archive to extract from.') parser.add_argument('--outputs', help='Comma separated list of files that should be extracted from the archive. Only the extname has to match a file in the archive.') parser.add_argument('--allow_empty_outputs', help='If an output listed in --outputs does not exist, create it anyways.', action='store_true') args = parser.parse_args() args.archive = os.path.normpath(args.archive) args.outputs = args.outputs.split(",") tar = tarfile.open(args.archive) for member in tar.getmembers(): extname = '.' + member.name.split('.', 1)[1] for idx, output in enumerate(args.outputs): if output.endswith(extname): member_file = tar.extractfile(member) with open(output, "wb") as output_file: output_file.write(member_file.read()) args.outputs.pop(idx) break for output in args.outputs: extname = '.' + output.split('.', 1)[1] if args.allow_empty_outputs: ensure(output) else: print("[ERROR] Archive does not contain file with extname: %s" % extname) if __name__ == '__main__': main()