aboutsummaryrefslogtreecommitdiff
path: root/circuitpython/tools/make-frozen.py
diff options
context:
space:
mode:
Diffstat (limited to 'circuitpython/tools/make-frozen.py')
-rwxr-xr-xcircuitpython/tools/make-frozen.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/circuitpython/tools/make-frozen.py b/circuitpython/tools/make-frozen.py
new file mode 100755
index 0000000..74dd4a9
--- /dev/null
+++ b/circuitpython/tools/make-frozen.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+
+# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
+#
+# SPDX-License-Identifier: MIT
+
+#
+# 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"};')