Автоинкремент версии сборки
Nov. 14th, 2021 12:33 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Решил добавить автоинкремент: а то иной раз непонятно, почему прошивка выделывается, если в коде вроде все ОК (оказывается, забыл прошить после последней сборки).
На SO предлагается уйма вариантов. Один из них — указание цели $(VERSION_FILE) как .PHONY — плох тем, что вызывает полную пересборку всех файлов каждый раз, как что-то одно изменилось. В другом, где предлагается засунуть эту цель в .SECONDEXPANSION, вообще версия генерируется вторым запуском make, т.е. в текущую сборку попадает предыдущее содержание этого файла.
Я, как обычно, сделал своим самобытным путем: через задницу.
Итак, в начале Makefile задаем определения:
Файлу с нужными дефайнами я специально дал суффикс .inc, чтобы не было циклических зависимостей. Вот его содержимое:
Этот файл нужен лишь в strfunc.c, но вот генерироваться должен при любых изменениях в других файлах. Т.о. перед целью сборки (куда добавляем явно make $(VERSION_FILE)):
и задаем нашу цель:
Цели $(VERSION_FILE) обязательно в зависимости нужно поставить все исходники, иначе она просто не пересоберется, даже будучи вызванной явно. Ее нельзя указать в секции .PHONY, т.к. в этом случае она будет пересобираться даже если ни один файл не изменился.
Указание явной зависимости объекта strfunct.o от $(VERSION_FILE) позволяет пересобрать этот объектный файл до линковки каждый раз, как будет изменяться файл с версией, в итоге в строке справки появится сообщение о номере и дате сборки.
На SO предлагается уйма вариантов. Один из них — указание цели $(VERSION_FILE) как .PHONY — плох тем, что вызывает полную пересборку всех файлов каждый раз, как что-то одно изменилось. В другом, где предлагается засунуть эту цель в .SECONDEXPANSION, вообще версия генерируется вторым запуском make, т.е. в текущую сборку попадает предыдущее содержание этого файла.
Я, как обычно, сделал своим самобытным путем: через задницу.
Итак, в начале Makefile задаем определения:
VERSION_FILE = version.inc NEXTVER := $(shell expr $$(awk '/#define BUILD_NUMBER/' $(VERSION_FILE) | tr -cd "[0-9]") + 1) BUILDDATE := $(shell date +%Y-%m-%d)
Файлу с нужными дефайнами я специально дал суффикс .inc, чтобы не было циклических зависимостей. Вот его содержимое:
#define BUILD_NUMBER "12" #define BUILD_DATE "2021-11-14"
Этот файл нужен лишь в strfunc.c, но вот генерироваться должен при любых изменениях в других файлах. Т.о. перед целью сборки (куда добавляем явно make $(VERSION_FILE)):
$(OBJDIR)/%.o: %.c @make $(VERSION_FILE) @echo " CC $<" $(CC) $(CFLAGS) $(DEFS) $(INCLUDE) $(ARCH_FLAGS) -o $@ -c $<
и задаем нашу цель:
$(VERSION_FILE): *.[ch] @echo "Generate version: $(NEXTVER) for date $(BUILDDATE)" @sed -i "s/#define BUILD_NUMBER.*/#define BUILD_NUMBER \"$(NEXTVER)\"/" $(VERSION_FILE) @sed -i "s/#define BUILD_DATE.*/#define BUILD_DATE \"$(BUILDDATE)\"/" $(VERSION_FILE) $(OBJDIR)/strfunct.o: strfunct.c $(VERSION_FILE)
Цели $(VERSION_FILE) обязательно в зависимости нужно поставить все исходники, иначе она просто не пересоберется, даже будучи вызванной явно. Ее нельзя указать в секции .PHONY, т.к. в этом случае она будет пересобираться даже если ни один файл не изменился.
Указание явной зависимости объекта strfunct.o от $(VERSION_FILE) позволяет пересобрать этот объектный файл до линковки каждый раз, как будет изменяться файл с версией, в итоге в строке справки появится сообщение о номере и дате сборки.