реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Добавление номера сборки в исходники, номер сборки, build number
Brain13
сообщение Jun 15 2011, 10:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Здравствуйте.
Появилась задача точно определять какая прошивка залита в МК. Для этого планирую записывать некоторое число в прогу МК и по необходимости читать его через последовательный порт. Но при каждой заливке лезть и изменять это число запарюсь, да и забыть можно. Хотелось бы, чтобы это число инкрементировалось само при каждой компиляции. Как это сделать.
Системы контроля версий не использую, но надо начинать. Насколько я понимаю в системах типа Git, Svn есть номер ревизии. Можно ли как нибудь это использовать?
Может в Eclipse есть какаянидь фича для этого?
Думаю сделать следующее: написать скрипт который вызывается при компиляции, он считывает файл, например, "version.h" и инкрементирует какойнидь define.

А как делается правильно?

PS: Использую Ubuntu+Eclipse+CodeSourcery G++ + GNU ARM Eclipse Plugin.
Go to the top of the page
 
+Quote Post
Flexz
сообщение Jun 15 2011, 12:26
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Предпочитаю дату компиляции, более наглядно получается. Если без SVN, то make перед компиляцией вызывает скрипт, который пишет в файл, например, date.h текущую дату, которую потом можно показать пользователю или считать как-то.
Если с SVN то см. svn:keywords. Про git не знаю, не довелось поюзать пока.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 15 2011, 12:35
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Flexz @ Jun 15 2011, 16:26) *
Предпочитаю дату компиляции, более наглядно получается. Если без SVN, то make перед компиляцией вызывает скрипт, который пишет в файл, например, date.h

++
Вместо скрипта можно использовать предопределённую константу компилятора __DATE__

Номер версии инкрементирую вручную при первой правке текущей стабильной версии.
После ряда итераций и конечного тестирования-прогона она автоматически релизится в качестве новой стабильной версии и закладывается в архив.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
XVR
сообщение Jun 16 2011, 09:14
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Я использовал для этих целей скрипт, который сканировал все исходные файлы (с сорцами), предварительно отсортировав их по имени, и вычислял MD5 от всех файлов скопом. Потом генерил С текст с массивом с этой MD5 и прилинковывал его в конечную прошивку
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jun 16 2011, 09:28
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (XVR @ Jun 16 2011, 18:14) *
Я использовал для этих целей скрипт, который сканировал все исходные файлы (с сорцами), предварительно отсортировав их по имени, и вычислял MD5 от всех файлов скопом. Потом генерил С текст с массивом с этой MD5 и прилинковывал его в конечную прошивку

Подождите, а автор топика кажется о версии спрашивал?!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Jun 16 2011, 10:13
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(Brain13 @ Jun 15 2011, 13:24) *
Хотелось бы, чтобы это число инкрементировалось само при каждой компиляции.

При каждой компиляции это как-то жестко, у меня и сотня мейков в день бывает, и каждому новый номер давать? Логичней или вручную релизу номер вписывать или все-таки дату, лично мне дата больше нравится. А можно и номер версии и дату, благо уж дату всегда компилятор может сам вставлять автоматом.

Хотя туплю я, часто можно дебаг и релиз по-разному собирать, если так то тогда да, релизов много не бывает, можно и автоматом номер инкрементировать.
Go to the top of the page
 
+Quote Post
Brain13
сообщение Jun 16 2011, 11:21
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Цитата(Ruslan1 @ Jun 16 2011, 14:13) *
При каждой компиляции это как-то жестко, у меня и сотня мейков в день бывает, и каждому новый номер давать? ...

Да, каждой компиляции - свой номер. Я такое видел, например, в AVR Studio, там в хелп о програме было примерно следующее 4.18 SP2, Build 678.

Для чего это нужно: отдают мне плату и говорять что там баг. Мне нужно залезть в нее отладчиком. А исходники к этому времени изменились. Да и не помню какая версия там была(месяца полтора прошло). Как отлаживать, перезаливать нельзя, тк баг может измениться.
Так вот малйшее изменение должно отслеживаться. А вручную проставлять геморно и можно забыть прописать номер.

Написал простенький скрипт для этих целей
CODE
#!/bin/sh

filename=../version.h #путь до файла с версией

if [ -f $filename ] #если файл существует
then
while read line #поиск по всему файлу
do
if [[ ${line:0:24} == "#define _BUILD_NUMBER__ " ]] # вот этой строки
then
build_number=${line:24} # с 24 символа считать предыдущий номер билда
build_number=$((build_number+1)) # инкремент
break
else
build_number=1
fi
done <$filename
else
build_number=1
fi

build_date=$(date +%Y%m%d%k%M%S) # берем дату

echo "_BUILD_NUMBER__ = $build_number" # при построении будет отображаться текущий номер и дата
echo "_BUILD_DATE__ = $build_date"



rm -Rf $filename # удаляем старый файл

echo "#ifndef _VERSION_H__" >> $filename
echo "#define _VERSION_H__" >> $filename

echo "#define _BUILD_NUMBER__ $build_number" >> $filename # тут просто число
echo "#define _BUILD_DATE__ \"$build_date\"" >> $filename # тут строка т.к. число большое ИМХО лучше строкой
echo "#endif" >> $filename
echo >> $filename

Прошу за код не пинать - это мой первый скрипт на баше.

Этот код можно вызвать перед построением. В эслипсе это прописыватся в Properties -> C/C++ Build -> Setings -> Build Steps -> Pre-Build Steps -> Command. Там я прописал "sh /home/brain/workspace/arm/test_ml/version.sh"
сча думаю как еще дописать, чтоб этот скрипт в git коммит сам делал, вроде это должно быть не сложно. Когда допишу наверна выложу здесь.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 16 2011, 12:27
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Brain13 @ Jun 16 2011, 15:21) *
Да, каждой компиляции - свой номер.


Так база git'a разбухнет до неимоверности, если туда commit автоматом каждый make делать. Да и как-то странно, у вас серийное изделие в постоянной доработке?
Go to the top of the page
 
+Quote Post
XVR
сообщение Jun 16 2011, 12:35
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(haker_fox @ Jun 16 2011, 13:28) *
Подождите, а автор топика кажется о версии спрашивал?!
А чем собственно не версия? Слишком букв много для номера версии? Что есть, то есть rolleyes.gif
Зато однозначно связывает сорцы и версию. Конечно, эти сорцы должны где то быть. Т.е. нужна или версионная система (SVN, Git, CVS, etc) или тупо директория с заархивированными сорцами.

Если есть версионная система, то можно номер версии из нее закатать в прошивку (это делается скриптами и опцией -D компилятора)
Go to the top of the page
 
+Quote Post
Brain13
сообщение Jun 16 2011, 13:27
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Цитата(sergeeff @ Jun 16 2011, 16:27) *
Так база git'a разбухнет до неимоверности, если туда commit автоматом каждый make делать. Да и как-то странно, у вас серийное изделие в постоянной доработке?


Это не серийное изделие, пока идет разработка. Насколько я знаю git хранит только первоначальный файл, и кучу diff'ов к нему, поэтому размер должен быть небольшой. Да и размер репозитория не критичен, хоть десяток Гб. Вот не пострадает ли скорость, хотя врядли, linux на гите работает и ничего, а там миллион коммитов наверно есть.

Цитата(XVR @ Jun 16 2011, 16:35) *
...
Если есть версионная система, то можно номер версии из нее закатать в прошивку (это делается скриптами и опцией -D компилятора)

А можно поподробнее? А то я раздумывал как номер ревизии в код встроить, но плохо получается.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 16 2011, 13:33
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Почитайте здесь: http://www.codeproject.com/KB/architecture...ual_studio.aspx
Go to the top of the page
 
+Quote Post
Idle
сообщение Jun 16 2011, 16:42
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(Brain13 @ Jun 15 2011, 14:24) *
Здравствуйте.
...
Но при каждой заливке лезть и изменять это число запарюсь, да и забыть можно. Хотелось бы, чтобы это число инкрементировалось само при каждой компиляции.

здравствуйте, зачем вам менять число при каждой прошивке? пишешь функционал, отлаживаешь, отладил - версия такая-то, вручную проставляешь
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 16 2011, 16:50
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Абсолютно поддерживаю. Тем более, что, например, в SVN автоматом номера версии автоматом появляются только в измененных файлах. Значит встанет вопрос об "отлавливании" максимального номера версии из всех файлов проекта или же вручную смотреть средствами SVN текущую ревизию и ее добавлять в том или ином виде в проект.
Go to the top of the page
 
+Quote Post
XVR
сообщение Jun 16 2011, 19:05
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Brain13 @ Jun 16 2011, 17:27) *
А можно поподробнее? А то я раздумывал как номер ревизии в код встроить, но плохо получается.
Не надо в код, встраивайте через опции в Makefile'е
Пишете скрипт, который извлекает из вашей версионной системы текущую версию HEAD'а (не знаю, как это будет в git - не пользую)
Затем передаете ее в make, например так:
Код
make VERSION="$VERSION"
Предполагается, что в переменной окружения VERSION лежит ваша версия, и она есть число
В самом makefile'е пишете так
Код
  $(CC) ... -DVERSION=$VERSION

Где то в программе пишете
Код
int my_version = VERSION;

Все - в переменной my_version у вас версия репозитария на момент компиляции
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 4 2011, 01:30
Сообщение #15


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(Brain13 @ Jun 16 2011, 07:21) *
Для чего это нужно: отдают мне плату и говорять что там баг. Мне нужно залезть в нее отладчиком. А исходники к этому времени изменились. Да и не помню какая версия там была(месяца полтора прошло). Как отлаживать, перезаливать нельзя, тк баг может измениться.
Так вот малйшее изменение должно отслеживаться. А вручную проставлять геморно и можно забыть прописать номер.

Проблема конечно актуальная, но решение.... Ужасное. Захотелось посмотреть историю проекта, и что мы видим? Сотни модификаций, без каких либо аннотаций? Это жесть.

Гораздо разумнее перед тем как отдавать версию заказчику комиттить все изменения в version control, обновлять build #, и после сборки тудаже заливать исходник. Все таки, очередная версия в SVN должна представлять собой какой-то маломальски законченый шаг в развитии проекта, либо исправление бага, либо новая функция.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 16:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016