Техникум: Автоматическое Aрхивирование Aртефактов
Эскизный проект того, что надо соорудить
В программировании микроконтроллеров на электронных платах на выходе всегда получается довольно много артефактов. Это прошивка, документация, отладочная инфа.
По мере возможности всё это добро надо как-то связать и заточить в один архива, чтобы всегда можно было ассоциировать .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 Location of archive (default \\.\tape0)
-v Verbose
-w Interactive
Create: tar -c [options] [ | | @ | -C ]
, 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 Skip files that match pattern
-C Change to before processing remaining files
@ Add entries from to output
List: tar -t [options] []
If specified, list only entries that match
Extract: tar -x [options] []
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 | показать версию программы |
-с | Префикс после которого через пробел надо перечислить полные пути к тем файлам, которые мы хотим поместить в архив |
Надо организовать вот такой конвейер обработки файлов
Для начала поэкспериментируем в 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)
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 :=$(BUILD_DIR)\$(TARGET).tar
.PHONY: archive_artifacts
archive_artifacts: 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 архив с бинарями.
Итоги
Удалось добавить автоматическое архивирование в общий процесс сборки проекта.
Ссылки