lib/memzip: Factor out memzip from teensy/ into lib/memzip.
parent
a9f3030371
commit
074d713bfb
@ -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