Правильный способ кодирования/вставки номера версии в программный код

Я хотел бы вставить свою версию программного обеспечения в свой код и позже извлечь его из двоичного кода программы с помощью команды типа -v или --version. В качестве примера некоторые программные двоичные файлы GNU/Linux печатают информацию о своей версии, если они поставляются с аргументом -v или -v в командной строке, возьмите ls в качестве примера:

$ ls --version
ls (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Есть ли конвенция или стандарт? Я попытался найти эту информацию, но поскольку я не знал правильной терминологии, мой поиск привел только к управлению версиями. Программный код написан на языке С++, если он помогает лучше решить проблему.

Ответ 1

Обычно для основных и младших номеров версий (как 1.2, 1 является основным, а 2 - незначительным), они чаще всего записываются непосредственно в коде, обычно как #define (потому что вам могут понадобиться их для условных компиляций, т.е. блоков #if).

Обычно у вас есть отдельный заголовок, который содержит только те, которые определены, и ничего (кроме защиты заголовка), чтобы минимизировать зависимости.

Некоторые люди используют систему сборки (например, cmake), чтобы вытащить номер версии из управления версиями (git, svn, cvs и т.д.), а затем поместите этот номер версии в свой заголовок "версия". Или они помещают номер версии в файлы конфигурации системы сборки, а затем помещают ее в заголовок, как показано в учебнике cmake. Лично мне не нравится этот подход, потому что он слишком часто изменяет ваши файлы заголовков и вызывает частые и бессмысленные повторные компиляции.

Я предпочитаю записывать номер версии в файл заголовка, а затем вынимать эти номера версий (крупные, второстепенные,..) из заголовка в систему сборки. Это еще одна вещь, которую может легко сделать cmake.

Если вы хотите вставлять в свое программное обеспечение очень ежедневный номер версии, например номер сборки или номер версии, то вы не должны указывать его как #define в файле заголовка, а скорее как extern const, которую вы определяете в одном файле cpp. Например, вы можете использовать cmake, чтобы вытащить номер версии из вашей системы управления версиями, привязать ее к файлу cpp, который определяет эту переменную extern const int revision; (через функцию cmake configure_file), и связывать ваши программы с этим файлом cpp/object, Таким образом, номер версии встроен в ваши программы автоматически при каждой повторной сборке, и он не будет запускать полную перекомпиляцию каждый раз, когда он обновляется (что происходит при каждой фиксации).

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

Ответ 2

Я считаю, что принято хранить номер версии в отдельном заголовочном файле. Некоторые инструменты могут автоматически генерировать это для вас. Например, вот как вы делаете это с CMake: http://www.cmake.org/cmake-tutorial/

См. Раздел "Добавление номера версии и настроенного заголовочного файла"