# Подключение precompile и postcompile из templates ## Пути на этом компьютере | Назначение | Полный путь | |---|---| | Корень общей библиотеки templates | `K:\git_project\newProject\templates` | | Сценарии CCS | `K:\git_project\newProject\templates\tools\firmware-build\ccs` | | Сценарии Keil | `K:\git_project\newProject\templates\tools\firmware-build\keil` | | Проект Бальзам-166 / TMS320F28335 | `K:\git_project\28335_periph\UKSSTMS320F28335` | | Каталог сборок Бальзам-166 в SETGUI | `K:\git_project\newProject\SETGUI\..periph_28335\firmware\periph28335\balzam166` | Все команды ниже используют эту копию templates. При переносе библиотеки замените её корень в командах и в include paths компилятора. `${PROJECT_LOC}`, `${BuildDirectory}`, `${CG_TOOL_ROOT}` и `${BuildArtifactFileBaseName}` раскрывает CCS; `$P` и `#H` раскрывает Keil. Для ручного запуска замените макросы полными путями. В пути SETGUI `..periph_28335` — существующее имя папки с двумя точками в начале. Переход к родителю записывается отдельным компонентом `..\`. ## Текущий проект 28335_periph: вызов через firmware_build.bat Для проекта `K:\git_project\28335_periph\UKSSTMS320F28335` используйте локальную обвязку. Она вызывает общие BAT из templates, увеличивает версию в проектном JSON и перед публикацией дополнительно проверяет встроенный паспорт SCI8 и предел EEPROM. В CCS → **Project Properties → Build → Steps** задайте для Debug и Release следующие команды, каждую одной строкой. **Pre-build:** ```bat cmd /c call "${PROJECT_LOC}/firmware_build.bat" prepare --build-dir "${BuildDirectory}" ``` **Post-build:** ```bat cmd /c call "${PROJECT_LOC}/firmware_build.bat" build --compiler "${CG_TOOL_ROOT}" --build-dir "${BuildDirectory}" --artifact "${BuildArtifactFileBaseName}" ``` Настройки находятся в `K:\git_project\28335_periph\UKSSTMS320F28335\firmware_identity.json`: | Поле | Рабочее значение и смысл | |---|---| | `templates` | `../../newProject/templates`; разрешается относительно папки JSON в `K:\git_project\newProject\templates`. Абсолютный эквивалент: `K:/git_project/newProject/templates`. | | `copy_to` | `../Bin`; копирует проверенные BIN, manifest, SHA-256, HEX и карту в `K:\git_project\28335_periph\Bin`. | | `increment_version` | `true`; каждый pre-build резервирует следующий номер в поле `version`. | | `max_image_bytes` | `32508`; предельный размер SCI8 BIN в байтах для этой платы. | В JSON используйте `/` либо удваивайте обратные слеши. `copy_to` принимает также абсолютный путь, например `K:/git_project/newProject/SETGUI/..periph_28335/firmware/periph28335/balzam166`. Эта настройка копирует отдельные файлы комплекта. Архивные папки остаются в `${BuildDirectory}/firmware`. `firmware_build.bat build` принимает именованные параметры. Дописывание каталога после `--artifact` вызывает `unrecognized arguments`; для этой обвязки каталог копирования задаётся полем `copy_to`. Include paths компилятора для текущего проекта: | Запись в CCS | Реальный каталог для Debug | |---|---| | `${SRC_ROOT}/../newProject/templates/c/firmware-info/include` | `K:\git_project\newProject\templates\c\firmware-info\include` | | `${SRC_ROOT}/../newProject/templates/c/set-protocol` | `K:\git_project\newProject\templates\c\set-protocol` | | `${BuildDirectory}/generated` | `K:\git_project\28335_periph\UKSSTMS320F28335\Debug\generated` | `${SRC_ROOT}` в этом проекте равен `K:\git_project\28335_periph`. При переносе templates обновите и JSON, и include paths в CCS. Подробная инструкция проекта: [README Бальзам-166](../../../../28335_periph/UKSSTMS320F28335/README.md). Готовый BIN ищите по строке `[firmware-build] Verified BIN: ...`. Постоянный каталог Debug: `K:\git_project\28335_periph\UKSSTMS320F28335\Debug\firmware`. Папки `.identity-release-...` временные и удаляются после проверки. ## Прямое подключение общих BAT к новому CCS-проекту Следующие разделы описывают прямые вызовы `ccs/precompile.bat` и `ccs/postcompile.bat`. В этом варианте дополнительный последний аргумент postcompile поддерживается и экспортирует целиком папку текущей сборки. Общие BAT берут версию из JSON и не увеличивают её автоматически. Выберите одну схему подключения: её pre-build и post-build должны использовать один набор метаданных. ## Новый 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. Создайте конфигурацию версии При первом запуске pre-build автоматически копирует `ccs/firmware_identity.example.json` в путь конфигурации из команды (обычно `${PROJECT_LOC}/firmware_identity.json`, рядом с `.project`), если файла ещё нет. Существующий JSON никогда не перезаписывается. После первого запуска откройте его, задайте свои product, target и version и пересоберите проект. Первый запуск использует значения примера: ```json { "product": "MY_CONTROLLER", "target": "TMS320F28335", "version": [0, 1, 0] } ``` Задайте своё изделие, настоящий контроллер и нужную версию. Для TMS320F2812 замените target. Пример версии — 0.1.0; это не номер предыдущих прошивок. Этот JSON — единственное вручную редактируемое место версии в данной схеме. ### 2. Добавьте команды в CCS Project Properties → Build → Steps, для нужной конфигурации. Пример предполагает templates в `K:\git_project\newProject\templates`. Замените только этот путь своим; макросы CCS оставьте как есть. Pre-build steps → Command, одной строкой: ```bat cmd /c call "K:\git_project\newProject\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 "K:\git_project\newProject\templates\tools\firmware-build\ccs\postcompile.bat" --identity "${CG_TOOL_ROOT}" "${BuildDirectory}" "${BuildArtifactFileBaseName}" "${BuildDirectory}\generated\firmware_identity.json" "${BuildDirectory}\firmware" ``` Позиционные аргументы общего `ccs/postcompile.bat` после `--identity`: | Позиция | Значение | Источник в CCS | |---|---|---| | 1 | Корень TI C2000 compiler, содержащий `bin/hex2000.exe` | `${CG_TOOL_ROOT}` | | 2 | Каталог текущей конфигурации сборки | `${BuildDirectory}` | | 3 | Имя или путь OUT без расширения `.out` | `${BuildArtifactFileBaseName}` | | 4 | Метаданные, созданные pre-build | `${BuildDirectory}\generated\firmware_identity.json` | | 5 | Постоянный каталог результатов | `${BuildDirectory}\firmware` | | 6, необязательно | Каталог экспорта архивной папки текущей сборки | Полный путь назначения | Здесь templates определяется расположением вызываемого общего BAT. Для прямой схемы поле `templates` в JSON не заменяет путь в команде CCS. Добавьте `${BuildDirectory}/generated` в include paths; при подключении общего порта firmware-info добавьте `K:/git_project/newProject/templates/c/firmware-info/include`. Нужны оба шага. Precompile создаёт версию, UTC-время и Git-метаданные до компиляции. Postcompile преобразует OUT в SCI8 HEX/BIN, создаёт manifest и SHA-256 для точного BIN. Он не повторяет запрос Git после компиляции. В этом режиме `firmware-release.cmd` не нужен. `BuildArtifactFileBaseName` передаётся без изменения и без расширения `.out`: допускается простое имя, абсолютный путь или путь относительно BuildDirectory. Postcompile находит OUT по этому пути, а для имён BIN/HEX использует только имя файла. Поэтому отдельная выходная папка проекта (например, `../bin`) не требует правки общей команды. Метаданные и результаты остаются в указанных каталогах generated и firmware. ### 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+3/ 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+3` для каждой сборки. HASH — первые 8 символов commit прошивки из pre-build JSON; при незакоммиченных изменениях добавляется `+`. Дата и время берутся из `built_at_utc` и переводятся в UTC+3 для имени папки. В JSON и заголовке сохраняется UTC. Если commit исходников неизвестен, используется build ID или NOGIT000. Например: `f5c3654e+_2026-10-08_15-30-00_UTC+3`. Сохраняются точные байты образа, manifest, SHA-256 и firmware_identity.json; в CCS также исходный OUT, HEX и map. Повтор postcompile с теми же метаданными обновляет ту же папку. Файлы непосредственно в firmware сохраняются, поэтому существующие команды копирования продолжают работать. Добавьте generated и firmware в игнорируемые Git-каталоги. Обычно вся папка Debug уже игнорируется. Полный Rebuild обязателен для выпуска. BAT сами по себе не подтверждают, что OUT собран именно с этим заголовком. ### 4. Прямой postcompile: копирование папки текущей сборки в SETGUI При прямом вызове общего ccs/postcompile.bat передайте каталог назначения последним аргументом после output-dir. Это правило относится к общему BAT; проектный firmware_build.bat использует copy_to из JSON. Скрипт скопирует целиком только папку HASH_DATE, созданную текущим запуском: исходный OUT (для CCS), BIN, HEX, map, manifest, SHA-256 и метаданные. OUT сохраняется с исходным именем для выбора и загрузки через JTAG в GUI. Скрипт использует папку из pre-build JSON, не выбирает её по времени изменения файлов и не копирует остальные архивы или отдельные файлы из корня firmware. Полная команда Post-build для templates в `K:\git_project\newProject\templates`, одной строкой: ```bat cmd /c call "K:\git_project\newProject\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\periph28335\balzam166" ``` Старые суффиксы `&& copy ...` и `&& xcopy ...` удалите. Папка назначения создаётся автоматически. В ней появится, например: ```text K:\git_project\newProject\SETGUI\..periph_28335\firmware\periph28335\balzam166\ f5c3654e+_2026-10-08_15-30-00_UTC+3\ MyFirmware.hex MyFirmware_BUILDID.bin MyFirmware_BUILDID.bin.manifest.json MyFirmware_BUILDID.bin.sha256 firmware_identity.json ``` Копирование выполняется после успешного архивирования; SHA-256 копии проверяется. Console покажет `[firmware-build] Exported folder: ...`. Повтор для той же папки обновляет её файлы; другие папки назначения сохраняются. Без последнего аргумента экспорт отключён. Это локальное копирование без сетевой публикации. ### Дополнительный Flash OUT из postbuild CCS Если рядом с CCS-проектом, на уровень выше BuildDirectory, есть `build_flash.py`, общий postbuild автоматически вызывает его с `--postbuild`, `--compiler`, `--build-dir` и `--output`. Команда postcompile в настройках CCS остаётся прежней. Сценарий проекта должен использовать уже готовые объекты, не запускать Make и создать непустые `<имя>_flash.out` и `<имя>_flash.map` по переданному пути. Адреса секций, отдельный linker-файл и необходимые определения препроцессора задаёт проектный сборщик, а не общий templates. Flash OUT и карта сохраняются рядом с обычным OUT. Копии, отдельный manifest и SHA-256 попадают в firmware и ту же папку HASH_DATE, что и EEPROM BIN, а затем копируются в GUI при настроенном export. Обычный BIN по-прежнему создаётся из основного OUT; Flash OUT не преобразуется в EEPROM SCI8 BIN. Ошибка сборщика или отсутствие любого результата завершает postcompile с ненулевым кодом до архивирования и экспорта. Существующий Flash OUT не считается результатом нового вызова: сборщик работает во временном каталоге. Без `build_flash.py` дополнительные действия отключены. Дополнительно hex2000 преобразует Flash OUT в отдельный `<имя>_flash_rs.bin` с адресной таблицей SCI8, картой `.bin.map`, manifest и SHA-256. Эти файлы сохраняются рядом с OUT, в firmware и в экспортируемой папке HASH_DATE. Flash RS BIN содержит адреса внутренней Flash и предназначен для совместимого проектного CMD_TFLASH; его нельзя выбирать как обычный EEPROM BIN. Проект сам должен реализовать проверку адресов и алгоритм программирования из RAM. Общий postbuild только формирует транспортный файл. ### Версия внутри устройства Это подготовка метаданных сборки и файла. Чтобы версия присутствовала в программе и ответах устройства, подключите заголовок `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 в `K:\git_project\newProject\templates`; замените этот путь своим. Before Build/Rebuild, одной строкой: ```bat cmd /c call "K:\git_project\newProject\templates\tools\firmware-build\keil\precompile.bat" --identity "$P.." "$P..\firmware_identity.json" "$PGenerated" ``` After Build/Rebuild, одной строкой: ```bat cmd /c call "K:\git_project\newProject\templates\tools\firmware-build\keil\postcompile.bat" --identity "#H" "$PGenerated\firmware_identity.json" ``` Для копирования только папки текущей сборки добавьте каталог назначения последним аргументом: ```bat cmd /c call "K:\git_project\newProject\templates\tools\firmware-build\keil\postcompile.bat" --identity "#H" "$PGenerated\firmware_identity.json" "K:\git_project\newProject\SETGUI\..periph_28335\firmware\periph28335\balzam166" ``` Будет скопирована целиком новая папка 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+3/ Firmware.hex Firmware.hex.manifest.json Firmware.hex.sha256 firmware_identity.json ``` Папка HASH_DATE создаётся в firmware рядом с исходным HEX/BIN. Для неё используются commit и время precompile, переведённое в UTC+3, как в 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`.