Техникум: Автоматическое 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

показать версию программы

Префикс после которого через пробел надо перечислить полные пути к тем файлам, которые мы хотим поместить в архив

Надо организовать вот такой конвейер обработки файлов

8ec965c085c5fb61e7b6bcb0bc0f816f.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)

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 архив с бинарями.

Итоги

Удалось добавить автоматическое архивирование в общий процесс сборки проекта.

Ссылки

© Habrahabr.ru