From eab8dc5e0a7fb07f9f2f0a3b13bec8433c438361 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 8 Oct 2026 17:57:04 +0300 Subject: [PATCH] fix(firmware-build): support CCS artifact paths and bootstrap identity config --- c/firmware-info/tools/c2000_postbuild.py | 14 +++++++++++--- tools/firmware-build/README.md | 4 ++-- tools/firmware-build/ccs/precompile.bat | 7 +++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/c/firmware-info/tools/c2000_postbuild.py b/c/firmware-info/tools/c2000_postbuild.py index ac9f349..8bd0c26 100644 --- a/c/firmware-info/tools/c2000_postbuild.py +++ b/c/firmware-info/tools/c2000_postbuild.py @@ -17,10 +17,18 @@ from identity import archive_build, seal, verify def postbuild(compiler: Path, build_dir: Path, artifact: str, metadata: Path, output: Path, export: Path = None) -> Path: - if not artifact or artifact in (".", "..") or any(c in artifact for c in '\\/:*?"<>|'): - raise ValueError("artifact must be a file base name, without a path") + # CCS may include the configured output directory in this macro. + # Resolve the input separately; output filenames must use only its basename. + artifact_path = Path(artifact) + if not artifact or artifact_path.name in ("", ".", ".."): + raise ValueError("artifact must name an OUT file without its extension") + artifact = artifact_path.name + if any(c in artifact for c in '\\/:*?"<>|'): + raise ValueError("invalid artifact file base name") + source_base = (artifact_path if artifact_path.is_absolute() + else build_dir / artifact_path) + source = Path(str(source_base) + ".out").resolve() tool = compiler.resolve() / "bin" / "hex2000.exe" - source = build_dir.resolve() / (artifact + ".out") if not tool.is_file(): raise FileNotFoundError(f"C2000 Hex Utility not found: {tool}") if not source.is_file(): diff --git a/tools/firmware-build/README.md b/tools/firmware-build/README.md index af68a0f..3ead431 100644 --- a/tools/firmware-build/README.md +++ b/tools/firmware-build/README.md @@ -6,7 +6,7 @@ ### 1. Создайте конфигурацию версии -В корне проекта CCS (рядом с `.project`) скопируйте `ccs/firmware_identity.example.json` под именем `firmware_identity.json` (UTF-8): +При первом запуске pre-build автоматически копирует `ccs/firmware_identity.example.json` в путь конфигурации из команды (обычно `${PROJECT_LOC}/firmware_identity.json`, рядом с `.project`), если файла ещё нет. Существующий JSON никогда не перезаписывается. После первого запуска откройте его, задайте свои product, target и version и пересоберите проект. Первый запуск использует значения примера: ```json { @@ -36,7 +36,7 @@ cmd /c call "C:\Projects\templates\tools\firmware-build\ccs\postcompile.bat" --i Нужны оба шага. Precompile создаёт версию, UTC-время и Git-метаданные до компиляции. Postcompile преобразует OUT в SCI8 HEX/BIN, создаёт manifest и SHA-256 для точного BIN. Он не повторяет запрос Git после компиляции. В этом режиме `firmware-release.cmd` не нужен. -`BuildArtifactFileBaseName` должен быть именем без пути; OUT должен находиться в BuildDirectory. Если проект кладёт OUT в отдельный каталог, передайте фактический каталог вторым аргументом postcompile вместо BuildDirectory. +`BuildArtifactFileBaseName` передаётся без изменения и без расширения `.out`: допускается простое имя, абсолютный путь или путь относительно BuildDirectory. Postcompile находит OUT по этому пути, а для имён BIN/HEX использует только имя файла. Поэтому отдельная выходная папка проекта (например, `../bin`) не требует правки общей команды. Метаданные и результаты остаются в указанных каталогах generated и firmware. ### 3. Выполните полную сборку diff --git a/tools/firmware-build/ccs/precompile.bat b/tools/firmware-build/ccs/precompile.bat index 30eba48..163f2b2 100644 --- a/tools/firmware-build/ccs/precompile.bat +++ b/tools/firmware-build/ccs/precompile.bat @@ -16,6 +16,13 @@ if "%~2"=="" goto usage if "%~3"=="" goto usage if "%~4"=="" goto usage if not "%~5"=="" goto usage +rem Create the editable project configuration once; never overwrite user settings. +if not exist "%~f3" ( + copy /Y "%~dp0firmware_identity.example.json" "%~f3" >nul + if errorlevel 1 exit /b 2 + echo [firmware-build] Created configuration: "%~f3" + echo [firmware-build] Edit product, target and version in this file, then rebuild. +) python "%~dp0..\..\..\c\firmware-info\tools\identity.py" prepare --repository "%~f2" --templates "%~dp0..\..\.." --config "%~f3" --output "%~f4" exit /b %errorlevel% :usage