使用 Makefile 将版本信息写入文件

Writing version info to a file using Makefile

我正在将固件版本写入一个文件,然后在通过 Makefile 构建我的项目时读取它。 SET 规则将固件版本信息写入文件,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 returns 1...

我想要实现的是,如果有人想做 make SET 并且只想更改 FW 版本信息中 4 个参数中的 1 个或 2 个或 3 个参数,那么我的 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/.*  *\([0-9*]\)//p' $(FILE_CONFIG))
FW_VERSION := $(call getnum,MAJOR).$(call getnum,MINOR).$(call 
getnum,PATCH).$(call getnum,REVISION)

不确定我是否完全理解您要实现的目标,但您的 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/.*  *\([0-9*]\)//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_ $(FW_VERSION_)\r\n' >> $(FILE_CONFIG);
getnum = $(shell sed -n 's/.*  *\([0-9*]\)//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)