在其生成文件中引用 C 代码定义的宏



我正在使用带有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 个问题:

  1. 每次我更改生成文件时,它都会触发整个代码的编译,这需要几分钟。

  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

假设您使用的是gccclang

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)命令中。

相关内容

  • 没有找到相关文章

最新更新