#!/usr/bin/env python # # Takes a directory of files and zips them up (as uncompressed files). # This then gets converted into a C data structure which can be read # like a filesystem at runtime. # # This is somewhat like frozen modules in python, but allows arbitrary files # to be used. from __future__ import print_function import argparse import os import subprocess import sys import types def create_zip(zip_filename, zip_dir): abs_zip_filename = os.path.abspath(zip_filename) save_cwd = os.getcwd() os.chdir(zip_dir) if os.path.exists(abs_zip_filename): os.remove(abs_zip_filename) subprocess.check_call(['zip', '-0', '-r', '-D', abs_zip_filename, '.']) os.chdir(save_cwd) def create_c_from_file(c_filename, zip_filename): with open(zip_filename, 'rb') as zip_file: with open(c_filename, 'wb') as c_file: print('#include ', file=c_file) print('', file=c_file) print('const uint8_t memzip_data[] = {', file=c_file) while True: buf = zip_file.read(16) if not buf: break print(' ', end='', file=c_file) for byte in buf: if type(byte) is types.StringType: print(' 0x{:02x},'.format(ord(byte)), end='', file=c_file) else: print(' 0x{:02x},'.format(byte), end='', file=c_file) print('', file=c_file) print('};', file=c_file) def main(): parser = argparse.ArgumentParser( prog='make-memzip.py', usage='%(prog)s [options] [command]', description='Generates a C source memzip file.' ) parser.add_argument( '-z', '--zip-file', dest='zip_filename', help='Specifies the name of the created zip file.', default='memzip_files.zip' ) parser.add_argument( '-c', '--c-file', dest='c_filename', help='Specifies the name of the created C source file.', default='memzip_files.c' ) parser.add_argument( dest='source_dir', default='memzip_files' ) args = parser.parse_args(sys.argv[1:]) print('args.zip_filename =', args.zip_filename) print('args.c_filename =', args.c_filename) print('args.source_dir =', args.source_dir) create_zip(args.zip_filename, args.source_dir) create_c_from_file(args.c_filename, args.zip_filename) if __name__ == "__main__": main()