Включить тег Git (или версию SVN) в скетч Arduino?

Есть ли способ получить текущий тег Git/идентификатор коммита в двоичный файл скетча Arduino?

Для обычной разработки настольных программ вы можете использовать Makefile с некоторыми хитростями (как указано в этом ответе StackExchange) . Однако для скетча Arduino нет файла Makefile. Верно?

Я мог бы создать пакетный файл, который запускал бы перед каждой компиляцией, но существует вполне реальная вероятность того, что я забуду его запустить, а неправильная информация о версии хуже, чем отсутствие информации о версии.

В настоящее время я использую макросы препроцессора __DATE__ и __TIME__, чтобы попытаться определить, какая версия работает на плате. Это работает, но отслеживание в обратном направлении от даты/времени компиляции до фиксации в системе управления версиями — это больше догадки, чем что-либо еще.

, 👍4

Обсуждение

Вы можете отказаться от Arduino IDE и перейти к [разработке на основе Makefile](https://github.com/sudar/Arduino-Makefile)., @Edgar Bonet

отслеживание в обратном направлении от даты/времени компиляции до фиксации в системе управления версиями - это скорее догадки, чем что-либо еще - почему? В коммитах есть дата., @Nick Gammon

@EdgarBonet Думаю, это то, что я ищу! Я попробую. Если вы опубликуете это как ответ, я могу принять это., @DAVe3283


7 ответов


Лучший ответ:

4

Вдохновленный ответом Целли, я продолжил расследование и нашел похожее метод, который может быть реализован с использованием обычного интерфейса Среда разработки Arduino.

Похоже, что пользователь GitHub Wackerbarth столкнулся с тем же самым проблема, открыта проблема в системе отслеживания ошибок Arduino:

Было бы очень полезно иметь возможность добавить рецепт на платформу. Спецификация, которая выполняется в начале процесса сборки. (предварительная сборка)

В частности, мой вариант использования — генерировать строки версий, которые быть включены в образ ПЗУ на основе информации, извлеченной из Репозиторий SCM.

Далее он отправил запрос на включение для добавления «хуков» в процесс сборки, который привел к выпуску 1.6.2. См. документацию на эти Перехватчики до и после сборки.

Вот как вы можете использовать эту функцию для включения git commit информацию в вашу программу (проверено на Arduino 1.8.5 / Ubuntu 16.04):

  1. Сохраните следующий файл под именем make-git-version где-нибудь в вашем PATH и сделайте его исполняемым:
#!/bin/bash

# Go to the source directory.
[ -n "$1" ] && cd "$1" || exit 1

# Build a version string with git.
version=$(git describe --tags --always --dirty 2> /dev/null)

# If this is not a git repository, fallback to the compilation date.
[ -n "$version" ] || version=$(date -I)

# Save this in git-version.h.
echo "#define GIT_VERSION \"$version\"" > $2/sketch/git-version.h
  1. Найдите файл с именем platform.txt в папке установки Arduino. каталог (в настоящее время в arduino-1.8.5/hardware/arduino/avr для платы АВР). В том же каталоге создайте файл с именем platform.local.txt со следующим содержанием:
recipe.hooks.sketch.prebuild.1.pattern=make-git-version "{build.source.path}" "{build.path}"
  1. Включите в свой скетч "git-version.h" и используйте его следующим образом:
#include "git-version.h"

void setup() {
  Serial.begin(9600);
  Serial.println("This is version " GIT_VERSION);
}
  1. Создайте пустой файл в каталоге скетча с именем git-version.h.

Обратите внимание, что git-version.h в текущем каталоге нужен только для первой компиляции. Настоящий git-version.h будет в временный каталог сборки.

,

1

Я не уверен, что докажет идентификатор коммита. Я использую git для управления исходным кодом для своих скетчей Arduino, но конкретная загрузка может быть на полпути между предыдущим коммитом и следующим. То есть код на плате может не соответствовать какой-либо конкретной фиксации.

Дата/время по крайней мере примерно указывают, где в потоке фиксации находится код.

Можно запустить задание cron, которое периодически (скажем, каждую минуту) обновляет файл .h с текущим идентификатором фиксации из ветки и включает его в скетч.

,

Это правда, что вы можете компилировать с грязной рабочей копией, но, по крайней мере, вы точно знаете, с какого коммита вы начали эту прошивку. Имея только дату, вы не можете точно знать, какая ветка была скомпилирована, особенно если несколько веток были обновлены примерно в одно и то же время. И, наконец, использование даты/времени приводит к проблемам с часовыми поясами, придавая еще большую двусмысленность тому, что именно было скомпилировано., @DAVe3283

Если ты так говоришь. «Грязная рабочая копия» может быть чем угодно. Я не уверен, что доказывает исходный идентификатор коммита. использование даты/времени приводит к проблемам с часовыми поясами - в скольких часовых поясах вы находитесь? Я лично в одном., @Nick Gammon

Я до сих пор работаю с друзьями из колледжа, и теперь мы живем в разных штатах. Часовой пояс меня уже укусил в прошлом, я не пытаюсь быть придурком или что-то в этом роде. Знание исходного идентификатора коммита позволяет мне, по крайней мере, узнать, из какой ветки пришел скетч. Я согласен, что грязная рабочая копия может указывать на что угодно, но в целом она близка к базовому коммиту., @DAVe3283

Люди *сделали* make-файлы для компиляции своих материалов для Arduino. Я не могу придумать какой-либо действительно простой способ сделать это, если не считать моего предложения задания cron для регулярного обновления файла .h., @Nick Gammon


0

Если вы хотите использовать трюки, подобные Makefile, можно использовать Рабочий процесс на основе Makefile вместо Arduino IDE. Есть несколько универсальные файлы Makefile для Arduino, плавающие в Интернете. Одним из довольно популярных является Arduino Судара Мутху Makefile. С ним вы просто написать небольшой Makefile для каждого проекта, который устанавливает несколько переменных, а затем включает общий Makefile. Есть одно ограничение с этим подход, однако: Arduino IDE обычно изменяет ваш файл .ino перед отправив его компилятору двумя способами:

  1. Включает <Arduino.h>
  2. Он пишет прототипы в начале программы для каждого определяемую вами функцию.

Сударр Мутху Makefile включает Arduino.h (он не затрагивает ваш кода, используя вместо этого параметр -include gcc), но он не записывает прототипы функций для вас. Таким образом, он не на 100% совместим с Среда разработки Arduino.

Еще одна возможность — полностью написать Makefile самостоятельно. который вызывает Arduino Строитель. Это должно быть 100% совместимость с интегрированной средой разработки.

,

3

У меня также были проблемы с управлением версиями Arduino (ESP32). Чтобы сделать его несколько более практичным и менее подверженным ошибкам, я сделал несколько скриптов, помогающих этому процессу.

Использовать эти сценарии так же просто, как добавить их в папку с скетчами и добавить

#include "gitTagVersion.h"
...
Serial.println( sketchVersion );

в скетч Arduino. Это все, что нужно.

В приведенном выше примере вывод будет примерно таким: v1.0.0-3-gab3fb04.
Это разбивается на тег v1.0.0, у нас было 3 фиксации после этого тега при фиксации ab3fb04.

КАК УСТАНОВИТЬ И ИСПОЛЬЗОВАТЬ?

Задействовано 2 скрипта, первый скрипт заменяет кнопку Arduino Verify. Сохраните его как verify.sh:

echo "const char * sketchVersion = \"$(git describe --tags --always --dirty)\";" > gitTagVersion.h
~/arduino-1.8.5/arduino --verify test.ino
rm gitTagVersion.h

А второй скрипт заменяет кнопку "Загрузить". Сохраните его как upload.sh:

echo "const char * sketchVersion = \"$(git describe --tags --always --dirty)\";" > gitTagVersion.h
~/arduino-1.8.5/arduino --upload test.ino --pref custom_DebugLevel=esp32_none
rm gitTagVersion.h

Что нужно знать об этих скриптах:

  • Скрипты ЗАМЕНЯЮТ кнопки. Вы больше не сможете использовать кнопки, так как они не сгенерировать необходимую информацию о версии из git.

    Их использование приведет к этой ошибке:

    фатальная ошибка: gitTagVersion.h: нет такого файла или каталога

  • Сценарии жестко закодированы для использования Arduino 1.8.5 и должны быть обновлены. если вы обновите Arduino IDE.

  • Эти скрипты работают только в Linux с установленной версией Arduino.

  • Если вы используете Windows или Mac, сценарии не будут работать.

  • Чтобы изменить вывод отладки (с помощью макросов LOGx_ESP) на ESP32 сборок, измените custom_DebugLevel в сценарии загрузки на esp32_xxxx, где xxxx – нет, информация, ошибка, отладка или подробные сведения.

Я разместил это также в своем блоге и esp32.com

,

Я бы опустил -n в echo -n '";': в Unixland принято, что текстовые файлы (особенно исходный код) заканчиваются переводом строки. Кроме того, вы можете заменить первые три строки каждого из эти сценарии с помощью echo "const char * sketchVersion = \"$(git description --tags --always --dirty)\";" > gitTagVersion.h, @Edgar Bonet


2

Если вы используете Platformio, добавьте это в файл platformio.ini

build_flags = 
    !echo '-D GIT_VERSION=\\"'$(git rev-parse HEAD)'\\"'

И используйте его следующим образом:

Serial.printf("Firmware version: %s\n", GIT_VERSION);

Ознакомьтесь с соответствующими документами: http://docs.platformio.org/en/latest/projectconf/section_env_build. html#динамические-сборки-флаги

,

1

Вдохновленный сценарием Эдгара Bash, я написал сценарий Batch для Windows, который делает почти то же самое, кроме копирования HEX-файла из временного каталога сборки в каталог проекта и вставки хэша фиксации, даты, имени ветки. и тег к его имени. Я написал короткую статью о том, как использовать GIT для управления версиями прошивки.

:: Как использовать:
:: Добавьте этот файл в каталог проекта Arduino и добавьте следующую строку в файл platform.txt из основных файлов Arduino.
:: recipe.hooks.sketch.prebuild.1.pattern = {build.source.path}\fw_ver.bat GIT {build.path} {build.source.path}
:: recipe.hooks.objcopy.postobjcopy.2.pattern = {build.source.path}\fw_ver.bat SAVE {build.path} {build.source.path}

@echo off

:: arg1 -> "GIT" print version, commit number, brnach name and commit date , "SAVE" copy the .hex file from temp build directory to project directory
set arg1=%1
:: arg2 -> path to temp build directory
set arg2=%2
:: arg3 -> path to project source files
set arg3=%3

cd %arg3%

FOR /F "tokens=* USEBACKQ" %%F IN (`git describe --match^=NeVeRmAtCh --always --abbrev^=7`) DO (
SET commit=%%F
)

FOR /F "tokens=* USEBACKQ" %%F IN (`git show -s --format^=%%cd --date^=format:%%y_%%m_%%d %commit%`) DO (
SET date=%%F
)

FOR /F "tokens=* USEBACKQ" %%F IN (`git rev-parse --abbrev-ref HEAD`) DO (
SET branch=%%F
)

FOR /F "tokens=* USEBACKQ" %%F IN (`git describe --abbrev^=0`) DO (
SET ver=%%F
)
::Export to version.h
ECHO #define FW_VER "%ver%" > version.h
ECHO #define COMMIT_NUMBER "%commit%" >> version.h
ECHO #define COMMIT_DATE "%date%" >> version.h
ECHO #define COMMIT_BRANCH "%branch%" >> version.h

IF "%arg1%"=="GIT" (
@echo on
@echo version:%ver% Commit:%commit% Branch:%branch% Date:%date% 
@echo off
)
IF "%arg1%"=="SAVE" (
@echo on
@echo Save fw_%ver%_%branch%_%date%_%commit%.hex to %arg3%
COPY "%arg2%\fw.ino.hex" "fw_%ver%_%branch%_%date%_%commit%.hex"
)
,

2

Я столкнулся с той же проблемой и, основываясь на предыдущих ответах, написал этот скрипт для Arduino IDE. Я успешно использую его на разных ОС уже много месяцев. В репозитории вы можете найти инструкции по его установке.

,