27 августа 2013 г.

Версия приложения через makefile прямиком из git

Так как код я держу в той или иной VCS (последнее время чаще всего в git) я подумал, что было бы круто версию приложений брать из репозитория, а конкретно — из тегов. Для небольших утилит особенно удобно. Некоторые похожие решения из интернета натолкнули меня на такое решение. Всё довольно просто, пример для обычного gnu-makefile и исходника на Си.
Makefile
...
ifeq ($(origin VER), command line)
 VERSION := $(VER)
else
 VERSION := $(shell git describe --abbrev=4 --dirty --always)
endif
CFLAGS += -DVERSION=\"$(VERSION)\"
...
И, собственно, всё. Потом в исходнике используем предопределённый уже для этого исходника макрос VERSION. Чтобы слишком умные IDE не ругались и чтобы на всякий случай компилировалось и без -DVERSION, желательно защититься через ifndef:
...
#ifndef VERSION
#define VERSION "unknown"
#endif
...
printf("%s \n", VERSION);
...
Версия берётся из последнего доступного тега текущей ветки. По умолчанию git describe берёт только аннотированные теги. Если же тег не на последнем коммите в ветке, то версия будет в формате "0.1-3-g828ba", для грязных исходников версия выглядит так (см. ключ --dirty): "0.1-3-g828ba-dirty". Короче, смотреть справку по git describe. Можно задать версию из командной строки при сборке через make:
make VER=0.666

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

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