Включить тег Git (или версию SVN) в скетч Arduino?
Есть ли способ получить текущий тег Git/идентификатор коммита в двоичный файл скетча Arduino?
Для обычной разработки настольных программ вы можете использовать Makefile с некоторыми хитростями (как указано в этом ответе StackExchange) . Однако для скетча Arduino нет файла Makefile. Верно?
Я мог бы создать пакетный файл, который запускал бы перед каждой компиляцией, но существует вполне реальная вероятность того, что я забуду его запустить, а неправильная информация о версии хуже, чем отсутствие информации о версии.
В настоящее время я использую макросы препроцессора __DATE__
и __TIME__
, чтобы попытаться определить, какая версия работает на плате. Это работает, но отслеживание в обратном направлении от даты/времени компиляции до фиксации в системе управления версиями — это больше догадки, чем что-либо еще.
@DAVe3283, 👍4
Обсуждение7 ответов
Лучший ответ:
Вдохновленный ответом Целли, я продолжил расследование и нашел похожее метод, который может быть реализован с использованием обычного интерфейса Среда разработки Arduino.
Похоже, что пользователь GitHub Wackerbarth столкнулся с тем же самым проблема, открыта проблема в системе отслеживания ошибок Arduino:
Было бы очень полезно иметь возможность добавить рецепт на платформу. Спецификация, которая выполняется в начале процесса сборки. (предварительная сборка)
В частности, мой вариант использования — генерировать строки версий, которые быть включены в образ ПЗУ на основе информации, извлеченной из Репозиторий SCM.
Далее он отправил запрос на включение для добавления «хуков» в процесс сборки, который привел к выпуску 1.6.2. См. документацию на эти Перехватчики до и после сборки.
Вот как вы можете использовать эту функцию для включения git commit информацию в вашу программу (проверено на Arduino 1.8.5 / Ubuntu 16.04):
- Сохраните следующий файл под именем
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
- Найдите файл с именем
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}"
- Включите в свой скетч
"git-version.h"
и используйте его следующим образом:
#include "git-version.h"
void setup() {
Serial.begin(9600);
Serial.println("This is version " GIT_VERSION);
}
- Создайте пустой файл в каталоге скетча с именем
git-version.h
.
Обратите внимание, что git-version.h
в текущем каталоге нужен только
для первой компиляции. Настоящий git-version.h
будет в
временный каталог сборки.
Я не уверен, что докажет идентификатор коммита. Я использую git для управления исходным кодом для своих скетчей Arduino, но конкретная загрузка может быть на полпути между предыдущим коммитом и следующим. То есть код на плате может не соответствовать какой-либо конкретной фиксации.
Дата/время по крайней мере примерно указывают, где в потоке фиксации находится код.
Можно запустить задание cron, которое периодически (скажем, каждую минуту) обновляет файл .h с текущим идентификатором фиксации из ветки и включает его в скетч.
Это правда, что вы можете компилировать с грязной рабочей копией, но, по крайней мере, вы точно знаете, с какого коммита вы начали эту прошивку. Имея только дату, вы не можете точно знать, какая ветка была скомпилирована, особенно если несколько веток были обновлены примерно в одно и то же время. И, наконец, использование даты/времени приводит к проблемам с часовыми поясами, придавая еще большую двусмысленность тому, что именно было скомпилировано., @DAVe3283
Если ты так говоришь. «Грязная рабочая копия» может быть чем угодно. Я не уверен, что доказывает исходный идентификатор коммита. использование даты/времени приводит к проблемам с часовыми поясами
- в скольких часовых поясах вы находитесь? Я лично в одном., @Nick Gammon
Я до сих пор работаю с друзьями из колледжа, и теперь мы живем в разных штатах. Часовой пояс меня уже укусил в прошлом, я не пытаюсь быть придурком или что-то в этом роде. Знание исходного идентификатора коммита позволяет мне, по крайней мере, узнать, из какой ветки пришел скетч. Я согласен, что грязная рабочая копия может указывать на что угодно, но в целом она близка к базовому коммиту., @DAVe3283
Люди *сделали* make-файлы для компиляции своих материалов для Arduino. Я не могу придумать какой-либо действительно простой способ сделать это, если не считать моего предложения задания cron для регулярного обновления файла .h., @Nick Gammon
Если вы хотите использовать трюки, подобные Makefile, можно использовать Рабочий процесс на основе Makefile вместо Arduino IDE. Есть несколько универсальные файлы Makefile для Arduino, плавающие в Интернете. Одним из довольно популярных является Arduino Судара Мутху Makefile. С ним вы просто написать небольшой Makefile для каждого проекта, который устанавливает несколько переменных, а затем включает общий Makefile. Есть одно ограничение с этим подход, однако: Arduino IDE обычно изменяет ваш файл .ino перед отправив его компилятору двумя способами:
- Включает <Arduino.h>
- Он пишет прототипы в начале программы для каждого определяемую вами функцию.
Сударр Мутху Makefile включает Arduino.h (он не затрагивает ваш
кода, используя вместо этого параметр -include
gcc), но он не записывает
прототипы функций для вас. Таким образом, он не на 100% совместим с
Среда разработки Arduino.
Еще одна возможность — полностью написать Makefile самостоятельно. который вызывает Arduino Строитель. Это должно быть 100% совместимость с интегрированной средой разработки.
У меня также были проблемы с управлением версиями 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
Если вы используете 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#динамические-сборки-флаги
Вдохновленный сценарием Эдгара 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"
)
Я столкнулся с той же проблемой и, основываясь на предыдущих ответах, написал этот скрипт для Arduino IDE. Я успешно использую его на разных ОС уже много месяцев. В репозитории вы можете найти инструкции по его установке.
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Асинхронные вызовы функций в скетче ардуино
- Двигатель постоянного тока шумит, но не вращается
- Цикл While не прерывается
- как отправить аргумент объектам ESP8266WebServer в функции
- Реализовать связь Visible Light с помощью Arduino
- Как можно автоматически тестировать исходный код Arduino (непрерывная интеграция)?
- Скрытие пароля WLAN при отправке на GitHub
Вы можете отказаться от Arduino IDE и перейти к [разработке на основе Makefile](https://github.com/sudar/Arduino-Makefile)., @Edgar Bonet
отслеживание в обратном направлении от даты/времени компиляции до фиксации в системе управления версиями - это скорее догадки, чем что-либо еще
- почему? В коммитах есть дата., @Nick Gammon@EdgarBonet Думаю, это то, что я ищу! Я попробую. Если вы опубликуете это как ответ, я могу принять это., @DAVe3283