| # 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(f'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() |