| """ |
| Utility script to migrate SYS_INIT() calls from the old signature |
| ``int (*init_fn)(const struct device *dev)`` to ``int (*init_fn)(void)``. |
| |
| .. warning:: |
| Review the output carefully! This script may not cover all cases! |
| |
| Usage:: |
| |
| python $ZEPHYR_BASE/scripts/utils/migrate_sys_init.py \ |
| -p path/to/zephyr-based-project |
| |
| Copyright (c) 2022 Nordic Semiconductor ASA |
| SPDX-License-Identifier: Apache-2.0 |
| """ |
| |
| import argparse |
| from pathlib import Path |
| import re |
| |
| |
| def update_sys_init(project, dry_run): |
| for p in project.glob("**/*"): |
| if not p.is_file() or not p.suffix or p.suffix[1:] not in ("c", "cpp"): |
| continue |
| |
| with open(p) as f: |
| lines = f.readlines() |
| |
| sys_inits = [] |
| for line in lines: |
| m = re.match(r"^SYS_INIT\(([A-Za-z0-9_]+),.*", line) |
| if m: |
| sys_inits.append(m.group(1)) |
| continue |
| |
| m = re.match(r"^SYS_INIT_NAMED\([A-Za-z0-9_]+,\s?([A-Za-z0-9_]+).*", line) |
| if m: |
| sys_inits.append(m.group(1)) |
| continue |
| |
| if not sys_inits: |
| continue |
| |
| arg = None |
| content = "" |
| update = False |
| unused = False |
| for line in lines: |
| m = re.match( |
| r"(.*)int (" |
| + "|".join(sys_inits) |
| + r")\(const\s+struct\s+device\s+\*\s?(.*)\)(.*)", |
| line, |
| ) |
| if m: |
| b, sys_init, arg, e = m.groups() |
| content += f"{b}int {sys_init}(void){e}\n" |
| update = True |
| elif arg: |
| m = re.match(r"^\s?ARG_UNUSED\(" + arg + r"\);.*$", line) |
| if m: |
| arg = None |
| unused = True |
| else: |
| content += line |
| elif unused: |
| m = re.match(r"^\s?\n$", line) |
| if not m: |
| content += line |
| unused = False |
| else: |
| content += line |
| |
| if update: |
| print(f"Updating {p}{' (dry run)' if dry_run else ''}") |
| if not dry_run: |
| with open(p, "w") as f: |
| f.write(content) |
| |
| |
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser(allow_abbrev=False) |
| parser.add_argument( |
| "-p", "--project", type=Path, required=True, help="Zephyr-based project path" |
| ) |
| parser.add_argument("--dry-run", action="store_true", help="Dry run") |
| args = parser.parse_args() |
| |
| update_sys_init(args.project, args.dry_run) |