Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Awejk от Январь 11, 2010, 23:11



Название: Автоматическое проставление версии билда
Отправлено: Awejk от Январь 11, 2010, 23:11
Как сделать, что бы автоматически при компиляции в релиз режиме в заголовок окна проставлялся номер билда (1.1, 1.2, 1.3, ....) А то ручками ставить проблематично.


Название: Re: Автоматическое проставление версии билда
Отправлено: Dendy от Январь 12, 2010, 00:10
Неясно в чём именно у вас проблема. Что нужно автоматизировать и что такое номер билда?


Название: Re: Автоматическое проставление версии билда
Отправлено: DOOMer от Январь 12, 2010, 00:21
Вероятно Awejk  хочет  задать где-то стартовый номер версии/билда и потом при каждой пересборке своего проекта чтобы этот номер увеличивался на 1.

Насколько я помню в windows IDE (дельфи, студия) такая "фича" была. Но там это делалось именно за счёт среды разработки.


Название: Re: Автоматическое проставление версии билда
Отправлено: Dendy от Январь 12, 2010, 00:24
Могу подсказать как это делается на CMake.


Название: Re: Автоматическое проставление версии билда
Отправлено: DOOMer от Январь 12, 2010, 00:39
Dendy , подскажи плз. Мне тоже интересно, в свете того что решил отказаться от использования  qmake в пользу Cmake.


Название: Re: Автоматическое проставление версии билда
Отправлено: Dendy от Январь 12, 2010, 01:26
В самом CMake конечно же такой штуки нет, но это не мешает нам изголяться как угодно. CMake работает в двух режимах: 1) генератор системы сборки, 2) интерпретатор. То-есть нам нужно добавить в Makefile команду, которая будет инкрементировать номер сборки и записывать его куда-то в файл при каждом проходе make. Интерпретатор решает вопрос со скриптом, который это будет делать, а генератор - чтобы добавить этот скрипт в Makefile. Программа на этапе выполнения читает файл с номером сборки. При желании этот файл можно засунуть в систему Qt-ресурсов.

increment.cmake
Код:
set( filename "build-number.txt" )

# check for the previous build number
if ( EXISTS "${filename}" )
# read build number from file
file( READ "${filename}" build_number LIMIT 10 )
else()
# no file with build number, assuming very first build
set( build_number 0 )
endif()

# increment build number
math( EXPR build_number "${build_number} + 1" )

# save new build number into the same file
file( WRITE "${filename}" "${build_number}" )

CMakeLists.txt
Код:
cmake_minimum_required( VERSION 2.8 )

find_package( Qt4 REQUIRED )
include( "${QT_USE_FILE}" )

add_executable( test main.cpp )
target_link_libraries( test ${QT_LIBRARIES} )

# add target that will increment build number
add_custom_target( increment ALL
"${CMAKE_COMMAND}" -E chdir "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_COMMAND}" -P "increment.cmake"
)

add_dependencies( test increment )

main.cpp
Код
C++ (Qt)
 
#include <QApplication>
#include <QWidget>
#include <QFile>
#include <QTextStream>
 
int main( int argc, char ** argv )
{
QApplication app( argc, argv );
 
// read build number
int buildNumber = -1;
{
QFile file( "build-number.txt" );
if ( file.open( QIODevice::ReadOnly ) )
{
QTextStream ts( &file );
const QString buildNumberString = ts.readLine();
bool ok;
const int readBuildNumber = buildNumberString.toInt( &ok );
if ( ok )
buildNumber = readBuildNumber;
}
}
 
const QString BuildNumberTemplate = QString( "Build number: %1" );
const QString title = buildNumber == -1 ?
BuildNumberTemplate.arg( "Unknown" ) :
BuildNumberTemplate.arg( buildNumber );
 
QWidget w;
w.setWindowTitle( title );
w.show();
 
return app.exec();
}
 


Название: Re: Автоматическое проставление версии билда
Отправлено: DOOMer от Январь 12, 2010, 09:56
Dendy, благодарю.  С ресурсами все тоже получилось.


Название: Re: Автоматическое проставление версии билда
Отправлено: Awejk от Январь 12, 2010, 10:22
2Dendy
Зачем использовать cmake? Если уже и делать руками, то можно и без него(меньше кода, меньше логики). Например, задать переменную для Release режима что-то типа _RELEASE_BUILD_ и потом в коде при помощи препроцессорных директив прописать тоже самое что и Вы(только добавить ещё инкремент на единицу, и сохранение в файл).

А имел ввиду я создание такой штуки именно с помощью IDE. Что бы она всё сама просчитывала и давала мне только уже переменную для релиз режима, которую я уже подставляю куда хочу.


Название: Re: Автоматическое проставление версии билда
Отправлено: Dendy от Январь 12, 2010, 10:23
При желании можно хранить номера сборок отдельно для Debug, Release и других конфигураций. Вопрос к знатокам pro-файлов - попробуйте решить эту же задачу с QMake.


Название: Re: Автоматическое проставление версии билда
Отправлено: Dendy от Январь 12, 2010, 10:36
Awejk, ваша правда, нехорошо если вдруг на этапе выполнения файла с номером сборки не окажется. Тогда конечно можно генерировать заголовочник с директивой. К примеру так:

Добавляем прототип заголовочника, build_number.h.template
Код:
#define _RELEASE_BUILD_NUMBER_ ${build_number}

Дописываем в конец increment.cmake
Код:
...
# generate header with build version
configure_file( "build_number.h.template" "build_number.h" )

Теперь программа на порядок элегантнее:
main.cpp
Код
C++ (Qt)
#include <QApplication>
#include <QWidget>
 
#include "build_number.h"
 
int main( int argc, char ** argv )
{
QApplication app( argc, argv );
 
QWidget w;
w.setWindowTitle( QString( "Build number: %1" ).arg( _RELEASE_BUILD_NUMBER_ ) );
w.show();
 
return app.exec();
}
 


Название: Re: Автоматическое проставление версии билда
Отправлено: Dendy от Январь 12, 2010, 10:40
А имел ввиду я создание такой штуки именно с помощью IDE. Что бы она всё сама просчитывала и давала мне только уже переменную для релиз режима, которую я уже подставляю куда хочу.

Во-первых, привязывать функционал к IDE - моветон. Вы рискуете потерять эту возможность при сборке с командной строки, переходе на другую платформу, на другую IDE. Во-вторых, не совсем ясно о какой переменной идёт речь, которую вы собираетесь подставлять куда хочу.


Название: Re: Автоматическое проставление версии билда
Отправлено: Awejk от Январь 12, 2010, 11:14
Код:
Во-первых, привязывать функционал к IDE - моветон.
А вот такой нюанс, я упустил. Теперь Ваша правда :).
Второй вариант программы вполне красиво смотрится.

С CMake я не работал, посему у меня вопрос, если я такое сделаю у себя, то на сколько оно будет корректно работать в Linux & Windows? Например, сейчас я работаю в Windows в студии, и проект собираю полностью средствами студии. Затем мне надо перенести пиложение на Linux открою код в том же QTCreator, а этот код по генерации билда, будет также корректно работать, как и в студии? Или тут есть подвох?


Название: Re: Автоматическое проставление версии билда
Отправлено: Dendy от Январь 12, 2010, 11:26
Подвохов никаких нет, будет работать одинаково на всех платформах в любых IDE в режиме Makefile-проекта. Я так работаю в MSVC и Eclipse. Единственно что пример стоит улучшить, чтобы под Windows и Linux номер сборки был разный, то-есть сохранялся в разные файлы.


Название: Re: Автоматическое проставление версии билда
Отправлено: Awejk от Январь 12, 2010, 12:32
Цитировать
Я так работаю в MSVC и Eclipse
MSVC в windows а Eclipse в другой системе?
В MSVC работаете как обычно, т.е. дебажить F5, что бы собрать - снова из сутдии нажали Rebuild по проекту из контекстного меню?
Т.е. CMake прописывается где-то в свойствах проекта как в MSVC так и для Eclipse?


Название: Re: Автоматическое проставление версии билда
Отправлено: Dendy от Январь 12, 2010, 12:50
MSVC в Windows, Eclipse в Windows и Linux. Во всех случаях использую Makefile-проекты. Для студии правила сборки и пересборки задаются в настройках проекта, горячие клавиши - как обычно. CMake как правило не прописывается - он один раз запускается извне IDE, далее пересборка только с помощью make/nmake.


Название: Re: Автоматическое проставление версии билда
Отправлено: SASA от Январь 12, 2010, 13:08
http://www.prog.org.ru/topic_5495_0.html (http://www.prog.org.ru/topic_5495_0.html)


Название: Re: Автоматическое проставление версии билда
Отправлено: SABROG от Январь 12, 2010, 14:36
Вопрос к знатокам pro-файлов - попробуйте решить эту же задачу с QMake.

Qt уже использует perl при сборке, так что пихайте скрипт в target.commands или если нужен вызов на этапе создания makefile'ов, то типа такого:

Код:
MYVAR = $$system(perl ...)


Название: Re: Автоматическое проставление версии билда
Отправлено: mks56 от Февраль 20, 2010, 07:09
Может немного не в тему, но при использовании в Win в качестве средства контроля версий связки Subversion+TortoiseSVN в составе последней есть утилита SubVCRev, которая как раз для этого и предназначена. Правда, в качестве номера будет ревизия Subversion.


Название: Re: Автоматическое проставление версии билда
Отправлено: SABROG от Февраль 20, 2010, 23:39
Можно сделать как это делает Qt с qmake. Написать консольную утилиту, которая делает всю черную работу. В .pro файле искать готовый исполнимый файл этой утилиты, если её нет, то из исходников сначала собирается эта утилита, затем вызов подставляется в makefile'ы. В момент сборки сначала идет вызов этой утилиты, затем собираются исходники проекта.

Только всё это ерунда. Я не могу вспомнить ни одной программы в исходниках которой был инкремент версии. И это правильно. Просто подумайте, вы скачали исходники Qt 4.6.2, сделали configure, а в заголовке какого-нибудь QtDesigner'a у вас стоит версия Qt 4.6.3, а если сделаете еще раз перекомпиляцию, то будет 4.6.4 и т.д. За версиями должен следить разработчик и коду, который увеличивает версию нечего делать в исходниках проекта, которые распространяются для других людей. Если это действительно нужно, то должно быть 2 .pro/CMakeList.txt файла, один публичный, другой приватный.


Название: Re: Автоматическое проставление версии билда
Отправлено: crackedmind от Февраль 22, 2010, 07:25
Пример с Qt какой то странный. Зачем при каждом билде увеличивать patch version? Есть же много софта у которого 4х значный номер версий например 1.1.2.2056 :) И иногда бывает что удобнее выпустить версию 1.1.2.2057 с багфиксом серъезной ошибки , нежели обзывать ее 1.1.3.


Название: Re: Автоматическое проставление версии билда
Отправлено: lit-uriy от Февраль 22, 2010, 09:50
Цитировать
И иногда бывает что удобнее выпустить версию 1.1.2.2057 с багфиксом серъезной ошибки , нежели обзывать ее 1.1.3.
У меня несколько вопросов:
1) Что означает 3 цифра?
2) Для кого удобнее?
3) Почему удобнее?


Название: Re: Автоматическое проставление версии билда
Отправлено: SABROG от Февраль 22, 2010, 09:51
Не согласен, это какой-то хаос с версиями будет. Всё равно что выпускать новую версию программы на каждый чих. "А что нового в новой версии?" - "Ничего, отступы п$оправил..."

Думаю лучше придерживаться GNU version scheme.


Название: Re: Автоматическое проставление версии билда
Отправлено: SASA от Февраль 22, 2010, 11:48
Основную версию надо прописывать руками (неапример 3.2). Но в скомпилированный проект должен попасть номер, который однозначно ассоциируется с исходниками. Щёлкаешь "О программе" и видишь 3.2.23213. Удобно для поддержки. У нас в проекте 23213 - это номер ревизи в SVN.
как это можно сделать - http://www.prog.org.ru/topic_5495_0.html (http://www.prog.org.ru/topic_5495_0.html)


Название: Re: Автоматическое проставление версии билда
Отправлено: ufna от Февраль 22, 2010, 13:06
Хз, я давным-давно для этих целей написал микропрогу, которую среда запускает после успешного билда. Она правит .rc и радуется жизни. Ну, приходится для среды настраивать post-build event, ну и черт с ним как бы.


Название: Re: Автоматическое проставление версии билда
Отправлено: crackedmind от Февраль 22, 2010, 21:43
Цитировать
1) Что означает 3 цифра?
А  что непонятного?
1 - major version
2 - minor version
3 - patch version
4 - build version


Название: Re: Автоматическое проставление версии билда
Отправлено: lit-uriy от Февраль 23, 2010, 03:32
Цитировать
4 - build version
Я вот и не понимаю зачем номер сборки, что полный бардак в конторе? Каждая пара "make clean" + "make" приводит к разным результатам работы программы?

Цитировать
Щёлкаешь "О программе" и видишь 3.2.23213. Удобно для поддержки. У нас в проекте 23213 - это номер ревизи в SVN.
Опять бардаком пахнет.
Я вот получаю от пользователя, например,  "Программа 3.2.1", лезу в гит и смотрю соответствующую метку (tag) или в SVN, тоже самое, только там это каталог отдельный.
У меня пара "make clean" + "make" на одной и той же версии, даёт один и тот же результат. И по другому быть не может


Название: Re: Автоматическое проставление версии билда
Отправлено: igor_bogomolov от Февраль 23, 2010, 04:04
Считать количество компиляций, на мой взгляд, действительно бессмысленно. Тем более при совместной разработке. А вот иметь возможность идентифицировать, на основе какой ревизии или коммита базируется программа, очень удобно. Так что в чем бардак, не понимаю.
Я например делаю так.

Код
Bash
static char Version[]   = \"0.1.8\";
static char BuildData[] = \"$(git log -1 --pretty="%ai %h" | awk '{ print $1 }')\";
static char Revision[]  = \"$(git log -1 --pretty="%ai %h" | awk '{ print $4 }')\";


Название: Re: Автоматическое проставление версии билда
Отправлено: crackedmind от Февраль 24, 2010, 06:40
lit-uriy
В рамках выпуска версии "3.2.1" можно сделать несколько билдов, в каждом из которых может быть исправления или добавления чего то. Попасть к пользователю случайно может любая из них. Как ты будешь идентифицировать в каком из билдов была допущена ошибка?

Билд инфа для разработчиков чтоб удобнее было искать ошибку.

Если следовать твоей логики многие конторы ошибаются что идентифицируют версии программ по билдам))


Название: Re: Автоматическое проставление версии билда
Отправлено: lit-uriy от Февраль 24, 2010, 07:09
lit-uriy
В рамках выпуска версии "3.2.1" можно сделать несколько билдов, в каждом из которых может быть исправления или добавления чего то.
Как такое может быть?
Исправления отмечаются строго третьей цифрой
Минорные добавления - второй
Одновременно исправления и минорные добавления - второй.


Если следовать твоей логики многие конторы ошибаются что идентифицируют версии программ по билдам))
Совершенно верно. Это надёжный признак не надёжной разработки

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


Название: Re: Автоматическое проставление версии билда
Отправлено: frostyland от Октябрь 13, 2010, 10:21
Хмм.
А как в Qt проставляются версии надстроек, к примеру?
Что-то я не помню в описании создания плагинов какихто танцев с бубнами...

С уважением, ВВК


Название: Re: Автоматическое проставление версии билда
Отправлено: Denjs от Октябрь 13, 2010, 13:52
Я предпочитаю не номер билда, а дату сборки.
Так как использую GCC и MinGW - то это работает:
main.cpp
Код:
#ifdef __TIME__
#define BUILDTIME __TIME__
#else
#define BUILDTIME .
#endif

#ifdef __DATE__
#define BUILDDATE __DATE__
#else
#define BUILDDATE .
#endif

...
mainWindowWidget->setWindowTitle( QString("Моя супер мега система.  сборка [%1 %2]").arg( BUILDDATE ).arg( BUILDTIME ));



Оно плохо - дата тут выдается в пиндостанском "дебильном" формате - "мес, число, год".
Ну и, подозреваю, это не работает под MSVS, но по мне так на это и наплевать)

PS: тут говорят (http://forum.sources.ru/index.php?showtopic=277205&view=findpost&p=2315445),  есть ещё куча других вставок:
Цитировать
__LINE__, __FILE__, __DATE__, __TIME__, __func__, __VA_ARGS__
(а тут их описывают (http://gcc.gnu.org/onlinedocs/cpp/Predefined-Macros.html#Predefined-Macros))


Название: Re: Автоматическое проставление версии билда
Отправлено: SASA от Октябрь 14, 2010, 10:12
По поводу билдов и четвёртой цифры.


Название: Re: Автоматическое проставление версии билда
Отправлено: Denjs от Октябрь 14, 2010, 11:48
По поводу билдов и четвёртой цифры.

Нельзя у строителя собачьих будок учиться строить замки. Вы будете строить не замки, а большие собачьи будки.
Нельзя смотреть на то как "это делает" майкрософт и учиться у них "этому"))) Вы будете создавать большие глючные быдло-приложения)))) ;D


Название: Re: Автоматическое проставление версии билда
Отправлено: frostyland от Октябрь 14, 2010, 11:57
По поводу билдов и четвёртой цифры.

Нельзя у строителя собачьих будок учиться строить замки. Вы будете строить не замки, а большие собачьи будки.
Нельзя смотреть на то как "это делает" майкрософт и учиться у них "этому"))) Вы будете создавать большие глючные быдло-приложения)))) ;D

А я бы за Excel поставил M$ памятник )))
А за Word тут же снес бы его обратно ))


Название: Re: Автоматическое проставление версии билда
Отправлено: SASA от Октябрь 14, 2010, 14:13
Нельзя смотреть на то как "это делает" майкрософт и учиться у них "этому"))) Вы будете создавать большие глючные быдло-приложения)))) ;D
Столь категоричные суждения больше говорят об авторе, чем об Майкрософте.

Ещё пару скриншотов.