Не уверен, что я полностью понимаю, чего вы пытаетесь достичь, но есть несколько вещей, которые нужно исправить в вашем Makefile и примерах:
- определения вашей
SET
-специфической переменной (VER_MAJOR
...) бесполезны - ваше
GET
правило пусто - в вашем примере используются только номера букв, в то время как ваш макрос
getnum
извлекает номера версий только из цифр - вы должныопределить
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)