80 lines
2.3 KiB
Python
Executable File
80 lines
2.3 KiB
Python
Executable File
#!/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()
|