Если вы используете сборку на основе make, вы можете поместить ее в Makefile:
GIT_VERSION := "$(shell git describe --abbrev=4 --dirty --always --tags)"
(см. man git, опишите , что делают переключатели)
затем добавьте это к своим CFLAGS:
-DVERSION=\"$(GIT_VERSION)\"
Тогда вы можете просто ссылаться на версию прямо в программе, как если бы это был #define:
printf("Version: %s\n", VERSION);
По умолчанию это просто печатает сокращенный идентификатор коммита git, но при желании вы можете пометить определенные выпуски чем-то вроде:
git tag -a v1.1 -m "Release v1.1"
тогда он распечатает:
Version: v1.1-2-g766d
, что означает, 2 коммитов после v1.1, с идентификатором git commit, начинающимся с "766d".
Если в вашем дереве есть незафиксированные изменения, к нему добавится "-dirty".
Нет сканирования зависимостей, поэтому вы должны сделать явное make clean
, чтобы принудительно обновить версию. Это может быть решено однако.
Преимущества в том, что он прост и не требует дополнительных сборочных зависимостей, таких как perl или awk. Я использовал этот подход с GNU automake и со сборками Android NDK.