Сводный список записей блога

--->>>> Сводный список записей блога <<<<---

29 января 2022

Автоинкремент версии при компиляции C/C++ проекта


Несмотря на то, что в современных IDE есть встроенные средства инкремента номера версии, мне захотелось чего то своего, с девочками и преферансом. Ибо то, что предоставляется - это зачастую числовое значение, которое просто увеличивается от 1 и до упора. А хочется, например, строковую константу, да со своим форматом. Да с возможностью изменения/сброса в любой момент.

Я хочу просто где то в отдельном .h-файле записать строчку типа

#define FIRMWARE_VERSION        "1.01.0001"

и что бы при каждой компиляции (или не при каждой) проекта последняя часть версии (0001) увеличивалась на 1. Причем не важно, строковый это дефайн будет или числовой (без кавычек).

Ну и за вечер накидал я себе некую консольную программку.

В качестве параметров в программку передается полное имя файла и имя дефайна.

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

Ключ /F. Обязательный.
Тут необходимо задать имя и полный путь файла с дефайном версии. Если студия позволяет использовать макросы подстановки пути к проекту - хорошо. Не позволяет - пишем полный путь. Если путь к файлу содержит пробел - ключ со строкой надо взять в кавычки: 
/F=c:\My projects\version.h"

Ключ /D. Обязательный.
Тут указывается имя дефайна с версией.
/D=FIRMWARE_VERSION

Ключ /A. Необязательный, может быть несколько.
В качестве параметра этого ключа задается имя и полный путь контролируемого файла (как в ключе /F).
При наличии этого ключа программа добавит в файл с дефайном комментарий определенного формата, в следующей после дефайна строке.
В этом комментарии будет указано имя контролируемого файла и дата изменения этого файла.

При вызове утилита проверяет (при наличии ключа /A) даты файлов, если файлы не изменялись - ничего не происходит.
Если хотя бы один файл изменен или ключ /A в параметрах отсутствует - номер версии будет увеличен на 1.

Запуск утилиты удобно настроить в Post build events.
Тогда номер версии будет увеличен только при успешной компиляции проекта. Минус - номер версии будет изменен в файле после компиляции проекта, т.е. в проекте номер версии будет на 1 меньше.

Можно запуск поставить в Pre-build events - тогда в проекте всегда будет актуальный номер версии. Минус - версия будет увеличиваться при каждой компиляции проекта, даже неуспешной.

Пример файла:

Утилита найдет дефайн, вычленит из него последнюю числовую часть и сохранит обратно, увеличив эту часть на 1.

Собственно - сама утилита тут. Утилита в архиве. Symantec и Defender молчат. Ибо там ничего подозрительного нет.

Вывод производится в консоль, можно посмотреть результат выполнения.


Как подключить утилиту на примере Atmel/Microchip Studio:

В свойствах проекта:


Макрос $(SolutionDir) подставляет в текст полный путь к проекту, включая завершающий слеш. Если путь содержит пробелы - ключ с параметром надо брать в "кавычки".

В Atollic TrueSTUDIO почти так же - в свойствах проекта:


4 комментария:

  1. Весьма интересная идея!

    ОтветитьУдалить
  2. Классная полезная штука!

    ОтветитьУдалить
  3. Привет, неплохо бы еще добавить к версии дату и ремя

    ОтветитьУдалить
    Ответы
    1. дата и время есть в стандартньіх макросах си
      __DATE__
      __TIME__

      Удалить

======= !!! ВНИМАНИЕ !!! ======================================================================
Гугл умный и боится спама. Поэтому иногда ваши комментарии Гугл отправляет мне на премодерацию. Отправлять или нет - решаю не я, а алгоритмы Гугла. Если ваш комментарий не появился сразу, значит я получу уведомление и опубликую ваш комментарий через некоторое время. Я стараюсь это делать достаточно оперативно.