#!/usr/bin/env python """ Copyright (c) 2024 Silicon Laboratories Inc. SPDX-License-Identifier: Apache-2.0 """ import argparse import re import shutil import subprocess from pathlib import Path from ruamel.yaml import YAML paths = [ "License.txt", "platform/common/config/sl_core_config.h", "platform/common/inc/*.h", "platform/common/src/sl_assert.c", "platform/common/src/sl_core_cortexm.c", "platform/common/src/sl_slist.c", "platform/Device/SiliconLabs/EFR32BG2[279]/Include/*.h", "platform/Device/SiliconLabs/EFR32BG2[279]/Source/system_*.c", "platform/Device/SiliconLabs/EFR32FG2[3]/Include/*.h", "platform/Device/SiliconLabs/EFR32FG2[3]/Source/system_*.c", "platform/Device/SiliconLabs/EFR32MG2[149]/Include/*.h", "platform/Device/SiliconLabs/EFR32MG2[149]/Source/system_*.c", "platform/Device/SiliconLabs/EFR32ZG2[3]/Include/*.h", "platform/Device/SiliconLabs/EFR32ZG2[3]/Source/system_*.c", "platform/driver/gpio/inc/*.h", "platform/driver/gpio/src/*.c", "platform/emdrv/common/inc/*.h", "platform/emdrv/dmadrv/config/s2_8ch/*.h", "platform/emdrv/dmadrv/inc/*.h", "platform/emdrv/dmadrv/inc/s2_signals/.h", "platform/emdrv/dmadrv/src/*.c", "platform/emlib/inc/*.h", "platform/emlib/src/*.c", "platform/peripheral/inc/*.h", "platform/peripheral/src/*.c", "platform/radio/rail_lib/chip/**/*.[ch]", "platform/radio/rail_lib/common/*.[ch]", "platform/radio/rail_lib/plugin/pa-conversions/**/*.[ch]", "platform/radio/rail_lib/plugin/rail_util_protocol/**/*.[ch]", "platform/radio/rail_lib/protocol/**/*.[ch]", "platform/security/sl_component/se_manager/**/*.[ch]", "platform/security/sl_component/sli_psec_osal/**/*.[ch]", "platform/security/sl_component/sl_protocol_crypto/**/*.[ch]", "platform/security/sl_component/sli_crypto/**/*.[ch]", "platform/service/clock_manager/config/**/*.h", # TODO "platform/service/clock_manager/inc/*.h", "platform/service/clock_manager/src/*.[ch]", "platform/service/device_init/config/**/*.h", # TODO "platform/service/device_init/inc/*.h", "platform/service/device_init/src/*.[ch]", "platform/service/device_manager/**/*.[ch]", "platform/service/hfxo_manager/config/**/*.h", # TODO "platform/service/hfxo_manager/inc/*.h", "platform/service/hfxo_manager/src/*.[ch]", "platform/service/interrupt_manager/inc/*.h", "platform/service/memory_manager/config/*.h", # TODO "platform/service/memory_manager/inc/*.h", "platform/service/memory_manager/src/*.[ch]", "platform/service/memory_manager/profiler/config/*.h", # TODO "platform/service/memory_manager/profiler/inc/*.h", "platform/service/memory_manager/profiler/src/*.c", "platform/service/power_manager/config/**/*.h", # TODO "platform/service/power_manager/inc/*.h", "platform/service/power_manager/src/*/*.[ch]", "platform/service/sleeptimer/config/**/*.h", # TODO "platform/service/sleeptimer/inc/*.h", "platform/service/sleeptimer/src/*.[ch]", "protocol/bluetooth/bgstack/ll/inc/*.h", ] configs = [ "platform/common/config/sl_core_config.h" ] def copy_files(src: Path, dst: Path, paths: list[str]) -> None: for path in paths: for f in src.glob(path): destfile = dst / f.relative_to(src) destfile.parent.mkdir(parents=True, exist_ok=True) shutil.copy(f, destfile) def update_blobs(mod: Path, sdk: Path) -> None: y = YAML(typ='rt') y.default_flow_style = False y.indent(mapping=2, sequence=4, offset=2) y.preserve_quotes = True y.width = 1024 y.boolean_representation = ['False', 'True'] slcs = y.load(sdk / "simplicity_sdk.slcs") data = y.load(mod) for blob in data.get('blobs'): path = Path(blob["path"]) if not path.is_relative_to(Path("simplicity_sdk")): continue path = path.relative_to(Path("simplicity_sdk")) lfs = subprocess.check_output(["git", "show", f"HEAD:{str(path)}"], cwd=sdk).decode() sha = re.search(r"sha256:([0-9a-f]{64})\s", lfs).group(1) blob["sha256"] = sha blob["url"] = f"https://artifacts.silabs.net/artifactory/gsdk/objects/{sha[0:2]}/{sha[2:4]}/{sha}" blob["version"] = slcs["sdk_version"] y.dump(data, mod) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--sdk", "-s", type=Path) parser.add_argument("--blobs", "-b", action='store_true') args = parser.parse_args() dst = (Path(__file__).parent.parent / "simplicity_sdk").resolve() if args.sdk is not None: src = args.sdk.resolve(strict=True) print(f"Import SDK from {src}") for dir in dst.iterdir(): if dir.is_dir(): shutil.rmtree(dir, ignore_errors=True) copy_files(src, dst, paths) print(f"Update module.yml with blobs from {src}") mod = Path(__file__).parent.parent / "zephyr" / "module.yml" update_blobs(mod, src) print("Done") else: print("No SDK to import from")