在其makefile中引用C代码定义的宏

时间:2019-06-18 07:53:43

标签: c makefile

我正在使用带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中定义版本并在代码中引用它(基本上是相反的方式),但这有两个问题:

  1. 每次更改makefile时,它都会触发整个代码的编译,这需要花费几分钟。

  2. 我有两个单独的构建配置(发布和调试),每个都使用其自己的makefile,这将需要我分别更新这两个配置。

2 个答案:

答案 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

假设您使用的是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)命令中。