![](https://habrastorage.org/getpro/habr/upload_files/04b/8c4/da8/04b8c4da89d8183141e63d79d109d04d.png)
В программировании микроконтроллеров на электронных платах на выходе всегда получается довольно много артефактов. Это прошивка, документация, отладочная инфа.
По мере возможности всё это добро надо как-то связать и заточить в один архив, чтобы всегда можно было ассоциировать .hex с нужным для него .map и .elf. Также один архив очень удобен при транспортировке программного обеспечения железнодорожными видами транспорта ).
Логичным шагом будет являться архивация всех этих файликов в *.tar архив, чтобы всё это не рассыпалось по жесткому диску.
Терминология
Артефакты (Artifact) в контексте программирования микроконтроллеров артефакты - это то полезное, что кристаллизируется на выходе tool chain(а). В самом общем случае это
№ | Расширение | type | Назначение |
1 | *.hex | text | бинарный образ прошивки в ASCI символах |
2 | *.bin | bin | Бинарный образ прошивки |
3 | *.elf | bin | образ с отладочными символами для пошаговой отладки |
4 | *.map | text | спецификация разметки памяти |
5 | *.gv | text | граф зависимостей программных компонентов на Graphviz |
6 | ? | ? | doxygen документация на ПО |
7 | *.fw | bin | бинарь прошивки с цифровой подписью |
8 | ... | ... | прочее |
Фактически артефакты - это и есть результат работы программиста микроконтроллера для бизнеса.
Некоторые также называют артефакты словом дистрибутив.
Постановка задачи
Надо реализовать автоматическую архивацию артефактов прошивки. Написать один общий для всех проектов make скрипт для упаковки артефактов. Вмонтировать это действие в общий конвейер сборки любого проекта из репозитория.
Реализация
Для этого можно воспользоваться классической утилитой tar. Это консольная утилита для архивирования файлов. Вот её справка.
tar -h
tar(bsdtar): manipulate archive files
First option must be a mode specifier:
-c Create -r Add/Replace -t List -u Update -x Extract
Common Options:
-b # Use # 512-byte records per I/O block
-f <filename> Location of archive (default \\.\tape0)
-v Verbose
-w Interactive
Create: tar -c [options] [<file> | <dir> | @<archive> | -C <dir> ]
<file>, <dir> add these items to archive
-z, -j, -J, --lzma Compress archive with gzip/bzip2/xz/lzma
--format {ustar|pax|cpio|shar} Select archive format
--exclude <pattern> Skip files that match pattern
-C <dir> Change to <dir> before processing remaining files
@<archive> Add entries from <archive> to output
List: tar -t [options] [<patterns>]
<patterns> If specified, list only entries that match
Extract: tar -x [options] [<patterns>]
<patterns> If specified, extract only entries that match
-k Keep (don't overwrite) existing files
-m Don't restore modification times
-O Write entries to stdout, don't restore to disk
-p Restore permissions (including ACLs, owner, file flags)
bsdtar 3.5.2 - libarchive 3.5.2 zlib/1.2.5.f-ipp
Нам понадобятся только вот эти опции утилиты tar
ключ | назначение |
-? | показать короткую справку по ключам утилиты |
-f | путь и имя результирующего файла архива |
-v | Активировать логирование. Показать что именно будет заархивированно. |
--version | показать версию программы |
-с | Префикс после которого через пробел надо перечислить полные пути к тем файлам, которые мы хотим поместить в архив |
Надо организовать вот такой конвейер обработки файлов
![](https://habrastorage.org/getpro/habr/upload_files/dac/bcd/53f/dacbcd53ff9239de6f1053e1b51265de.png)
Для начала поэкспериментируем в windows cmd. Вот этим скриптом в принципе можно решить задачу.
echo off
cls
set project_name=boardname_appname_m
set project_dir=%cd%
set artefact_dir=%project_dir%\build
echo project_dir=%project_dir%
set FILES_TO_PACK=%artefact_dir%\%project_name%.map
set FILES_TO_PACK=%artefact_dir%\%project_name%.bin %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%.elf %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%.hex %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%.jpeg %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%.pdf %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%.svg %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%_dep.gv %FILES_TO_PACK%
echo artefact_dir=%artefact_dir%
echo FILES_TO_PACK=%FILES_TO_PACK%
tar.exe -v -f %artefact_dir%\%project_name%.tar -c %FILES_TO_PACK% --
Однако система сборки у меня Make поэтому надо написать общий на все сборки скрипт для упаковки файлов. Вот так может выглядеть make скрипт archive_artifacts.mk для упаковки бинарей в архив
$(info ArchiveArtifactsScript)
TIME_STAMP_FILE = $(BUILD_DIR)/time_stamp.txt
FILES_TO_PACK += $(TIME_STAMP_FILE)
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).pdf
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).svg
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).jpeg
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET)_dep.gv
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).map
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).elf
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).hex
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).bin
ARCHIVE_FILE := $(TARGET).tar
.PHONY: compose_time_stamp
compose_time_stamp:
$(info ComposeTimeStamp)
$(info TIME_STAMP_FILE=$(TIME_STAMP_FILE))
$(shell date > $(TIME_STAMP_FILE))
.PHONY: archive_artifacts
archive_artifacts: compose_time_stamp generate_dep auto_version_target
$(info BUILD_DIR=$(BUILD_DIR))
$(info FILES_TO_PACK=$(FILES_TO_PACK))
$(info ARCHIVE_FILE=$(ARCHIVE_FILE))
$(info Archive Artifacts...)
tar.exe -v -f $(ARCHIVE_FILE) -c $(FILES_TO_PACK) --
После отработки этого скрипта в папке build (BUILD_DIR) корня проекта появляется *.tar архив с бинарями. Сюда же в архив капнет временная отметка time_stamp.txt, чтобы показывать насколько эта сборка новая.
Итоги
Удалось добавить автоматическое архивирование бинарей в общий процесс сборки проекта.
Ссылки
# | название | URL |
1 | Create .zip folder from the command line - (Windows) | https://superuser.com/questions/201371/create-zip-folder-from-the-command-line-windows |
2 | TAR - архивирование данных в Windows 10. |