Автоматическое увеличение номера сборки в Qt Creator

Я хочу иметь переменную (или #define) в источнике С++, которая будет увеличиваться каждый раз, когда я использую Qt Creator для создания исходного кода. Есть ли способ сделать это, возможно, какой-то плагин Qt Creator или аналогичный? Если есть способ сделать это, если я использую "make" в командной строке для сборки?

Ответы

Ответ 1

В вашем .pro файле вы можете создать переменную, содержащую результаты командной строки. Затем вы можете использовать это для создания определения.

BUILDNO = $$(command_to_get_the_build_number)
DEFINES += BUILD=$${BUILDNO}

Если вам просто нужно простое число с добавлением, вы можете использовать довольно простой script:

#!/bin/bash
number=`cat build_number`
let number += 1
echo "$number" | tee build_number #<-- output and save the number back to file

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

Ответ 2

Как я писал ранее после некоторого тестирования, я обнаружил, что исходное решение имеет проблему, поскольку номер версии не обновляется каждый раз, когда выполняется новая сборка. Во многих случаях я редактировал исходный файл, запускал сборку, но все равно получил тот же номер сборки... Процесс сборки просто решил, что ничего не изменилось и пропустил шаг, который бы обновил номер сборки. Сначала я попытался найти способ заставить этот шаг, но не мог понять это. Наконец я решил пойти по-другому. Теперь я использую script для создания файла заголовка build_number.h, который содержит #define BUILD с обновленным номером позади. Итак, Calebs script теперь немного изменен (build_number.sh):

#!/bin/bash
number=`cat build_number`
let number++
echo "$number" | tee build_number #<-- output and save the number back to file
echo "#define BUILD ""$number" | tee ../MyProject/build_number.h

Инкрементное число все еще сохраняется в файле с именем build_number. Я мог бы избежать третьего файла, разобрав сгенерированный заголовочный файл для номера, но решил против него. Обратите внимание, что script и сгенерированный заголовок находятся в каталоге проектов, а файл build_number находится в каталоге сборки. Это не идеально, но я могу жить с ним.

Чтобы собрать все вместе, есть еще кое-что. Сначала сгенерированный заголовочный файл необходимо добавить в проект в Qt Designer... Щелкните правой кнопкой мыши заголовочные файлы и "Добавить существующий файл". Во-вторых, он должен быть включен в С++ файл, где доступ к BUILD внутри внутри... #include "build_number.h"... и последнее, но не менее важное, необходимо внести некоторые изменения в файл проекта (MyProject.pro). Обратите внимание, что я удалил материал из решения Calebs, поэтому мы начинаем с нуля здесь:

build_nr.commands = ../MyProject/build_number.sh
build_nr.depends = FORCE
QMAKE_EXTRA_TARGETS += build_nr
PRE_TARGETDEPS += build_nr

Эти строки (я положил их перед секцией HEADERS) принудительно выполнили выполнение script, который считывает последний номер сборки из build_number, увеличивает его, записывает обратно и также генерирует обновленную версию build_number.h файл. Поскольку эта часть источника проекта добавляет новое значение в код каждый раз.

Есть одна вещь, о которой стоит упомянуть - сейчас процесс строительства никогда не приходит к мнению, что ничего не изменилось. Поэтому, даже если вы оставите свой код без изменений, новый запуск make будет генерировать новый номер версии и построить новый двоичный файл. Старое решение оставило номер при изменении кода, это новое решение заставляет новую сборку, даже когда источник не изменился, поскольку я принудительно изменяю этот файл заголовка. Один бы предпочел что-то промежуточное, но поскольку заголовок включен только в одно место, перестройка происходит очень быстро и не сильно вредит. Но все же, если кто-то знает, как получить лучшее из обоих миров, пожалуйста, посоветуйте. По крайней мере, теперь у меня не будет двух разных двоичных файлов с одинаковым номером версии.

Ответ 3

Стандарт Windows для Joerg Beutel улучшил решение fooobar.com/questions/362148/...:

.pro:

build_nr.commands = build_inc.bat
build_nr.depends = FORCE
QMAKE_EXTRA_TARGETS += build_nr
PRE_TARGETDEPS += build_nr

HEADERS  += build.h

build_inc.bat:

@echo off 
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt
echo #define BUILD %var% >build.h
echo %var%

Использование

#include "build.h"
...
qDebug() << "Build number:" << BUILD;

Ответ 4

Предложение Калеба великолепен, но в моем случае не работает "из коробки". У меня появились некоторые ошибки, и для их исправления потребовалось некоторое чтение. Изменения очень незначительные. Я использовал Qt 4.7 на Ubuntu Linux... Первое изменение, если вы можете поверить, было в оболочке script перейти от let number += 1 в let number++... Обычно я использую/программу Windoze, поэтому я не могу это объяснить, но когда я запускаю script из командной строки (приглашение оболочки) в исходном случае, я получаю сообщения об ошибках, в измененном случае все идет хорошо, а возвращаемые числа возвращаются...

Поскольку он не полностью сообщил Caleb - я использовал build_number.sh как имя оболочки script и сделал другой файл с именем build_number (без .sh) и поставил только нуль внутри, ничего больше.

Последняя и самая неприятная ошибка была исправлена ​​заменой BUILDNO = $$(command_to_get_the_build_number) на BUILDNO = $$system(./build_number.sh) в файле проекта Qt. Обратите внимание на system после $$ и требуемый ./ перед именем файла. Позже это элементарно для обычного пользователя Linux, но не так уж и для пользователя Windows.

Надеюсь, это сделает его более прямым для людей, новых для всего этого, как и я. Вы можете прочитать больше в разделе справки Qt Designer, если вы ищете qmake, включая ссылку на функцию, расширенное использование и т.д.

О, последнее слово... Мне также пришлось изменить DEFINES += -DBUILD=$${BUILDNO} на DEFINES += BUILD=$${BUILDNO}, поэтому -D исчез. Внутри кода на С++ вы должны использовать BUILD, как если бы вы написали #define BUILD 1234 в верхней части файла.

Ответ 5

Здесь решение для Win7 я появилось на основе дескриптора решения. Это решение также позволяет Windows предоставить yer версии #, когда вы щелкните правой кнопкой мыши по вашей цели и выберите "Свойства" | Детали. Он работает в Win7 и, возможно, в самых ранних версиях.

Хорошо, вы делаете yer build_inc.bat:

@echo off
copy /b myapp.rc +,,
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt
echo #define BUILD %var% >build.h

и поместите его в папку yer proj. (copy /b myapp.rc +,, является непостижимым Microsoft-eese для "touch" - для обновления штампа времени файла.) До сих пор так хорошо - так что?!!

Эта часть является необязательной, если вам не нужна версия, закодированная в двоичном формате. Создайте файл .rc, например:

#include "build.h"

1 VERSIONINFO
FILEFLAGS 32
FILEVERSION 1, 0, BUILD, 0
PRODUCTVERSION 1, 0, BUILD, 0
FILEOS 4
FILETYPE 1

{
    BLOCK "StringFileInfo"
    {
        BLOCK "040904B0"
        {
            VALUE "FileDescription", "program"
            VALUE "OriginalFilename", "program.exe"
            VALUE "CompanyName", "you"
            VALUE "FileVersion", "Release"
            VALUE "LegalCopyright", "Copyright (c) 2016, you, fool!"
            VALUE "ProductName", "Yer proggie"
            VALUE "ProductVersion", "Release"
        }
    }
    BLOCK "VarFileInfo"
    {
        VALUE "Translation", 0x0409, 0x04B0
    }
}

Более полномасштабная версия доступна здесь: Версии DLL. BTW: он не будет работать без блока VarFileInfo. Этот .rc используется для таких вещей, как щелчок правой кнопкой мыши и получение этой информации в свойствах | Детали. У меня есть файл M $.rc для этой информации и значок приложения, а также добавить другие ресурсы в Qt Creator в разделе Ресурсы.

Не так необязательно: вот часть, которую я потратил некоторое время на взлом, чтобы найти. В Qt Creator, открыв yer proj, щелкните значок маленького компьютера и поместите его в режим деблокирования. Нажмите "Проекты". Нажмите "Добавить шаг сборки", выберите "Пользовательский шаг процесса" и щелкните значок шляпы "^", пока он не окажется в верхней части списка. Скажем, вы назвали yer.rc, "myapp.rc". Сделайте шаг сборки следующим образом:

Command: cmd.exe
Arguments:/c build_inc.bat
Working Directory: %{CurrentProject:Path}

В то время как версия на основе qmake может хорошо работать из командной строки или инструментов командной строки, вызванных из среды IDE, в Qt Creator предпочтительными являются шаги сборки. Qt Creator фактически не запускает qmake для каждой сборки; но шаги сборки выполняются каждую сборку.

Теперь добавьте это в файл .pro:

RC_FILE +=  myapp.rc

Также добавьте myapp.rc в yer proj. Он появится в разделе "Другие файлы".

Теперь перестроим. Каждая перестройка вызывает прикосновение файла ресурсов, тем самым каждый раз запуская "rc" . В противном случае номер сборки не будет закодирован в двоичное право. Он быстро подходит для меня. Каждое восстановление будет увеличивать это число. Я только потрудился добавить их в сборку "Release"; поэтому отладочные сборки не увеличивают это. Они просто будут использовать номер последней сборки. Я полагаю, вам нужно будет запустить его один раз в выпуске, чтобы избежать ошибки. Это работает без отдельного повторного запуска qmake каждый раз в Qt Creator; и каждый раз дает вам другой номер сборки. Он не вызывает никаких других перекомпиляций. У вас есть накладные расходы на запуск "rc" и привязка каждый раз, в отличие от того, чтобы ничего не делать, если все в актуальном состоянии; но OTOH, я делаю это только для релизов; вы почти всегда ссылаетесь на сборку или запускаете в любом случае; и снова "rc" быстро.

Дополнительно: вы можете перемещать символ препроцессора BUILD, где бы вы ни захотели. #. (Примечание. Вы также можете добавить иконку приложения yer примерно так:

IDI_ICON1 ICON DISCARDABLE "Icons/myicon.ico"

Это заставляет его отображаться в проводнике даже до запуска файла.)

Вы также можете добавить "build.h" к yer proj формально в Qt Creator, включить его в файл, который хотите использовать build # in, и использовать его как строку, например. с:

#include <QDebug>
#include "build.h"

#define STR_EXPAND(tok) #tok
#define STR(tok) STR_EXPAND(tok)

qDebug() << QString("(build ")+STR(BUILD)+")";

Я только заметил побочный эффект: если вы сделаете это так, он будет перестраиваться до каждого запуска в Release. Думаю, это не так уж плохо, чтобы заплатить. Думаю, я всегда могу скопировать промежутки времени в каталог выпуска и запустить его из Explorer; или просто смириться с дополнительной компиляцией моего about.h, запуска "rc" и ссылки с каждым прогоном в выпуске. В этом отношении я мог бы просто создать внешний инструмент для запуска его с помощью сочетания клавиш. Я, конечно, открыт для любых улучшений. На данный момент я не беспокоюсь, так как просто компиляция "about.cpp", запуск "rc" и связь с каждым прогоном не занимает много времени. Тем не менее, люди: автоматические номера сборки!

☮!

Изменить: Необязательно: чтобы увеличить число сборки только при создании или восстановлении проекта, но не при его запуске (даже если сборка всегда будет выполняться в Release), перейдите в раздел Проекты | Построить и запустить | Запустите, нажмите "Добавить шаг развертывания" и выберите "Custom Process Step":

Command: cmd.exe
Arguments: /c if exist build.old copy /y build.old build.txt
Working Directory: %{CurrentProject:Path}

Затем добавьте

copy /y build.txt build.old

после @echo в файле .bat. Даже возможно, хотя и задействовано, создавать пользовательские новые шаблоны проектов: Расширение Qt Creator Manual

Изменить: теперь я работал с одним, а не с двумя настраиваемыми шагами сборки.

Ответ 6

Все решения, которые я видел до сих пор, были чрезмерно запутаны для моих вкусов. Я приготовил довольно простое решение, которое работает кросс-платформой прямо в QtCreator. http://refaqtory.net/blog/?p=34