#!/usr/bin/python """ SPDX-License-Identifier: Apache-2.0 Copyright (c) 2019 STMicroelectronics. This script will update the stm32cube module for Zephyr from the latest version on https://github.com/STMicroelectronics get the patch between initial version and latest version apply this patch on the zephyr module basic usage for a single serie update : 'python3 update_stm32_package.py -s ' basic usage for all serie update at once: 'python3 update_stm32_package.py """ import os import sys import subprocess import argparse from pathlib import Path import serie_update import logging from genllheaders import genllheaders parser = argparse.ArgumentParser() parser.add_argument( "-s", "--stm32_serie", type=str, help="Update a stm32 serie. ex: stm32f1.\n" + "If omitted all STM32 series will be updated,\n" + "a commit is created for each serie. ", ) parser.add_argument( "-c", "--noclean", action="store_true", default=False, help="Do NOT clean the STM32Cube repo directory", ) parser.add_argument( "-r", "--repo", type=str, help="Allows to provide path where STM32Cube repo are stored", ) parser.add_argument( "-v", "--version", default="", type=str, help="select to which version to update.\n", ) parser.add_argument( "-d", "--debug", action="store_true", default=False, help="select to which version to update.\n", ) args = parser.parse_args() SCRIPT_DIR = Path(__file__).absolute().parent """Script directory.""" REPO_ROOT = SCRIPT_DIR / ".." """Repository root (used for input/output default folders).""" def update_cubes(): """Update all STM32Cubes""" module_path = REPO_ROOT / "stm32cube" if not module_path.exists(): raise Exception("Error: cannot find ./zephyr project") for stmyyxx in module_path.iterdir(): if stmyyxx.is_dir() and "common_ll" not in stmyyxx.name: logging.info( "%s", f"*************** updating module {stmyyxx.name} *****************", ) # Force the commit for each serie update_serie = serie_update.Stm32SerieUpdate( stmyyxx.name[:-2], repo_path, noclean=args.noclean, debug=args.debug, version_update="", ) update_serie.update_stm32_hal_serie() ################################################ # Main ################################################ if args.repo: repo_path = Path(args.repo) else: repo_path = Path(os.getenv("HOME")) / "STM32Cube_repo" if args.debug: print("Debug") logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.DEBUG) std_dest = None else: logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) std_dest = subprocess.DEVNULL if not args.noclean: print( f"Do you want to clean downloaded repo {str(repo_path)} at the end of updates?" ) res = input("(Enter y/n) ").lower() while res not in ("y", "n"): res = input("(Enter y/n) ").lower() if res == "n": logging.info("%s", "Add option --noclean") args.noclean = True # prevent losing data in an unclean repo git_status = subprocess.check_output( ("git", "status", "-s"), cwd=SCRIPT_DIR, ).splitlines() # status = [x.decode("utf-8") for x in git_status] for status in git_status: if not status.decode("utf-8").startswith("?") and not status.decode( "utf-8" ).startswith("!"): logging.error( "%s", "It seems that script repo " + str(SCRIPT_DIR) + "\n is not clean:\n git status -s:" + status.decode("utf-8"), ) logging.error("%s", "It is suggested to clean your repo first.") print("Do you want to continue update ?") res = input("(Enter y/n) ").lower() while res not in ("y", "n"): res = input("(Enter y/n) ").lower() if res == "n": sys.exit() break if args.stm32_serie: update = serie_update.Stm32SerieUpdate( args.stm32_serie, repo_path, args.noclean, args.version, args.debug, ) update.update_stm32_hal_serie() else: update_cubes() logging.info("%s", "Cube update: Done") print("Do you want to autogenerate generic LL HAL headers (genllheaders.py) ?") res = input("(Enter y/n) ").lower() while res not in ("y", "n"): res = input("(Enter y/n) ").lower() if res == "y": genllheaders.main( REPO_ROOT / "stm32cube", REPO_ROOT / "stm32cube" / "common_ll", ) genllheaders.main(REPO_ROOT / "stm32cube", REPO_ROOT / "stm32cube" / "common_ll") # commit autogenerate generic LL HAL headers commit_file_path = REPO_ROOT / "commit.msg" with open(commit_file_path, "w") as commit: commit.write("stm32cube: common_ll: Regeneration after cube updates\n") commit.write("\n") commit.write("Re - generate common_ll headers after Cube updates\n") subprocess.check_call( ("git", "commit", "-as", "-F", commit_file_path), cwd=REPO_ROOT, ) subprocess.check_call( ("git", "rebase", "--whitespace=fix", "HEAD~1"), stdout=std_dest, stderr=std_dest, cwd=REPO_ROOT, ) Path(commit_file_path).unlink() logging.info("%s", "LL HAL header update: Done")