Files
templates/tools/firmware-build/README.md
Andrey 4fc0ad4e14 feat(firmware-info): копируй папку текущей сборки целиком
Добавь каталог назначения последним аргументом postcompile CCS и Keil. Копируй только архив текущего запуска с сохранением имени папки, всех файлов и проверкой SHA-256. Обнови MD-команды и проверки выбора папки, вложенных файлов и ошибок экспорта.
2026-10-08 16:26:21 +03:00

172 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Подключение precompile и postcompile из templates
## Новый CCS-проект C2000: локальные версия и SCI8 BIN
Используйте обновлённую папку templates целиком. Режим `--identity` добавлен для нового проекта: Windows, Python 3.8+ в PATH и TI C2000 compiler с hex2000.exe. Git в PATH нужен для хеша коммита. Без Git либо без commit в проекте или templates используется `NOGIT000`; сборка и локальная конвертация разрешены. Это явно видно в manifest. SETGUI и доступ к серверу не требуются.
### 1. Создайте конфигурацию версии
В корне проекта CCS (рядом с `.project`) скопируйте `ccs/firmware_identity.example.json` под именем `firmware_identity.json` (UTF-8):
```json
{
"product": "MY_CONTROLLER",
"target": "TMS320F28335",
"version": [0, 1, 0]
}
```
Задайте своё изделие, настоящий контроллер и нужную версию. Для TMS320F2812 замените target. Пример версии — 0.1.0; это не номер предыдущих прошивок. Этот JSON — единственное вручную редактируемое место версии в данной схеме.
### 2. Добавьте команды в CCS
Project Properties → Build → Steps, для нужной конфигурации. Пример предполагает templates в `C:\Projects\templates`. Замените только этот путь своим; макросы CCS оставьте как есть.
Pre-build steps → Command, одной строкой:
```bat
cmd /c call "C:\Projects\templates\tools\firmware-build\ccs\precompile.bat" --identity "${PROJECT_LOC}" "${PROJECT_LOC}\firmware_identity.json" "${BuildDirectory}\generated"
```
Post-build steps → Command, одной строкой:
```bat
cmd /c call "C:\Projects\templates\tools\firmware-build\ccs\postcompile.bat" --identity "${CG_TOOL_ROOT}" "${BuildDirectory}" "${BuildArtifactFileBaseName}" "${BuildDirectory}\generated\firmware_identity.json" "${BuildDirectory}\firmware"
```
Нужны оба шага. Precompile создаёт версию, UTC-время и Git-метаданные до компиляции. Postcompile преобразует OUT в SCI8 HEX/BIN, создаёт manifest и SHA-256 для точного BIN. Он не повторяет запрос Git после компиляции. В этом режиме `firmware-release.cmd` не нужен.
`BuildArtifactFileBaseName` должен быть именем без пути; OUT должен находиться в BuildDirectory. Если проект кладёт OUT в отдельный каталог, передайте фактический каталог вторым аргументом postcompile вместо BuildDirectory.
### 3. Выполните полную сборку
Apply and Close → Clean → Build Project. Настройте шаги отдельно для Debug/Release; их generated и firmware находятся внутри своих BuildDirectory.
Результаты:
```text
Debug/
generated/
firmware_identity.h
firmware_identity.json
firmware/
MyFirmware.hex
MyFirmware_BUILDID.bin
MyFirmware_BUILDID.bin.manifest.json
MyFirmware_BUILDID.bin.sha256
HASH_YYYY-MM-DD_HH-MM-SS_UTC/
MyFirmware.hex
MyFirmware_BUILDID.bin
MyFirmware_BUILDID.bin.manifest.json
MyFirmware_BUILDID.bin.sha256
firmware_identity.json
```
Postcompile автоматически создаёт папку `HASH_YYYY-MM-DD_HH-MM-SS_UTC` для каждой сборки. HASH — первые 8 символов commit прошивки из pre-build JSON; при незакоммиченных изменениях добавляется `+`. Дата и время берутся из `built_at_utc`, в UTC. Если commit исходников неизвестен, используется build ID или NOGIT000. Например: `f5c3654e+_2026-10-08_12-30-00_UTC`. Сохраняются точные байты образа, manifest, SHA-256 и firmware_identity.json; в CCS также HEX и map. Повтор postcompile с теми же метаданными обновляет ту же папку. Файлы непосредственно в firmware сохраняются, поэтому существующие команды копирования продолжают работать.
Добавьте generated и firmware в игнорируемые Git-каталоги. Обычно вся папка Debug уже игнорируется. Полный Rebuild обязателен для выпуска. BAT сами по себе не подтверждают, что OUT собран именно с этим заголовком.
### 4. Копирование папки текущей сборки в SETGUI
Передайте каталог назначения последним аргументом postcompile. Скрипт скопирует целиком только папку HASH_DATE, созданную текущим запуском: BIN, HEX, map, manifest, SHA-256 и метаданные. Он использует папку из pre-build JSON, не выбирает её по времени изменения файлов и не копирует остальные архивы или отдельные файлы из корня firmware.
Полная команда Post-build для templates в `K:\git_project\newProject\newTEMPL\templates`, одной строкой:
```bat
cmd /c call "K:\git_project\newProject\newTEMPL\templates\tools\firmware-build\ccs\postcompile.bat" --identity "${CG_TOOL_ROOT}" "${BuildDirectory}" "${BuildArtifactFileBaseName}" "${BuildDirectory}\generated\firmware_identity.json" "${BuildDirectory}\firmware" "K:\git_project\newProject\SETGUI\..periph_28335\firmware"
```
Старые суффиксы `&& copy ...` и `&& xcopy ...` удалите. Папка назначения создаётся автоматически. В ней появится, например:
```text
K:\git_project\newProject\SETGUI\..periph_28335\firmware\
f5c3654e+_2026-10-08_12-30-00_UTC\
MyFirmware.hex
MyFirmware_BUILDID.bin
MyFirmware_BUILDID.bin.manifest.json
MyFirmware_BUILDID.bin.sha256
firmware_identity.json
```
Копирование выполняется после успешного архивирования; SHA-256 копии проверяется. Console покажет `[firmware-build] Exported folder: ...`. Повтор для той же папки обновляет её файлы; другие папки назначения сохраняются. Без последнего аргумента экспорт отключён. Это локальное копирование без сетевой публикации.
### Версия внутри устройства
Это подготовка метаданных сборки и файла. Чтобы версия присутствовала в программе и ответах устройства, подключите заголовок `firmware_identity.h` к модулю версии и обработчику запроса. Include path: `${BuildDirectory}/generated`. Для C2000 с 16-битным char нужна адаптация байтового контракта; обычный 8-битный порт нельзя считать готовым. Смотрите [PORTING.md](../../c/firmware-info/PORTING.md).
## Keil: тот же JSON, заголовок и SHA-256
Keil использует `firmware_identity.json` и режим `--identity`, как CCS. Дополнительный CMD-файл конфигурации и SETGUI для этой схемы не нужны. Требуется Python 3.8+ в PATH; Git нужен для commit. HEX создаётся штатным компилятором Keil, а BAT создаёт и проверяет manifest и SHA-256 точного HEX/BIN.
### 1. Создайте конфигурацию версии
Пример расположения:
```text
project/
firmware_identity.json
mdk/
Firmware.uvprojx
Generated/
```
Скопируйте `keil/firmware_identity.example.json` в корень project под именем `firmware_identity.json`. Исправьте product, target и version:
```json
{
"product": "MY_CONTROLLER",
"target": "STM32F407",
"version": [0, 1, 0]
}
```
### 2. Настройте Before/After Build
В Options for Target → Output включите Create HEX File. Затем откройте User и включите выполнение команд Before Build/Rebuild и After Build/Rebuild. Для обеих команд задайте Stop on Exit Code `>=1`, чтобы ошибка скрипта останавливала сборку. Пример предполагает templates в `C:\Projects\templates`; замените этот путь своим.
Before Build/Rebuild, одной строкой:
```bat
cmd /c call "C:\Projects\templates\tools\firmware-build\keil\precompile.bat" --identity "$P.." "$P..\firmware_identity.json" "$PGenerated"
```
After Build/Rebuild, одной строкой:
```bat
cmd /c call "C:\Projects\templates\tools\firmware-build\keil\postcompile.bat" --identity "#H" "$PGenerated\firmware_identity.json"
```
Для копирования только папки текущей сборки добавьте каталог назначения последним аргументом:
```bat
cmd /c call "C:\Projects\templates\tools\firmware-build\keil\postcompile.bat" --identity "#H" "$PGenerated\firmware_identity.json" "K:\git_project\newProject\SETGUI\..periph_28335\firmware"
```
Будет скопирована целиком новая папка HASH_DATE с HEX/BIN, manifest, SHA-256 и метаданными. Старые команды copy/xcopy в этой строке не нужны. В Console появится `[firmware-build] Exported folder`.
В Keil `$P` обозначает каталог проекта с завершающим разделителем, а `#H` — полный путь к выходному HEX. Официальное описание макросов: [Keil User commands](https://www.keil.com/support/man/docs/uv4cl/uv4cl_dg_user.htm). Макросы раскрываются в IDE; при ручном запуске BAT замените их реальными путями.
В примере файл uvprojx находится в mdk, поэтому `$P..` указывает на корень исходников. Если JSON и uvprojx находятся в одном каталоге, используйте `"$P."` для repository и `"$Pfirmware_identity.json"` для config; третий аргумент Generated сохраните.
Добавьте Generated в include path и подключите `firmware_identity.h` в модуле версии прошивки. Для параллельных или разных target задавайте отдельные Generated и согласуйте путь во второй команде. Перенос версии в ответ устройства требует подключения модуля и обработчика, как описано в [PORTING.md](../../c/firmware-info/PORTING.md).
### 3. Выполните Rebuild
Перед выпуском измените только исходный firmware_identity.json и выполните Rebuild. Precompile создаст заголовок и метаданные в Generated. Postcompile создаст рядом с HEX:
```text
Firmware.hex
Firmware.hex.manifest.json
Firmware.hex.sha256
firmware/
HASH_YYYY-MM-DD_HH-MM-SS_UTC/
Firmware.hex
Firmware.hex.manifest.json
Firmware.hex.sha256
firmware_identity.json
```
Папка HASH_DATE создаётся в firmware рядом с исходным HEX/BIN. Для неё используются commit и UTC-время из precompile, как в CCS. При успехе Console содержит строки `[firmware-build] Folder`, `Image`, `Manifest`, `SHA-256`. Для готового BIN вместо `#H` передайте его фактический путь; конвертацию AXF в BIN нужно выполнить до postcompile. Сгенерированные файлы исключите через .gitignore.
## Совместимость со старыми проектами
Вызовы BAT без `--identity` сохранены для уже настроенных проектов: прежний precompile генерирует только build ID, прежний postcompile запускает SETGUI preflight по release-конфигурации. Эта отдельная схема описана в [инструкции публикатора](../firmware-publish/README.md). Для новых CCS и Keil используйте приведённые выше команды с `--identity`.