使用 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 和示例中有几处需要修复:
- 您的
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/.* *\([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)
我正在将固件版本写入一个文件,然后在通过 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 和示例中有几处需要修复:
- 您的
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/.* *\([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)