我正在使用带arm-gcc和Eclipse的C编写一些嵌入式固件。 我的代码中包含一个定义为宏的固件版本号。 我想将该版本自动添加到构建目标文件中。
为示例起见,假设这是我的main.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中定义版本并在代码中引用它(基本上是相反的方式),但这有两个问题:
每次更改makefile时,它都会触发整个代码的编译,这需要花费几分钟。
我有两个单独的构建配置(发布和调试),每个都使用其自己的makefile,这将需要我分别更新这两个配置。
答案 0 :(得分:2)
我要采取的方法是在Makefile中定义版本号元素,然后使用cflags将其刻录到代码中。
在Makefile中:
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生成-您只需要更改固件版本信息 在一个地方。
答案 1 :(得分:0)
好吧,您必须以一种或另一种方式解析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)
命令中。