eddy_em: (Default)
[personal profile] eddy_em
Решил добавить автоинкремент: а то иной раз непонятно, почему прошивка выделывается, если в коде вроде все ОК (оказывается, забыл прошить после последней сборки).
На 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) позволяет пересобрать этот объектный файл до линковки каждый раз, как будет изменяться файл с версией, в итоге в строке справки появится сообщение о номере и дате сборки.

April 2025

S M T W T F S
  1 23 45
67 89101112
13141516171819
20212223242526
27282930   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 22nd, 2025 08:41 pm
Powered by Dreamwidth Studios