# Copyright 2013 The Flutter Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import argparse import errno import os def make_directories(path): try: os.makedirs(path) except OSError as exc: if exc.errno == errno.EEXIST and os.path.isdir(path): pass else: raise # Dump the bytes of file into a C translation unit. # This can be used to embed the file contents into a binary. def main(): parser = argparse.ArgumentParser() parser.add_argument( '--symbol-name', type=str, required=True, help='The name of the symbol referencing the data.' ) parser.add_argument( '--output-header', type=str, required=True, help='The header file containing the symbol reference.' ) parser.add_argument( '--output-source', type=str, required=True, help='The source file containing the file bytes.' ) parser.add_argument( '--source', type=str, required=True, help='The source file whose contents to embed in the output source file.' ) args = parser.parse_args() assert os.path.exists(args.source) output_header = os.path.abspath(args.output_header) output_source = os.path.abspath(args.output_source) output_header_basename = output_header[output_header.rfind('/') + 1:] make_directories(os.path.dirname(output_header)) make_directories(os.path.dirname(output_source)) with open(args.source, 'rb') as source, open(output_source, 'w') as output: data_len = 0 output.write(f'#include "{output_header_basename}"\n') output.write('#include \n') output.write( f'alignas(std::max_align_t) const unsigned char impeller_{args.symbol_name}_data[] =\n' ) output.write('{\n') while True: byte = source.read(1) if not byte: break data_len += 1 output.write(f'{ord(byte)},') output.write('};\n') output.write(f'const unsigned long impeller_{args.symbol_name}_length = {data_len};\n') with open(output_header, 'w') as output: output.write('#pragma once\n') output.write('#ifdef __cplusplus\n') output.write('extern "C" {\n') output.write('#endif\n\n') output.write(f'extern const unsigned char impeller_{args.symbol_name}_data[];\n') output.write(f'extern const unsigned long impeller_{args.symbol_name}_length;\n\n') output.write('#ifdef __cplusplus\n') output.write('}\n') output.write('#endif\n') if __name__ == '__main__': main()