Зачем это нужно?
Бесспорно глупый вопрос для человека занимающего автоматизацией, зачем вбивать руками то что за тебя может сделать машина. Когда я начал изучать Qt (всего пару месяцев назад), то не нашел инструментов позволяющих это делать. На Delphi (да да, на работе я использую именно это среду) есть встроенные средства которые могут добавлять build при построении проекта. Так как до этого я не пользовался подобными инструментами, а Delphi как раз оказался под рукой, то попробуем реализовать подобную автоматическую генерацию номера версии.
Исходные данные
Версия нашего продукта будет задаваться следующим образом MAJOR и MINOR задаются программистом, а RELEASE и BUILD задаются автоматически при релизе или отладке соответственно (в нашей статье буде реализован автоинкремент только BUILD'а, а RELEASE оставим для домашнего задания). При реализации будем пользоваться только возможностями фреймворка Qt (в частности Qmake) и системными утилитами Linux (подWindows будем использовать MSYS).
Итак, по порядку
Предполагается что в системе имеется уже установленные фреймворк Qt, а так же система контроля версий Mercurial.
Подготовка системы для Windows:
1. Скачаем MSYS (компонент MinGW, предоставляет win32-порты окружения легковесной Unix-подобной оболочки) и установим его;
Бесспорно глупый вопрос для человека занимающего автоматизацией, зачем вбивать руками то что за тебя может сделать машина. Когда я начал изучать Qt (всего пару месяцев назад), то не нашел инструментов позволяющих это делать. На Delphi (да да, на работе я использую именно это среду) есть встроенные средства которые могут добавлять build при построении проекта. Так как до этого я не пользовался подобными инструментами, а Delphi как раз оказался под рукой, то попробуем реализовать подобную автоматическую генерацию номера версии.
Исходные данные
Версия нашего продукта будет задаваться следующим образом MAJOR и MINOR задаются программистом, а RELEASE и BUILD задаются автоматически при релизе или отладке соответственно (в нашей статье буде реализован автоинкремент только BUILD'а, а RELEASE оставим для домашнего задания). При реализации будем пользоваться только возможностями фреймворка Qt (в частности Qmake) и системными утилитами Linux (подWindows будем использовать MSYS).
Итак, по порядку
Предполагается что в системе имеется уже установленные фреймворк Qt, а так же система контроля версий Mercurial.
Подготовка системы для Windows:
1. Скачаем MSYS (компонент MinGW, предоставляет win32-порты окружения легковесной Unix-подобной оболочки) и установим его;
2. Добавим в переменную среды PATH путь к папке bin пакета MSYS;
3. Открываем файл проекта и добавляем следующий код:
MAJOR = 0
MINOR = 1
RELEASE = 0
BUILD = 12
REVISION = $$system(hg id -n | sed \'s/+//\')
REVISION_HASH = \"$$system(hg id | sed \'s/+ tip//\')\"
REVISION_HASH = '\\"$${REVISION_HASH}\\"'
QMAKE_POST_LINK = gawk -f $${_PRO_FILE_PWD_}/build.gawk $${_PRO_FILE_} > $${_PRO_FILE_}.tmp; cp $${_PRO_FILE_}.tmp $${_PRO_FILE_}; rm $${_PRO_FILE_}.tmp
VERSION = $${MAJOR}.$${MINOR}.$${RELEASE}.$${BUILD}
DEFINES += \
__MAJOR__=\"$${MAJOR}\" \
__MINOR__=\"$${MINOR}\" \
__RELEASE__=\"$${RELEASE}\" \
__BUILD__=\"$${BUILD}\" \
__REVISION__=\"$${REVISION}\" \
__REVISION_HASH__=\"$${REVISION_HASH}\"
...
MINOR = 1
RELEASE = 0
BUILD = 12
REVISION = $$system(hg id -n | sed \'s/+//\')
REVISION_HASH = \"$$system(hg id | sed \'s/+ tip//\')\"
REVISION_HASH = '\\"$${REVISION_HASH}\\"'
QMAKE_POST_LINK = gawk -f $${_PRO_FILE_PWD_}/build.gawk $${_PRO_FILE_} > $${_PRO_FILE_}.tmp; cp $${_PRO_FILE_}.tmp $${_PRO_FILE_}; rm $${_PRO_FILE_}.tmp
VERSION = $${MAJOR}.$${MINOR}.$${RELEASE}.$${BUILD}
DEFINES += \
__MAJOR__=\"$${MAJOR}\" \
__MINOR__=\"$${MINOR}\" \
__RELEASE__=\"$${RELEASE}\" \
__BUILD__=\"$${BUILD}\" \
__REVISION__=\"$${REVISION}\" \
__REVISION_HASH__=\"$${REVISION_HASH}\"
...
4. Создаем скрипт для утилиты Gawk и сохраняем его в файл build.gawk:
{
for (i = 1; i <= NF; ++i) {
if ($i == "BUILD") ++$(i + 2)
}
print($0)
}
for (i = 1; i <= NF; ++i) {
if ($i == "BUILD") ++$(i + 2)
}
print($0)
}
Теперь можно использовать системные описания, определенные в DEFINES в коде самой программы.
Вот что у меня получилось:
Если мой пост будет вам интересен, тогда я напишу продолжение и мы реализуем таки автоматическое увеличение релиза. Так же у меня в планах написать статью про реализацию плагинов в Qt.
Источники
Gawk
Version numbering using QMake
Руководство по использованию qmake