1#!/usr/bin/env python 2 3""" 4Copyright (c) 2024 Silicon Laboratories Inc. 5 6SPDX-License-Identifier: Apache-2.0 7""" 8 9import argparse 10import re 11import shutil 12import subprocess 13from pathlib import Path 14from ruamel.yaml import YAML 15 16paths = [ 17 "License.txt", 18 "platform/common/config/sl_core_config.h", 19 "platform/common/inc/*.h", 20 "platform/common/src/sl_assert.c", 21 "platform/common/src/sl_core_cortexm.c", 22 "platform/common/src/sl_slist.c", 23 "platform/Device/SiliconLabs/EFR32BG2[279]/Include/*.h", 24 "platform/Device/SiliconLabs/EFR32BG2[279]/Source/system_*.c", 25 "platform/Device/SiliconLabs/EFR32FG2[3]/Include/*.h", 26 "platform/Device/SiliconLabs/EFR32FG2[3]/Source/system_*.c", 27 "platform/Device/SiliconLabs/EFR32MG2[149]/Include/*.h", 28 "platform/Device/SiliconLabs/EFR32MG2[149]/Source/system_*.c", 29 "platform/Device/SiliconLabs/EFR32ZG2[3]/Include/*.h", 30 "platform/Device/SiliconLabs/EFR32ZG2[3]/Source/system_*.c", 31 "platform/driver/gpio/inc/*.h", 32 "platform/driver/gpio/src/*.c", 33 "platform/emdrv/common/inc/*.h", 34 "platform/emdrv/dmadrv/config/s2_8ch/*.h", 35 "platform/emdrv/dmadrv/inc/*.h", 36 "platform/emdrv/dmadrv/inc/s2_signals/.h", 37 "platform/emdrv/dmadrv/src/*.c", 38 "platform/emlib/inc/*.h", 39 "platform/emlib/src/*.c", 40 "platform/peripheral/inc/*.h", 41 "platform/peripheral/src/*.c", 42 "platform/radio/rail_lib/chip/**/*.[ch]", 43 "platform/radio/rail_lib/common/*.[ch]", 44 "platform/radio/rail_lib/plugin/pa-conversions/**/*.[ch]", 45 "platform/radio/rail_lib/plugin/rail_util_protocol/**/*.[ch]", 46 "platform/radio/rail_lib/protocol/**/*.[ch]", 47 "platform/security/sl_component/se_manager/**/*.[ch]", 48 "platform/security/sl_component/sli_psec_osal/**/*.[ch]", 49 "platform/security/sl_component/sl_protocol_crypto/**/*.[ch]", 50 "platform/security/sl_component/sli_crypto/**/*.[ch]", 51 "platform/service/clock_manager/config/**/*.h", # TODO 52 "platform/service/clock_manager/inc/*.h", 53 "platform/service/clock_manager/src/*.[ch]", 54 "platform/service/device_init/config/**/*.h", # TODO 55 "platform/service/device_init/inc/*.h", 56 "platform/service/device_init/src/*.[ch]", 57 "platform/service/device_manager/**/*.[ch]", 58 "platform/service/hfxo_manager/config/**/*.h", # TODO 59 "platform/service/hfxo_manager/inc/*.h", 60 "platform/service/hfxo_manager/src/*.[ch]", 61 "platform/service/interrupt_manager/inc/*.h", 62 "platform/service/memory_manager/config/*.h", # TODO 63 "platform/service/memory_manager/inc/*.h", 64 "platform/service/memory_manager/src/*.[ch]", 65 "platform/service/memory_manager/profiler/config/*.h", # TODO 66 "platform/service/memory_manager/profiler/inc/*.h", 67 "platform/service/memory_manager/profiler/src/*.c", 68 "platform/service/power_manager/config/**/*.h", # TODO 69 "platform/service/power_manager/inc/*.h", 70 "platform/service/power_manager/src/*/*.[ch]", 71 "platform/service/sleeptimer/config/**/*.h", # TODO 72 "platform/service/sleeptimer/inc/*.h", 73 "platform/service/sleeptimer/src/*.[ch]", 74 "protocol/bluetooth/bgstack/ll/inc/*.h", 75] 76 77configs = [ 78 "platform/common/config/sl_core_config.h" 79] 80 81def copy_files(src: Path, dst: Path, paths: list[str]) -> None: 82 for path in paths: 83 for f in src.glob(path): 84 destfile = dst / f.relative_to(src) 85 destfile.parent.mkdir(parents=True, exist_ok=True) 86 shutil.copy(f, destfile) 87 88 89def update_blobs(mod: Path, sdk: Path) -> None: 90 y = YAML(typ='rt') 91 y.default_flow_style = False 92 y.indent(mapping=2, sequence=4, offset=2) 93 y.preserve_quotes = True 94 y.width = 1024 95 y.boolean_representation = ['False', 'True'] 96 97 slcs = y.load(sdk / "simplicity_sdk.slcs") 98 99 data = y.load(mod) 100 for blob in data.get('blobs'): 101 path = Path(blob["path"]) 102 if not path.is_relative_to(Path("simplicity_sdk")): 103 continue 104 105 path = path.relative_to(Path("simplicity_sdk")) 106 lfs = subprocess.check_output(["git", "show", f"HEAD:{str(path)}"], cwd=sdk).decode() 107 sha = re.search(r"sha256:([0-9a-f]{64})\s", lfs).group(1) 108 109 blob["sha256"] = sha 110 blob["url"] = f"https://artifacts.silabs.net/artifactory/gsdk/objects/{sha[0:2]}/{sha[2:4]}/{sha}" 111 blob["version"] = slcs["sdk_version"] 112 113 y.dump(data, mod) 114 115 116if __name__ == "__main__": 117 parser = argparse.ArgumentParser() 118 parser.add_argument("--sdk", "-s", type=Path) 119 parser.add_argument("--blobs", "-b", action='store_true') 120 args = parser.parse_args() 121 122 dst = (Path(__file__).parent.parent / "simplicity_sdk").resolve() 123 124 if args.sdk is not None: 125 src = args.sdk.resolve(strict=True) 126 127 print(f"Import SDK from {src}") 128 for dir in dst.iterdir(): 129 if dir.is_dir(): 130 shutil.rmtree(dir, ignore_errors=True) 131 132 copy_files(src, dst, paths) 133 134 print(f"Update module.yml with blobs from {src}") 135 mod = Path(__file__).parent.parent / "zephyr" / "module.yml" 136 update_blobs(mod, src) 137 138 print("Done") 139 else: 140 print("No SDK to import from") 141