| #!/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() |