Запись информации о версии в файл с использованием Makefile - PullRequest
0 голосов
/ 30 ноября 2018

Я записываю версию FW в файл, а затем читаю ее во время сборки своего проекта через Makefile.Правило SET записывает информацию о версии FW в файл, а GET читает ее из него.

Когда я делаю

make SET FW_VERSION_MAJOR=1 FW_VERSION_MINOR=2 FW_VERSION_PATCH=3 FW_VERSION_REVISION=4
make GET returns 1.2.3.4

Но когда я просто делаю

make SET FW_VERSION_MAJOR=1

make GET возвращает 1...

Чего я хочу достичьесли кто-то хочет сделать make SET и хочет изменить только 1, 2 или 3 параметра из 4 в информации о версии FW, тогда мой version.h файл должен быть в состоянии извлечь оставленную информацию и не должен обновляться с помощьюпустое поле

FILE_CONFIG := path/to/version.h

.PHONY: SET GET

SET: VER_MAJOR ?= $(FW_VERSION_MAJOR)
SET: VER_MINOR ?= $(FW_VERSION_MINOR)
SET: VER_PATCH ?= $(FW_VERSION_PATCH)
SET: VER_REVISION ?= $(FW_VERSION_REVISION)
SET:
        @echo '#define FW_VERSION_MAJOR $(FW_VERSION_MAJOR)\r\n#define 
FW_VERSION_MINOR $(FW_VERSION_MINOR)\r\n#define FW_VERSION_PATCH 
$(FW_VERSION_PATCH)\r\n#define FW_VERSION_REVISION $(FW_VERSION_REVISION)' 
> $(FILE_CONFIG)

GET:

getnum = $(shell sed -n 's/.*$1  *\([0-9*]\)/\1/p' $(FILE_CONFIG))
FW_VERSION := $(call getnum,MAJOR).$(call getnum,MINOR).$(call 
getnum,PATCH).$(call getnum,REVISION)

1 Ответ

0 голосов
/ 01 декабря 2018

Не уверен, что я полностью понимаю, чего вы пытаетесь достичь, но есть несколько вещей, которые нужно исправить в вашем Makefile и примерах:

  1. определения вашей SET -специфической переменной (VER_MAJOR ...) бесполезны
  2. ваше GET правило пусто
  3. в вашем примере используются только номера букв, в то время как ваш макрос getnum извлекает номера версий только из цифр
  4. вы должныопределить FW_VERSION_XXX, если вы хотите использовать их в правиле, когда они не передаются в командной строке

Попробуйте это, возможно:

FILE_CONFIG := version.h

.PHONY: SET GET

SET:
    @echo '#define FW_VERSION_MAJOR $(FW_VERSION_MAJOR)\r\n#define FW_VERSION_MINOR $(FW_VERSION_MINOR)\r\n#define FW_VERSION_PATCH $(FW_VERSION_PATCH)\r\n#define FW_VERSION_REVISION $(FW_VERSION_REVISION)' > $(FILE_CONFIG)

GET:
    @printf '%s\r\n' '$(FW_VERSION)'

getnum = $(shell sed -n 's/.*$1  *\([0-9*]\)/\1/p' $(FILE_CONFIG))
FW_VERSION_MAJOR := $(call getnum,MAJOR)
FW_VERSION_MINOR := $(call getnum,MINOR)
FW_VERSION_PATCH := $(call getnum,PATCH)
FW_VERSION_REVISION := $(call getnum,REVISION)
FW_VERSION := $(FW_VERSION_MAJOR).$(FW_VERSION_MINOR).$(FW_VERSION_PATCH).$(FW_VERSION_REVISION)

Демонстрация:

$ make SET FW_VERSION_MAJOR=1 FW_VERSION_MINOR=2 FW_VERSION_PATCH=3 FW_VERSION_REVISION=4
$ make GET
1.2.3.4
$ make SET FW_VERSION_REVISION=5
$ make GET
1.2.3.5

Примечание: мы можем немного разложить определения FW_VERSION_XXX, а также рецепт SET:

FILE_CONFIG := version.h
VERSIONS    := MAJOR MINOR PATCH REVISION

.PHONY: SET GET

SET:
    @printf '' > $(FILE_CONFIG)
    @$(foreach v,$(VERSIONS),$(call setnum,$(v)))

GET:
    @printf '%s\r\n' '$(FW_VERSION)'

setnum = printf '\#define FW_VERSION_$1 $(FW_VERSION_$1)\r\n' >> $(FILE_CONFIG);
getnum = $(shell sed -n 's/.*$1  *\([0-9*]\)/\1/p' $(FILE_CONFIG))
$(foreach v,$(VERSIONS),$(eval FW_VERSION_$(v) := $(call getnum,$(v))))
FW_VERSION := $(FW_VERSION_MAJOR).$(FW_VERSION_MINOR).$(FW_VERSION_PATCH).$(FW_VERSION_REVISION)
...