|
@@ -0,0 +1,79 @@
|
|
|
+#!/usr/bin/env python3
|
|
|
+
|
|
|
+"""
|
|
|
+Sometime after v1.9.3, micropython-lib's directory structure was cleaned up and
|
|
|
+enhanced with manifest files.
|
|
|
+
|
|
|
+Though cleaner, it means it cannot be directly copied into the target.
|
|
|
+This script is during build process to perform that conversion.
|
|
|
+
|
|
|
+It makes use of manifestfile.py, which is normally located in micropython's
|
|
|
+tool directory.
|
|
|
+
|
|
|
+It also depends on the micropython-lib that is cloned in lib/micropython-lib
|
|
|
+during build.
|
|
|
+"""
|
|
|
+
|
|
|
+import argparse
|
|
|
+import manifestfile
|
|
|
+import os
|
|
|
+import shutil
|
|
|
+
|
|
|
+
|
|
|
+def get_library_name_type(manifest_path: str) -> tuple[str, bool]:
|
|
|
+ split = manifest_path.split("/")
|
|
|
+ return (split[-2], "unix-ffi" in split) # -1: "manifest.py", -2: library name
|
|
|
+
|
|
|
+
|
|
|
+def get_all_libraries(mpy_lib_dir: str):
|
|
|
+ # reuse manifestfile module capabilities to scan the micropython-lib directory
|
|
|
+
|
|
|
+ collected_list = manifestfile.ManifestFile(
|
|
|
+ manifestfile.MODE_FREEZE, {"MPY_LIB_DIR": mpy_lib_dir}
|
|
|
+ )
|
|
|
+ collected_list.freeze(mpy_lib_dir)
|
|
|
+
|
|
|
+ for file in collected_list.files():
|
|
|
+ if file.target_path.endswith("manifest.py"):
|
|
|
+ yield get_library_name_type(file.full_path)
|
|
|
+
|
|
|
+
|
|
|
+def copy_file(src: str, target: str, destination: str):
|
|
|
+ s = target.split("/")
|
|
|
+ s.pop()
|
|
|
+ d = f"{destination}/{'/'.join(s)}"
|
|
|
+ os.makedirs(d, exist_ok=True)
|
|
|
+ shutil.copy(src, f"{destination}/{target}")
|
|
|
+
|
|
|
+
|
|
|
+def copy_libraries(manifest, destination: str):
|
|
|
+ for f in manifest.files():
|
|
|
+ copy_file(f.full_path, f.target_path, destination)
|
|
|
+
|
|
|
+
|
|
|
+def process_cmdline_args():
|
|
|
+ parser = argparse.ArgumentParser(
|
|
|
+ description="Prepare micropython-lib to be installed"
|
|
|
+ )
|
|
|
+ parser.add_argument("micropython", help="Path to micropython source directory")
|
|
|
+ parser.add_argument("destination", help="Destination directory")
|
|
|
+
|
|
|
+ args = parser.parse_args()
|
|
|
+ return os.path.abspath(args.micropython), os.path.abspath(args.destination)
|
|
|
+
|
|
|
+
|
|
|
+def main():
|
|
|
+ micropython_dir, destination_dir = process_cmdline_args()
|
|
|
+ mpy_lib_dir = f"{micropython_dir}/lib/micropython-lib"
|
|
|
+
|
|
|
+ manifest = manifestfile.ManifestFile(
|
|
|
+ manifestfile.MODE_FREEZE, {"MPY_LIB_DIR": mpy_lib_dir}
|
|
|
+ )
|
|
|
+
|
|
|
+ for library, is_ffi in get_all_libraries(mpy_lib_dir):
|
|
|
+ manifest.require(library, unix_ffi=is_ffi)
|
|
|
+
|
|
|
+ copy_libraries(manifest, destination_dir)
|
|
|
+
|
|
|
+
|
|
|
+main()
|