Files
NeoECU-Tooling/src/neoecu/common.py
2026-05-03 18:31:08 +02:00

93 lines
2.3 KiB
Python

# Copyright (C) 2026 Hector van der Aa <hector@h3cx.dev>
# Copyright (C) 2026 Association Exergie <association.exergie@gmail.com>
# SPDX-License-Identifier: GPL-3.0-or-later
from pathlib import Path
import tomllib
CORE_CONFIG = {
"CM7": {
"dir_key": "m7_dir",
"type_key": "m7_type",
"supported_type": "ST",
},
"CM4": {
"dir_key": "m4_dir",
"type_key": "m4_type",
"supported_type": "Zephyr",
},
}
def find_project_root(
start: Path | None = None,
filename: str = "neoecu.toml",
max_depth: int = 10
) -> Path | None:
current = start or Path.cwd()
for _ in range(max_depth + 1):
if (current / filename).exists():
return current # return the directory (project root)
if current.parent == current:
break
current = current.parent
return None
def load_config(root: Path) -> dict:
config_path = root / "neoecu.toml"
with open(config_path, "rb") as f:
return tomllib.load(f)
def configured_cores(config: dict) -> list[str]:
build_config = config.get("build", {})
cores: list[str] = []
for core, core_config in CORE_CONFIG.items():
if all(build_config.get(key) for key in (core_config["dir_key"], core_config["type_key"])):
cores.append(core)
return cores
def core_root(root: Path, config: dict, core: str) -> Path:
return root / config["build"][CORE_CONFIG[core]["dir_key"]]
def select_cores(config: dict, args) -> list[str]:
selected = []
if getattr(args, "CM7", False):
selected.append("CM7")
if getattr(args, "CM4", False):
selected.append("CM4")
if not selected:
selected = configured_cores(config)
configured = configured_cores(config)
missing = [core for core in selected if core not in configured]
if missing:
missing_cores = ", ".join(missing)
raise ValueError(f"{missing_cores} is not fully configured in neoecu.toml")
return selected
def check_pair(config: dict) -> bool:
build_config = config.get("build", {})
cores = configured_cores(config)
if not cores:
return False
for core in cores:
core_config = CORE_CONFIG[core]
if build_config[core_config["type_key"]] != core_config["supported_type"]:
return False
return True