Russian Qt Forum
Ноябрь 24, 2024, 19:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Автоматическое проставление версии билда  (Прочитано 27043 раз)
Awejk
Гость
« : Январь 11, 2010, 23:11 »

Как сделать, что бы автоматически при компиляции в релиз режиме в заголовок окна проставлялся номер билда (1.1, 1.2, 1.3, ....) А то ручками ставить проблематично.
Записан
Dendy
Гость
« Ответ #1 : Январь 12, 2010, 00:10 »

Неясно в чём именно у вас проблема. Что нужно автоматизировать и что такое номер билда?
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #2 : Январь 12, 2010, 00:21 »

Вероятно Awejk  хочет  задать где-то стартовый номер версии/билда и потом при каждой пересборке своего проекта чтобы этот номер увеличивался на 1.

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

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
Dendy
Гость
« Ответ #3 : Январь 12, 2010, 00:24 »

Могу подсказать как это делается на CMake.
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #4 : Январь 12, 2010, 00:39 »

Dendy , подскажи плз. Мне тоже интересно, в свете того что решил отказаться от использования  qmake в пользу Cmake.
Записан

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
Dendy
Гость
« Ответ #5 : Январь 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();
}
 
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #6 : Январь 12, 2010, 09:56 »

Dendy, благодарю.  С ресурсами все тоже получилось.
Записан

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
Awejk
Гость
« Ответ #7 : Январь 12, 2010, 10:22 »

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

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

При желании можно хранить номера сборок отдельно для Debug, Release и других конфигураций. Вопрос к знатокам pro-файлов - попробуйте решить эту же задачу с QMake.
Записан
Dendy
Гость
« Ответ #9 : Январь 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();
}
 
Записан
Dendy
Гость
« Ответ #10 : Январь 12, 2010, 10:40 »

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

Во-первых, привязывать функционал к IDE - моветон. Вы рискуете потерять эту возможность при сборке с командной строки, переходе на другую платформу, на другую IDE. Во-вторых, не совсем ясно о какой переменной идёт речь, которую вы собираетесь подставлять куда хочу.
Записан
Awejk
Гость
« Ответ #11 : Январь 12, 2010, 11:14 »

Код:
Во-первых, привязывать функционал к IDE - моветон.
А вот такой нюанс, я упустил. Теперь Ваша правда Улыбающийся.
Второй вариант программы вполне красиво смотрится.

С CMake я не работал, посему у меня вопрос, если я такое сделаю у себя, то на сколько оно будет корректно работать в Linux & Windows? Например, сейчас я работаю в Windows в студии, и проект собираю полностью средствами студии. Затем мне надо перенести пиложение на Linux открою код в том же QTCreator, а этот код по генерации билда, будет также корректно работать, как и в студии? Или тут есть подвох?
Записан
Dendy
Гость
« Ответ #12 : Январь 12, 2010, 11:26 »

Подвохов никаких нет, будет работать одинаково на всех платформах в любых IDE в режиме Makefile-проекта. Я так работаю в MSVC и Eclipse. Единственно что пример стоит улучшить, чтобы под Windows и Linux номер сборки был разный, то-есть сохранялся в разные файлы.
Записан
Awejk
Гость
« Ответ #13 : Январь 12, 2010, 12:32 »

Цитировать
Я так работаю в MSVC и Eclipse
MSVC в windows а Eclipse в другой системе?
В MSVC работаете как обычно, т.е. дебажить F5, что бы собрать - снова из сутдии нажали Rebuild по проекту из контекстного меню?
Т.е. CMake прописывается где-то в свойствах проекта как в MSVC так и для Eclipse?
Записан
Dendy
Гость
« Ответ #14 : Январь 12, 2010, 12:50 »

MSVC в Windows, Eclipse в Windows и Linux. Во всех случаях использую Makefile-проекты. Для студии правила сборки и пересборки задаются в настройках проекта, горячие клавиши - как обычно. CMake как правило не прописывается - он один раз запускается извне IDE, далее пересборка только с помощью make/nmake.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 22.