| #!/usr/bin/python |
| """ |
| SPDX-License-Identifier: Apache-2.0 |
| Copyright (c) 2019 STMicroelectronics. |
| This script define Stm32SerieUpdate class |
| to be used by update_stm32_package.py |
| """ |
| |
| import os |
| import shutil |
| import subprocess |
| import re |
| from pathlib import Path |
| import logging |
| from jinja2 import Environment, FileSystemLoader |
| import ble_library |
| from common_utils import common_utils |
| |
| STM32_CUBE_REPO_BASE = "https://github.com/STMicroelectronics/STM32Cube" |
| """GitHub URL to get STM32Cube""" |
| |
| SCRIPT_DIR = Path(__file__).absolute().parent |
| """Script directory.""" |
| |
| REPO_ROOT = SCRIPT_DIR / ".." |
| """Repository root (used for input/output default folders).""" |
| |
| # list of created files. It is necessary to remove all of them |
| # as they are fully created when applying zephyr patch |
| zephyr_file_created = [ |
| "CMakeLists.txt", |
| "README", |
| "drivers/include/stm32_assert.h", |
| ] |
| |
| |
| def version_tuple(version): |
| """Remove 'v' in front of version and convert it to tuple, |
| so that versions can be compared |
| """ |
| v = re.sub("v", r"", version) |
| return tuple(map(int, (v.split(".")))) |
| |
| |
| class Stm32SerieUpdate: |
| """class Stm32SerieUpdate""" |
| |
| def __init__( |
| self, |
| stm32_serie, |
| stm32cube_repo_path, |
| noclean, |
| version_update, |
| debug, |
| ): |
| """Class Stm32SerieUpdate constructor |
| |
| Args: |
| stm32_serie: stm32 serie ex:stm32f3xx |
| stm32cube_repo_path: directory path where to fetch github repo |
| noclean: boolean to clean or not github repo after update done |
| version_update: string to force a specified version to be updated |
| debug: boolean to set log debug level |
| |
| Returns: |
| return previous zephyr cube version. |
| |
| Raises: |
| ValueError: If stm32 serie is not recognised. |
| FileNotFoundError: If Zphyr STM32 cube path is not found |
| """ |
| if not stm32_serie.startswith("stm32"): |
| raise ValueError( |
| f"Error: Unknown stm32 serie: {stm32_serie}. Must start with 'stm32'" |
| ) |
| |
| # Set serie variables |
| self.stm32_serie = stm32_serie |
| self.stm32_seriexx = stm32_serie + "xx" # ex:stm32f3xx |
| self.stm32_serie_upper = stm32_serie.upper() # ex:STM32F3 |
| self.stm32_seriexx_upper = self.stm32_serie_upper + "xx" # ex:STM32F3xx |
| self.serie = self.stm32_serie_upper[5:] |
| self.noclean = noclean |
| self.version_update = version_update |
| self.debug = debug |
| self.module_patch = f"module_{self.stm32_serie}.patch" |
| |
| # ##### 3 root directories to work with ######## |
| # 1: STM32Cube repo Default $HOME/STM32Cube_repo |
| # 2 : zephyr stm32 path : ex: .../zephyr_project/module/hal/stm32 |
| # 3: Temporary directory to construct the update |
| # (within STM32Cube repo dir) |
| self.stm32cube_repo_path = stm32cube_repo_path |
| if not self.stm32cube_repo_path.exists(): |
| self.stm32cube_repo_path.mkdir() |
| |
| self.zephyr_hal_stm32_path = REPO_ROOT |
| if not self.zephyr_hal_stm32_path.exists(): |
| raise FileNotFoundError("Error: cannot find zephyr project") |
| |
| self.stm32cube_temp = self.stm32cube_repo_path / "temp_stm32xx_update" |
| if self.stm32cube_temp.exists(): |
| shutil.rmtree( |
| str(self.stm32cube_temp), onerror=common_utils.remove_readonly |
| ) |
| self.stm32cube_temp.mkdir() |
| |
| # subdir specific to a stm32 serie |
| self.stm32cube_serie_path = self.stm32cube_repo_path / Path( |
| "STM32Cube" + self.serie |
| ) |
| self.zephyr_module_serie_path = ( |
| self.zephyr_hal_stm32_path / "stm32cube" / self.stm32_seriexx |
| ) |
| self.stm32cube_temp_serie = ( |
| self.stm32cube_temp / "stm32cube" / self.stm32_seriexx |
| ) |
| shutil.rmtree(str(self.stm32cube_temp), onerror=common_utils.remove_readonly) |
| self.stm32cube_temp_serie.mkdir(parents=True) |
| |
| self.readme_file_path = self.zephyr_module_serie_path / "README" |
| self.version_tag = [] |
| self.current_version = "" |
| self.update_commit = "" |
| |
| if self.debug: |
| logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.DEBUG) |
| self.std_dest = None |
| else: |
| logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) |
| self.std_dest = subprocess.DEVNULL |
| |
| def os_cmd(self, cmd, cwd=None, shell=False): |
| """Execute a command with subprocess.check_call() |
| Args: |
| cmd: string command to execute. |
| cwd: directory where to run command |
| shell: boolean to enable command interpretation by the shell |
| |
| Returns: |
| return the returncode of the command after execution. |
| """ |
| logging.debug("%s", f"{str(cmd)} cwd:{str(cwd)}") |
| |
| return subprocess.check_call( |
| cmd, |
| shell=shell, |
| stdout=self.std_dest, |
| stderr=self.std_dest, |
| cwd=cwd, |
| ) |
| |
| def rename_conf_template(self, path): |
| """renames hal_conf_template.h to hal_conf.h ... |
| Args: |
| path: path where to apply the files processing |
| """ |
| # except for _hal_conf_template.h which is renamed |
| hal_conf_template_fullpath = Path( |
| path / (self.stm32_seriexx + "_hal_conf_template.h") |
| ) |
| if hal_conf_template_fullpath.is_file(): |
| hal_conf_fullpath = Path( |
| re.sub("_template", r"", str(hal_conf_template_fullpath)) |
| ) |
| if hal_conf_fullpath.exists(): |
| hal_conf_fullpath.unlink() |
| hal_conf_template_fullpath.rename(hal_conf_fullpath) |
| |
| def major_branch(self): |
| # check whether master branch exist, otherwise use main branch |
| master_branch_exist = subprocess.check_output( |
| ("git", "ls-remote", "--heads", "origin", "master"), |
| cwd=self.stm32cube_serie_path, |
| ).decode("utf-8") |
| if master_branch_exist: |
| return "master" |
| else: |
| return "main" |
| |
| def clone_cube_repo(self): |
| """Clone or fetch a stm32 serie repo""" |
| repo_name = STM32_CUBE_REPO_BASE + self.serie + ".git" |
| logging.info( |
| "%s", |
| "Cloning/fetching repo " |
| + repo_name |
| + " in " |
| + str(self.stm32cube_serie_path), |
| ) |
| if self.stm32cube_serie_path.exists(): |
| # if already exists, then just clean and fetch |
| self.os_cmd(("git", "clean", "-fdx"), cwd=self.stm32cube_serie_path) |
| self.os_cmd(("git", "fetch"), cwd=self.stm32cube_serie_path) |
| branch = self.major_branch() |
| self.os_cmd( |
| ("git", "reset", "--hard", branch), |
| cwd=self.stm32cube_serie_path, |
| ) |
| else: |
| self.os_cmd( |
| ("git", "clone", repo_name), |
| cwd=self.stm32cube_repo_path, |
| ) |
| branch = self.major_branch() |
| |
| logging.info("%s", f"Branch used: {branch}") |
| |
| # get the latest version of cube, |
| # with the most recent one created being the last entry. |
| self.os_cmd(("git", "checkout", branch), cwd=self.stm32cube_serie_path) |
| self.version_tag = subprocess.check_output( |
| ("git", "tag", "-l"), cwd=self.stm32cube_serie_path |
| ).splitlines() |
| self.version_tag = [x.decode("utf-8") for x in self.version_tag] |
| # Search latest version |
| if self.version_update == "": |
| self.version_update = self.version_tag[0] |
| for tag in self.version_tag: |
| if version_tuple(tag) > version_tuple(self.version_update): |
| self.version_update = tag |
| |
| def get_zephyr_current_version(self): |
| """Look for current zephyr hal version |
| |
| Returns: |
| return previous zephyr cube version. |
| |
| Raises: |
| ValueError: If version is not found. |
| """ |
| with open(str(self.readme_file_path), "r") as f: |
| for line in f: |
| # pattern : "version " follow by optional "v", |
| # followed by x.y or x.y.z x,y,z may represent several digits |
| # ex: 'version v1.8.9', 'version 10.20.25' |
| pattern = r".*version v?(\d+\.\d+\.?\d*).*$" |
| if re.match(pattern, line): |
| previous_version = re.sub(pattern, r"\1", line).rstrip("\n") |
| break |
| |
| # Match previous version and list of existing tags |
| # which could be vx.y or x.y |
| pos_version = [ |
| i for i, a in enumerate(self.version_tag) if previous_version in a |
| ] |
| if pos_version: |
| # return previous zephyr version |
| return self.version_tag[pos_version[0]] |
| else: |
| self.clean_files() |
| raise ValueError( |
| f"Error: cannot find version {previous_version} in STM32Cube_repo" |
| ) |
| |
| def extract_source(self): |
| """Extract sources and includes files from STM32Cube repo |
| and copy them in temporary directory |
| """ |
| # for CMSIS files |
| temp_cmsis_soc_path = self.stm32cube_temp_serie / "soc" |
| Path.mkdir(temp_cmsis_soc_path, parents=True) |
| stm32cube_cmsis_include_path = ( |
| self.stm32cube_serie_path |
| / "Drivers" |
| / "CMSIS" |
| / "Device" |
| / "ST" |
| / self.stm32_seriexx_upper |
| / "Include" |
| ) |
| shutil.rmtree(temp_cmsis_soc_path, onerror=common_utils.remove_readonly) |
| shutil.copytree(stm32cube_cmsis_include_path, temp_cmsis_soc_path) |
| |
| stm32cube_cmsis_templates_path = ( |
| self.stm32cube_serie_path |
| / "Drivers" |
| / "CMSIS" |
| / "Device" |
| / "ST" |
| / self.stm32_seriexx_upper |
| / "Source" |
| / "Templates" |
| ) |
| for repo_file in stm32cube_cmsis_templates_path.iterdir(): |
| repo_src = stm32cube_cmsis_templates_path / repo_file |
| if repo_src.is_file(): |
| shutil.copy(str(repo_src), str(temp_cmsis_soc_path)) |
| |
| # for hal and ll drivers |
| temp_drivers_include_path = self.stm32cube_temp_serie / "drivers" / "include" |
| temp_drivers_include_path.parent.mkdir(parents=True) |
| stm32cube_driver_inc = ( |
| self.stm32cube_serie_path |
| / "Drivers" |
| / Path(self.stm32_seriexx_upper + "_HAL_Driver") |
| / "Inc" |
| ) |
| if temp_drivers_include_path.exists(): |
| shutil.rmtree( |
| temp_drivers_include_path, onerror=common_utils.remove_readonly |
| ) |
| shutil.copytree(stm32cube_driver_inc, temp_drivers_include_path) |
| |
| # except for _hal_conf_template.h which is renamed |
| self.rename_conf_template(temp_drivers_include_path) |
| |
| temp_drivers_src_path = self.stm32cube_temp_serie / "drivers" / "src" |
| temp_drivers_src_path.mkdir() |
| stm32cube_drivers_src_path = ( |
| self.stm32cube_serie_path |
| / "Drivers" |
| / Path(self.stm32_seriexx_upper + "_HAL_Driver") |
| / "Src" |
| ) |
| shutil.rmtree(temp_drivers_src_path, onerror=common_utils.remove_readonly) |
| shutil.copytree(stm32cube_drivers_src_path, temp_drivers_src_path) |
| |
| def build_from_current_cube_version(self): |
| """Build a commit in temporary dir with STM32Cube version |
| corresponding to zephyr current hal version |
| """ |
| # reset the STM32Cube repo to this current version |
| self.os_cmd( |
| ("git", "reset", "--hard", self.current_version), |
| cwd=self.stm32cube_serie_path, |
| ) |
| |
| # build the zephyr module from the stm32cube |
| self.extract_source() |
| logging.info( |
| "%s", "Building module from STM32Cube_repo " + self.current_version |
| ) |
| |
| if not self.stm32cube_temp_serie.parent.exists(): |
| self.stm32cube_temp_serie.parent.mkdir(parents=True) |
| |
| self.os_cmd( |
| ("git", "add", "-A", "stm32cube/" + self.stm32_seriexx + "/*"), |
| cwd=self.stm32cube_temp, |
| ) |
| self.os_cmd( |
| ("git", "commit", "-am", '"module' + self.current_version + '"'), |
| cwd=self.stm32cube_temp, |
| ) |
| # Remove trailing whitespaces |
| self.os_cmd( |
| ("git", "rebase", "--whitespace=fix", "HEAD~1"), |
| cwd=self.stm32cube_temp, |
| ) |
| |
| def build_patch_from_current_zephyr_version(self): |
| """Build patch between zephyr current hal version and |
| corresponding official STM32Cube version |
| """ |
| # clean-up the module |
| shutil.rmtree( |
| str(self.stm32cube_temp_serie), onerror=common_utils.remove_readonly |
| ) |
| |
| # populate the new repo with this current zephyr module |
| shutil.copytree(self.zephyr_module_serie_path, self.stm32cube_temp_serie) |
| |
| # commit this current version module |
| self.os_cmd(("git", "add", "*"), cwd=self.stm32cube_temp) |
| self.os_cmd(("git", "commit", "-am", '"module"'), cwd=self.stm32cube_temp) |
| |
| # Remove trailing space |
| self.os_cmd( |
| ("git", "rebase", "--whitespace=fix", "HEAD~1"), |
| cwd=self.stm32cube_temp, |
| ) |
| |
| # generate a patch for files and _hal.conf.h file in the module |
| logging.info( |
| "%s", |
| "Building patch from official " |
| + self.current_version |
| + " to current zephyr module", |
| ) |
| |
| # For unclear reason, using tuple ("git", "diff", ...) is failing on Linux |
| # especially for this command. Keep a single string. |
| self.os_cmd( |
| ("git diff --ignore-space-at-eol HEAD~1 --output=" + self.module_patch), |
| shell=True, |
| cwd=self.stm32cube_temp, |
| ) |
| self.os_cmd(("dos2unix", self.module_patch), cwd=self.stm32cube_temp) |
| |
| def update_readme(self, make_version, make_commit): |
| """Update README file |
| |
| Args: |
| make_version: latest STM32Cube version. |
| make_commit: Commit corresponding to latest STM32Cube version. |
| """ |
| see_release_note = True |
| |
| readme_path = self.zephyr_module_serie_path / "README" |
| |
| with readme_path.open(mode="r") as readme_prev: |
| lines = (x for x in readme_prev.read().splitlines()) |
| |
| readme_path.unlink() |
| |
| # Write README from previous one if exists |
| with open(str(readme_path), "w") as readme_file: |
| for LineItem in lines: |
| # change version nb |
| if "status" in LineItem.lower(): |
| readme_file.write("Status:\n") |
| readme_file.write(f" version {make_version}\n") |
| next(lines) # skip next line |
| elif "commit" in LineItem.lower(): |
| readme_file.write("Commit:\n") |
| readme_file.write(f" {make_commit}") |
| next(lines) # skip next line |
| elif "URL" in LineItem.upper(): |
| readme_file.write("URL:\n") |
| readme_file.write( |
| " https://github.com/STMicroelectronics/" |
| + f"STM32Cube{self.serie}\n" |
| ) |
| next(lines) # skip next line |
| # change patch list with a link to the release_note.html |
| elif "Patch List" in LineItem: |
| readme_file.write("Patch List:\n") |
| readme_file.write( |
| "--> please check that the following list " |
| + "is still valid:\n" |
| ) |
| else: |
| if "See release_note.html from STM32Cube" in LineItem: |
| see_release_note = False |
| readme_file.write(f"{LineItem}\n") |
| |
| # at the very end of the file : |
| if see_release_note: |
| readme_file.write("\n See release_note.html from STM32Cube\n") |
| readme_file.flush() |
| |
| self.os_cmd(("dos2unix", str(readme_path))) |
| |
| def copy_release_note(self): |
| """Copy release_note.html file from STM32Cube to zephyr""" |
| release_note_src = self.stm32cube_serie_path / "Release_Notes.html" |
| release_note_dst = self.zephyr_module_serie_path / "release_note.html" |
| if release_note_dst.exists(): |
| release_note_dst.unlink() |
| if release_note_src.exists: |
| release_note_src.rename(release_note_dst) |
| self.os_cmd(("dos2unix", str(release_note_dst))) |
| |
| def update_cmakelist(self): |
| """Update CMakeLists.txt file""" |
| cmakelists_path = self.zephyr_module_serie_path / "CMakeLists.txt" |
| if cmakelists_path.exists(): |
| # build new CMakeLists.txt |
| with cmakelists_path.open("r") as cmakelists_old: |
| # this line is the copyright line |
| first_line = cmakelists_old.readline() |
| if "STMicroelectronics" in first_line: |
| first_line = "" |
| cmakelists_path.unlink() |
| else: |
| first_line = "" |
| |
| logging.info("%s", "Create a new CMakeLists.txt file") |
| |
| with cmakelists_path.open("w") as cmakelists_new: |
| if first_line: |
| cmakelists_new.write(first_line) |
| cmakelists_new.write("# Copyright (c) 2020 STMicroelectronics\n") |
| cmakelists_new.write("#\n") |
| cmakelists_new.write("# SPDX-License-Identifier: Apache-2.0\n") |
| cmakelists_new.write("\n") |
| |
| src_path = self.stm32cube_temp_serie / "drivers" / "src" |
| source_files = list(src_path.iterdir()) |
| source_files.sort() |
| |
| cmakelists_new.write( |
| f"zephyr_library_sources(soc/system_{self.stm32_seriexx}.c)\n" |
| ) |
| cmakelists_new.write( |
| f"zephyr_library_sources(drivers/src/{self.stm32_seriexx}_hal.c)\n" |
| ) |
| cmakelists_new.write( |
| f"zephyr_library_sources(drivers/src/{self.stm32_seriexx}_hal_rcc.c)\n" |
| ) |
| cmakelists_new.write( |
| "zephyr_library_sources(drivers/src/" |
| + f"{self.stm32_seriexx}_hal_rcc_ex.c)\n" |
| ) |
| |
| for filename in source_files: |
| # also skipping '_xxx_hal.c' |
| if "template" in filename.name: |
| continue |
| |
| # also skipping '_xxx_hal_rcc.c' and '_xxx_hal_rcc_ex.c' |
| if "_hal_rcc" in filename.name: |
| continue |
| |
| if "_hal_" in filename.name: |
| # retrieve IP name from filename, like adc, |
| # which is delimited by |
| # * _hal_ on one side |
| # * and file extension on the other side |
| pattern = r".*_hal_(.*)\..*" |
| cmakelists_new.write( |
| "zephyr_library_sources_ifdef(CONFIG_USE_STM32_HAL_" |
| + re.sub(pattern, r"\1", filename.name).upper() |
| + " drivers/src/" |
| + filename.name |
| + ")\n" |
| ) |
| if "_ll_" in filename.name: |
| # retrieve IP name from filename, like adc, |
| # which is delimited by |
| # * _ll_ on one side |
| # * and file extension on the other side |
| pattern = r".*_ll_(.*)\..*" |
| cmakelists_new.write( |
| "zephyr_library_sources_ifdef(CONFIG_USE_STM32_LL_" |
| + re.sub(pattern, r"\1", filename.name).upper() |
| + " drivers/src/" |
| + filename.name |
| + ")\n" |
| ) |
| self.os_cmd(("dos2unix", str(cmakelists_path))) |
| |
| def generate_assert_file(self): |
| """Remove stm32_assert_template.h file and create stm32_assert.h file""" |
| # remove stm32_assert_template.h |
| stm32_assert_template = ( |
| self.stm32cube_temp_serie |
| / "drivers" |
| / "include" |
| / "stm32_assert_template.h" |
| ) |
| if stm32_assert_template.exists(): |
| stm32_assert_template.unlink() |
| |
| # create stm32_assert.h from Jinja2 template |
| # Create the jinja2 environment. |
| templates_dir = self.zephyr_hal_stm32_path / "scripts" |
| j2_env = Environment( |
| loader=FileSystemLoader(str(templates_dir)), |
| trim_blocks=True, |
| lstrip_blocks=True, |
| ) |
| stm32_assert_j2_template = j2_env.get_template("stm32_assert_template.txt") |
| stm32_assert_h = ( |
| self.stm32cube_temp_serie / "drivers" / "include" / "stm32_assert.h" |
| ) |
| |
| with open(stm32_assert_h, "w") as stm32_assert_file: |
| stm32_assert_file.write( |
| stm32_assert_j2_template.render(stm32serie=self.stm32_serie) |
| ) |
| |
| def build_from_version_update(self): |
| """Build a commit in temporary dir with STM32Cube version |
| corresponding to zephyr latest hal version |
| """ |
| # reset the STM32Cube repo to this latest version |
| self.os_cmd( |
| ("git", "reset", "--hard", self.version_update), |
| cwd=self.stm32cube_serie_path, |
| ) |
| |
| # Get the commit id of this latest version |
| self.update_commit = subprocess.check_output( |
| ("git", "rev-parse", "HEAD"), cwd=self.stm32cube_serie_path |
| ).decode("utf-8") |
| |
| # clear previous version content before populating with latest version |
| shutil.rmtree( |
| str(self.stm32cube_temp_serie), onerror=common_utils.remove_readonly |
| ) |
| |
| # populate temporary directory with latest version |
| self.extract_source() |
| |
| # Commit files except log or patch files |
| self.os_cmd(("git", "add", "*"), cwd=self.stm32cube_serie_path) |
| self.os_cmd(("git", "reset", "--", "*.patch"), cwd=self.stm32cube_serie_path) |
| self.os_cmd(("git", "reset", "--", "*.log"), cwd=self.stm32cube_serie_path) |
| self.os_cmd( |
| ("git", "commit", "-am", '"module' + self.version_update + '"'), |
| cwd=self.stm32cube_temp_serie, |
| ) |
| |
| def apply_zephyr_patch(self): |
| """Apply zephyr stm32 patch to latest stm32Cube version""" |
| logging.info("%s", "Apply zephyr patches to " + self.version_update) |
| |
| # Copy from stm32cube_temp |
| shutil.rmtree( |
| str(self.zephyr_module_serie_path), |
| onerror=common_utils.remove_readonly, |
| ) |
| shutil.copytree(self.stm32cube_temp_serie, self.zephyr_module_serie_path) |
| |
| # apply dos2unix to whole zephyr hal serie sub directory |
| for child in self.zephyr_module_serie_path.glob("**/*"): |
| if child.is_file: |
| self.os_cmd(("dos2unix", child), cwd=self.zephyr_module_serie_path) |
| |
| # Remove file that will be fully created by zephyr patch |
| # (otherwise applying patch will report error) |
| for file in zephyr_file_created: |
| if Path(self.zephyr_module_serie_path, file).exists(): |
| Path(self.zephyr_module_serie_path, file).unlink() |
| |
| # Apply patch from new repo |
| common_utils.apply_patch( |
| str(self.stm32cube_temp / self.module_patch), self.zephyr_hal_stm32_path |
| ) |
| |
| # save patch file so that it can be analysed in case of error |
| patch_path = self.zephyr_hal_stm32_path / self.module_patch |
| if patch_path.exists(): |
| os.remove(patch_path) |
| shutil.copy(str(self.stm32cube_temp / self.module_patch), patch_path) |
| |
| # Update README and CMakeList, copy release note |
| self.update_readme(self.version_update, self.update_commit) |
| self.update_cmakelist() |
| self.copy_release_note() |
| |
| # remove stm32_assert_template.h and create stm32_assert.h |
| self.generate_assert_file() |
| |
| # Add files but do not commit |
| self.os_cmd(("git", "add", "*"), cwd=self.zephyr_hal_stm32_path) |
| self.os_cmd(("git", "reset", "--", "*.patch"), cwd=self.zephyr_hal_stm32_path) |
| self.os_cmd(("git", "reset", "--", "*.log"), cwd=self.zephyr_hal_stm32_path) |
| self.os_cmd(("git", "reset", "--", "*.rej"), cwd=self.zephyr_hal_stm32_path) |
| logging.warning( |
| "%s", |
| "README file : --> please check that the Patch list is still valid", |
| ) |
| |
| def merge_commit(self, lib=False): |
| """Apply zephyr stm32 patch to latest stm32Cube version""" |
| # Merge & commit |
| # to clean the .rej files, uncomment line: reject() |
| # reject() |
| if lib: |
| logging.info("%s", "commit BLE library update") |
| commit_msg = "lib/stm32: " |
| else: |
| logging.info("%s", "commit HAL/LL Cube update ") |
| commit_msg = "stm32cube: " |
| |
| commit_file_path = self.zephyr_module_serie_path / "commit.msg" |
| with open(commit_file_path, "w") as commit: |
| commit.write( |
| commit_msg |
| + "update " |
| + self.stm32_serie |
| + " to cube version " |
| + self.version_update.upper() |
| + "\n" |
| ) |
| |
| commit.write("\n") |
| commit.write( |
| "Update Cube version for " + self.stm32_seriexx_upper + " series" + "\n" |
| ) |
| commit.write("on https://github.com/STMicroelectronics" + "\n") |
| commit.write(f"from version {self.current_version}\n") |
| commit.write(f"to version {self.version_update}\n") |
| self.os_cmd( |
| ("git", "commit", "-as", "-F", commit_file_path), |
| cwd=self.zephyr_module_serie_path, |
| ) |
| self.os_cmd( |
| ("git", "rebase", "--whitespace=fix", "HEAD~1"), |
| cwd=self.zephyr_module_serie_path, |
| ) |
| Path(commit_file_path).unlink() |
| |
| def reject(self): |
| """Clean *.rej files""" |
| reject_files = [f for f in self.zephyr_module_serie_path.glob("**/*.rej")] |
| if reject_files: |
| for f in reject_files: |
| f.unlink() |
| |
| def cleanup_stm32cube_repo(self): |
| """clean the STM32Cube repo""" |
| self.os_cmd(("git", "reset", "--hard", "HEAD"), cwd=self.stm32cube_serie_path) |
| |
| def clean_files(self): |
| """Clean repo file if required""" |
| # Remove temporary files unconditionally |
| os.chdir(os.getenv("HOME")) |
| shutil.rmtree(str(self.stm32cube_temp), onerror=common_utils.remove_readonly) |
| |
| # remove STM32Cube repo only if required |
| if not self.noclean: |
| self.cleanup_stm32cube_repo() |
| shutil.rmtree( |
| str(self.stm32cube_repo_path), onerror=common_utils.remove_readonly |
| ) |
| else: |
| self.os_cmd( |
| ("git", "reset", "--hard", "HEAD"), |
| cwd=self.stm32cube_serie_path, |
| ) |
| |
| def update_stm32_hal_serie(self): |
| """Update one single STM32Cube""" |
| # 1) clone full repo from github : get the repo STM32CubeXX |
| self.clone_cube_repo() |
| |
| # 2) prepare a repo where to store module versions |
| self.os_cmd(("git", "init"), cwd=self.stm32cube_temp) |
| self.os_cmd( |
| ("git", "commit", "--allow-empty", "-m", "'Trigger notification'"), |
| cwd=self.stm32cube_temp, |
| ) |
| |
| # 3) get the version of cube which is in the zephyr module |
| self.current_version = self.get_zephyr_current_version() |
| logging.info( |
| f"Version {self.current_version} is the current zephyr version for " |
| + self.zephyr_module_serie_path.name |
| ) |
| |
| # do not process if versions are similar |
| if (self.current_version in self.version_update) or ( |
| self.version_update in self.current_version |
| ): |
| logging.warning( |
| "%s", |
| f"*** Update abandoned: identical versions {self.version_update} ***\n", |
| ) |
| self.clean_files() |
| return |
| logging.info( |
| f"*** Updating zephyr {self.stm32_serie} " |
| + f"from version {self.current_version} to {self.version_update}" |
| ) |
| |
| # 4) build the module from this previous version |
| self.build_from_current_cube_version() |
| |
| # 5) build the patch from the current zephyr version |
| self.build_patch_from_current_zephyr_version() |
| |
| # 6) build the module from this latest version |
| self.build_from_version_update() |
| |
| # 7) apply zephyr patch : in the zephyr module repo |
| self.apply_zephyr_patch() |
| self.merge_commit() |
| |
| # 8) In case of stm32wb, update ble library |
| if self.stm32_serie == "stm32wb": |
| ble_library.update( |
| self.stm32cube_serie_path, |
| Path(self.zephyr_hal_stm32_path / "lib"), |
| self.stm32cube_temp, |
| self.current_version, |
| self.version_update, |
| self.update_commit, |
| ) |
| self.merge_commit(lib=True) |
| |
| # 9) clean |
| self.clean_files() |
| logging.info("%s", f"Done {self.stm32_serie}\n") |