我正在使用带有arm-gcc和Eclipse的C编写一些嵌入式固件。 在我的代码中有一个定义为宏的固件版本号。 我想将该版本自动附加到构建目标文件中。
为了示例,假设这是我的主.h文件:
#ifndef MAIN_H__
#define MAIN_H__
#define FW_MAJOR_VERSION 1
#define FW_MINOR_VERSION 0
和生成文件:
TARGET := fw_release
OUTPUT_DIR := out
...
generate_pkg:
@gen_pkg $(OUTPUT_DIR)/$(TARGET)_pkg.zip
其中gen_pkg
是用于生成固件更新包的一些脚本。
这将生成如下所示的文件路径:out/fw_release_pkg.zip
理想情况下,我想要这样的东西:
generate_pkg:
@gen_pkg $(OUTPUT_DIR)/$(TARGET)_pkg_v$(FW_MAJOR_VERSION).$(FW_MINOR_VERSION).zip
这将生成如下所示的文件路径:out/fw_release_pkg_v1.0.zip
现在我知道我可以在 makefile 中定义版本并在代码中引用它(基本上相反),但这有 2 个问题:
每次我更改生成文件时,它都会触发整个代码的编译,这需要几分钟。
我有两个单独的构建配置(发布和调试),每个配置都使用自己的 makefile,这需要我分别更新这两个配置。
我采取的方法是在 Makefile 中定义版本号元素,并使用 cflags 将它们刻录到您的代码中。
在生成文件中:
FW_VERSION_MAJOR=1
FW_VERSION_MINOR=1
FW_VERSION_MICRO=0a
FW_VERSION = $(FW_VERSION_MAJOR).$(FW_VERSION_MINOR).$(FW_VERSION_MICRO)
CFLAGS += -DFW_VERSION_MAJOR=$(FW_VERSION_MAJOR)
CFLAGS += -DFW_VERSION_MINOR=$(FW_VERSION_MINOR)
CFLAGS += -DFW_VERSION_MICRO=$(FW_VERSION_MICRO)
debug_build:
$(CC) -DDEBUG=1 $(OBJECTS) -o $(OUTPUT)
release_build:
$(CC) -DDEBUG=0 $(OBJECTS) -o $(OUTPUT)
然后,将正确的版本刻录到调试中是一件相当容易的事情,并且 非调试 PKG 生成 - 您只需更改固件版本信息 在一个地方。
好吧,你必须以一种或另一种方式解析main.h
。
假设您使用的是gcc
或clang
:
generate_pkg: main.h
@gen_pkg "$(OUTPUT_DIR)/$$(echo FW_MAJOR_VERSION/FW_MINOR_VERSION | $(CC) -P -E -include main.h -x c -)_pkg.zip"
如果您的main.h
比这更复杂,则必须将所有$(CFLAGS)
和其他默认选项添加到$(CC)
命令中。