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