Dave Hylands
9 years ago
committed by
Damien George
7 changed files with 126 additions and 13 deletions
@ -0,0 +1,28 @@ |
|||||
|
MEMZIP - a simple readonly file system |
||||
|
|
||||
|
memzip takes a zip file which is comprised of uncompressed files and |
||||
|
and presents it as a filesystem, allowing Python files to be imported. |
||||
|
|
||||
|
The script make-memzip.py takes a directory name and will create a zip file |
||||
|
containing uncompressed files found in the directory. It will then generate |
||||
|
a C file which contains the data from the zip file. |
||||
|
|
||||
|
A typical addition to a makefile would look like: |
||||
|
``` |
||||
|
SRC_C += \ |
||||
|
lib/memzip/import.c \ |
||||
|
lib/memzip/lexermemzip.c \ |
||||
|
lib/memzip/memzip.c \ |
||||
|
|
||||
|
OBJ += $(BUILD)/memzip-files.o |
||||
|
|
||||
|
MAKE_MEMZIP = ../lib/memzip/make-memzip.py |
||||
|
|
||||
|
$(BUILD)/memzip-files.o: $(BUILD)/memzip-files.c |
||||
|
$(call compile_c) |
||||
|
|
||||
|
$(BUILD)/memzip-files.c: $(shell find ${MEMZIP_DIR} -type f) |
||||
|
@$(ECHO) "Creating $@" |
||||
|
$(Q)$(PYTHON) $(MAKE_MEMZIP) --zip-file $(BUILD)/memzip-files.zip --c-file $@ $(MEMZIP_DIR) |
||||
|
``` |
||||
|
|
@ -0,0 +1,79 @@ |
|||||
|
#!/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 <stdint.h>', 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() |
||||
|
|
Loading…
Reference in new issue