summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2020-06-23 17:20:59 +1000
committerDamien George <damien@micropython.org>2020-06-24 12:21:30 +1000
commit76faeed098ec4ee70202202cb11e64b78a77f14e (patch)
treea19e02e9f9effd58189d6eb8288078284812aff4
parent457fdf61c3bca550b4ad3fb2c6822c838984dac0 (diff)
tools/makemanifest.py: Support freezing a subdirectory recursively.
This adds support for freezing an entire directory while keeping the directory as part of the import path. For example freeze("path/to/library", "module") will recursively freeze all scripts in "path/to/library/module" and have them importable as "from module import ...". Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--tools/makemanifest.py19
1 files changed, 14 insertions, 5 deletions
diff --git a/tools/makemanifest.py b/tools/makemanifest.py
index 2cee6aebc..babce7fa7 100644
--- a/tools/makemanifest.py
+++ b/tools/makemanifest.py
@@ -76,9 +76,10 @@ def freeze(path, script=None, opt=0):
If `script` is an iterable then freeze() is called on all items of the
iterable (with the same `path` and `opt` passed through).
- If `script` is a string then it specifies the filename to freeze, and
- can include extra directories before the file. The file will be
- searched for in `path`.
+ If `script` is a string then it specifies the file or directory to
+ freeze, and can include extra directories before the file or last
+ directory. The file or directory will be searched for in `path`. If
+ `script` is a directory then all files in that directory will be frozen.
`opt` is the optimisation level to pass to mpy-cross when compiling .py
to .mpy.
@@ -182,14 +183,22 @@ def freeze_internal(kind, path, script, opt):
if any(f[0] == KIND_AS_STR for f in manifest_list):
raise FreezeError("can only freeze one str directory")
manifest_list.append((KIND_AS_STR, path, script, opt))
- elif script is None:
- for dirpath, dirnames, filenames in os.walk(path, followlinks=True):
+ elif script is None or isinstance(script, str) and script.find(".") == -1:
+ # Recursively search `path` for files to freeze, optionally restricted
+ # to a subdirectory specified by `script`
+ if script is None:
+ subdir = ""
+ else:
+ subdir = "/" + script
+ for dirpath, dirnames, filenames in os.walk(path + subdir, followlinks=True):
for f in filenames:
freeze_internal(kind, path, (dirpath + "/" + f)[len(path) + 1 :], opt)
elif not isinstance(script, str):
+ # `script` is an iterable of items to freeze
for s in script:
freeze_internal(kind, path, s, opt)
else:
+ # `script` should specify an individual file to be frozen
extension_kind = {KIND_AS_MPY: ".py", KIND_MPY: ".mpy"}
if kind == KIND_AUTO:
for k, ext in extension_kind.items():