Browse Source
Takes the functionality from tools/make-frozen.py, adds support for multiple frozen directories, and moves it to tools/makemanifest.py. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>pull/7562/merge
Jim Mussared
3 years ago
committed by
Damien George
2 changed files with 66 additions and 93 deletions
@ -1,85 +0,0 @@ |
|||
#!/usr/bin/env python |
|||
# |
|||
# Create frozen modules structure for MicroPython. |
|||
# |
|||
# Usage: |
|||
# |
|||
# Have a directory with modules to be frozen (only modules, not packages |
|||
# supported so far): |
|||
# |
|||
# frozen/foo.py |
|||
# frozen/bar.py |
|||
# |
|||
# Run script, passing path to the directory above: |
|||
# |
|||
# ./make-frozen.py frozen > frozen.c |
|||
# |
|||
# Include frozen.c in your build, having defined MICROPY_MODULE_FROZEN_STR in |
|||
# config. |
|||
# |
|||
from __future__ import print_function |
|||
import sys |
|||
import os |
|||
|
|||
|
|||
def module_name(f): |
|||
return f |
|||
|
|||
|
|||
modules = [] |
|||
|
|||
if len(sys.argv) > 1: |
|||
root = sys.argv[1].rstrip("/") |
|||
root_len = len(root) |
|||
|
|||
for dirpath, dirnames, filenames in os.walk(root): |
|||
for f in filenames: |
|||
fullpath = dirpath + "/" + f |
|||
st = os.stat(fullpath) |
|||
modules.append((fullpath[root_len + 1 :], st)) |
|||
|
|||
print("#include <stdint.h>") |
|||
print("const char mp_frozen_str_names[] = {") |
|||
for f, st in modules: |
|||
m = module_name(f) |
|||
print('"%s\\0"' % m) |
|||
print('"\\0"};') |
|||
|
|||
print("const uint32_t mp_frozen_str_sizes[] = {") |
|||
|
|||
for f, st in modules: |
|||
print("%d," % st.st_size) |
|||
|
|||
print("0};") |
|||
|
|||
print("const char mp_frozen_str_content[] = {") |
|||
for f, st in modules: |
|||
data = open(sys.argv[1] + "/" + f, "rb").read() |
|||
|
|||
# We need to properly escape the script data to create a C string. |
|||
# When C parses hex characters of the form \x00 it keeps parsing the hex |
|||
# data until it encounters a non-hex character. Thus one must create |
|||
# strings of the form "data\x01" "abc" to properly encode this kind of |
|||
# data. We could just encode all characters as hex digits but it's nice |
|||
# to be able to read the resulting C code as ASCII when possible. |
|||
|
|||
data = bytearray(data) # so Python2 extracts each byte as an integer |
|||
esc_dict = {ord("\n"): "\\n", ord("\r"): "\\r", ord('"'): '\\"', ord("\\"): "\\\\"} |
|||
chrs = ['"'] |
|||
break_str = False |
|||
for c in data: |
|||
try: |
|||
chrs.append(esc_dict[c]) |
|||
except KeyError: |
|||
if 32 <= c <= 126: |
|||
if break_str: |
|||
chrs.append('" "') |
|||
break_str = False |
|||
chrs.append(chr(c)) |
|||
else: |
|||
chrs.append("\\x%02x" % c) |
|||
break_str = True |
|||
chrs.append('\\0"') |
|||
print("".join(chrs)) |
|||
|
|||
print('"\\0"};') |
Loading…
Reference in new issue