【问题标题】:Referencing a C code-defined macro within its makefile在其 makefile 中引用 C 代码定义的宏
【发布时间】:2019-06-18 07:53:43
【问题描述】:

我正在使用 C 和 arm-gcc 和 Eclipse 编写一些嵌入式固件。 在我的代码中是定义为宏的固件版本号。 我想将该版本自动附加到构建目标文件中。

为了举例,假设这是我的 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,这需要我分别更新这两个配置。

【问题讨论】:

  • 也许您可以在Makefiles 中包含include version.make...
  • 如果您使用的是GNUmake,那么您的两个问题就不存在了,因为您可以轻松地包含具有适当依赖关系的真实版本文件。以你的方式做(从源代码中检索)应该只在......好吧我什至想不出应该做的情况。版本编号是一个核心问题,在抽象阶梯上比某些常量高一级。

标签: c makefile


【解决方案1】:

我会采取的方法是在 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 生成 - 您只需更改固件版本信息 在一个地方。

【讨论】:

  • 您还可以添加一个“version.h”文件,您可以在其中检查这些是否已定义 - 对 IDE 有帮助...此外,版本可以从单独的 include-d文件。
【解决方案2】:

好吧,你必须以一种或另一种方式解析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) 命令。

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 2011-07-15
    • 2020-12-03
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多