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) позволяет пересобрать этот объектный файл до линковки каждый раз, как будет изменяться файл с версией, в итоге в строке справки появится сообщение о номере и дате сборки.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org

May 2025

S M T W T F S
    123
45678910
11121314151617
1819202122 2324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 23rd, 2025 10:12 pm
Powered by Dreamwidth Studios