среда, 30 марта 2011 г.

Автоматическая генерация номера версии проекта в Qt

Зачем это нужно?

Бесспорно глупый вопрос для человека занимающего автоматизацией, зачем вбивать руками то что за тебя может сделать машина. Когда я начал изучать 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}\"
      ...

              4. Создаем скрипт для утилиты Gawk и сохраняем его в файл build.gawk:

      {
          for (i = 1; i <= NF; ++i) {
              if ($i == "BUILD")  ++$(i + 2)
          }
          print($0)
      }

      Теперь можно использовать системные описания, определенные в DEFINES в коде самой программы.

      Вот что у меня получилось:



      Если мой пост будет вам интересен, тогда я напишу продолжение и мы реализуем таки автоматическое увеличение релиза. Так же у меня в планах написать статью про реализацию плагинов в Qt.

      Источники

      Gawk
      Version numbering using QMake
      Руководство по использованию qmake

      Комментариев нет:

      Отправить комментарий