tinyuf2/tools/get_deps.py
2025-05-28 20:57:08 +07:00

157 lines
6.1 KiB
Python

import argparse
import sys
import subprocess
from pathlib import Path
from multiprocessing import Pool
# Mandatory Dependencies that is always fetched
# path, url, commit, family (Alphabet sorted by path)
deps_mandatory = {}
# Optional Dependencies per MCU
# path, url, commit, family (Alphabet sorted by path)
deps_optional = {
'lib/mcu/analog/msdk' : ['https://github.com/analogdevicesinc/msdk.git',
'b20b398d3e5e2007594e54a74ba3d2a2e50ddd75',
'maxim'],
'lib/mcu/nxp/mcux-sdk': ['https://github.com/nxp-mcuxpresso/mcux-sdk.git',
'9990f264f98430f6d885041ab0f24224d68f4958',
'kinetis_k kinetis_k32l2 kinetis_kl lpc51 lpc54 lpc55 mcx mimxrt10xx'],
'lib/mcu/st/cmsis_device_f3': ['https://github.com/STMicroelectronics/cmsis_device_f3.git',
'5e4ee5ed7a7b6c85176bb70a9fd3c72d6eb99f1b',
'stm32f3'],
'lib/mcu/st/cmsis_device_f4': ['https://github.com/STMicroelectronics/cmsis_device_f4.git',
'2615e866fa48fe1ff1af9e31c348813f2b19e7ec',
'stm32f4'],
'lib/mcu/st/cmsis_device_h5': ['https://github.com/STMicroelectronics/cmsis_device_h5.git',
'9a778e0f162bd21200647adafb922d50b2c60f81',
'stm32h5'],
'lib/mcu/st/cmsis_device_h7': ['https://github.com/STMicroelectronics/cmsis_device_h7.git',
'60dc2c913203dc8629dc233d4384dcc41c91e77f',
'stm32h7'],
'lib/mcu/st/cmsis_device_l4': ['https://github.com/STMicroelectronics/cmsis_device_l4.git',
'6ca7312fa6a5a460b5a5a63d66da527fdd8359a6',
'stm32l4'],
'lib/mcu/st/stm32f3xx_hal_driver': ['https://github.com/STMicroelectronics/stm32f3xx_hal_driver.git',
'1761b6207318ede021706e75aae78f452d72b6fa',
'stm32f3'],
'lib/mcu/st/stm32f4xx_hal_driver': ['https://github.com/STMicroelectronics/stm32f4xx_hal_driver.git',
'04e99fbdabd00ab8f370f377c66b0a4570365b58',
'stm32f4'],
'lib/mcu/st/stm32h5xx_hal_driver': ['https://github.com/STMicroelectronics/stm32h5xx_hal_driver.git',
'7e8c7d8e91c15321864f513f8458ce7f6555eb4e',
'stm32h5'],
'lib/mcu/st/stm32h7xx_hal_driver': ['https://github.com/STMicroelectronics/stm32h7xx_hal_driver.git',
'd8461b980b59b1625207d8c4f2ce0a9c2a7a3b04',
'stm32h7'],
'lib/mcu/st/stm32l4xx_hal_driver': ['https://github.com/STMicroelectronics/stm32l4xx_hal_driver.git',
'aee3d5bf283ae5df87532b781bdd01b7caf256fc',
'stm32l4'],
'lib/mcu/wch/ch32v20x': ['https://github.com/openwch/ch32v20x.git',
'c4c38f507e258a4e69b059ccc2dc27dde33cea1b',
'ch32v20x'],
'lib/sct_neopixel': ['https://github.com/gsteiert/sct_neopixel.git',
'497ca8974927e3b853fd80c8fc35f4e557af79b9',
'lpc55'],
}
# combined 2 deps
deps_all = {**deps_mandatory, **deps_optional}
# TOP is tinyusb root dir
TOP = Path(__file__).parent.parent.resolve()
def run_cmd(cmd):
r = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if r.returncode != 0:
print(f'Error: {cmd} failed with {r.returncode}')
print(r.stdout.decode("utf-8"))
return r
def get_a_dep(d):
if d not in deps_all.keys():
print('{} is not found in dependency list')
return 1
url = deps_all[d][0]
commit = deps_all[d][1]
families = deps_all[d][2]
print(f'cloning {d} with {url}')
p = Path(TOP / d)
git_cmd = f"git -C {p}"
# Init git deps if not existed
if not p.exists():
p.mkdir(parents=True)
run_cmd(f"{git_cmd} init")
run_cmd(f"{git_cmd} remote add origin {url}")
head = None
else:
# Check if commit is already fetched
result = run_cmd(f"{git_cmd} rev-parse HEAD")
head = result.stdout.decode("utf-8").splitlines()[0]
run_cmd(f"{git_cmd} reset --hard")
if commit != head:
run_cmd(f"{git_cmd} fetch --depth 1 origin {commit}")
run_cmd(f"{git_cmd} checkout FETCH_HEAD")
return 0
def find_family(board):
bsp_dir = Path(TOP / "ports")
for family_dir in bsp_dir.iterdir():
if family_dir.is_dir():
board_dir = family_dir / 'boards' / board
if board_dir.exists():
return family_dir.name
return None
def main():
parser = argparse.ArgumentParser()
parser.add_argument('families', nargs='*', default=[], help='Families to fetch')
parser.add_argument('-b', '--board', action='append', default=[], help='Boards to fetch')
parser.add_argument('--print', action='store_true', help='Print commit hash only')
args = parser.parse_args()
families = args.families
boards = args.board
print_only = args.print
status = 0
deps = list(deps_mandatory.keys())
if 'all' in families:
deps += deps_optional.keys()
else:
families = list(families)
if boards is not None:
for b in boards:
f = find_family(b)
if f is not None:
families.append(f)
for f in families:
for d in deps_optional:
if d not in deps and f in deps_optional[d][2]:
deps.append(d)
if print_only:
pvalue = {}
for d in deps:
commit = deps_all[d][1]
pvalue[d] = commit
print(pvalue)
else:
with Pool() as pool:
status = sum(pool.map(get_a_dep, deps))
return status
if __name__ == "__main__":
sys.exit(main())