从C源文件将一组变量读入Makefile?

从C源文件将一组变量读入Makefile?,c,makefile,avr,C,Makefile,Avr,我有一个AVR8GCC应用程序,可以用标准的makefile构建。因为一些想要构建应用程序的人不想设置make之类的东西,或者在这样做时遇到困难,所以我还找到了如何设置项目,以便也可以从Arduino IDE编译它 一切正常 但是,我通常在makefile中设置一些项,比如版本号等等,但是在makefile中创建版本字符串并将其作为定义传递到每个源文件编译中。但是,当从ArduinoIDE运行时,这一步显然不会发生。因此,我必须在Arduino草图存根中创建第二个define来重新创建defin

我有一个AVR8GCC应用程序,可以用标准的makefile构建。因为一些想要构建应用程序的人不想设置make之类的东西,或者在这样做时遇到困难,所以我还找到了如何设置项目,以便也可以从Arduino IDE编译它

一切正常

但是,我通常在makefile中设置一些项,比如版本号等等,但是在makefile中创建版本字符串并将其作为定义传递到每个源文件编译中。但是,当从ArduinoIDE运行时,这一步显然不会发生。因此,我必须在Arduino草图存根中创建第二个define来重新创建define

这意味着当我更新版本时,我需要在makefile和源文件的两个位置进行更新

简单的选择是将版本创建移动到源文件,两者都可以使用它。我可以这么做,但是

makefile实际上需要版本信息,既要创建正确的文件名think app_v1.2.3.4.bin,又要将版本号嵌入到bin文件中,因为如果需要,引导加载程序会使用该文件,以确保引导加载程序刷新的版本比FLASH中已有的版本更新。因此,如果我将版本、发布、修改等定义移动到C代码中,我需要找到一种方法将它们拉回到makefile中

我尝试在makefile中使用文件读取操作,但它们似乎忽略了:

#define VERSION 0
用前面的字符

我看到在bash中有一些选项可以运行sed/awk/etc,但我不想对环境做太多假设,而且makefile目前运行在Windows和Unix/Linux上,没有任何区别

我尝试了几个堆栈溢出示例,但似乎没有从任何文件、.h或其他文件中生成这4个数字

我可以创建version.h,只需:

#define VERSION      0
#define RELEASE      1
#define MODIFICATION 2
#define FIX          4
如果我能将它读入makefile并创建所需的变量


Jim

我认为在这种情况下,您可以使用makefiles的“file”功能。 它允许您使用>说明符写入文件或使用<说明符读取文件。然后,您可以使用过滤器修剪makefile中的变量。 来源:

您可以使用GNU make的$shell。。。函数提取宏展开。假设在src.c中定义了版本,并且标记由空格而不是制表符分隔:

VERSION := $(shell sed -n -e "s/^\#define VERSION  *\(.*\)/\1/p" src.c)

.PHONY: all
all:
    @echo VERSION=$(VERSION)
您可以看一看哪一个是根据您的用例设计的。在gmtt中,应读取并分析您的头文件:

include gmtt.mk

# create a 3-column table from the header file. The first column is just the "#define"
VNR_TABLE := 3 $(file < version.h)

# Extract the values from the table: select column 3 from VNR_TABLE where column 2 equals a string constant. 
# Be careful not to introduce spaces in the compare!
VER := $(call select,3,$(VNR_TABLE),$$(call str-eq,$$2,VERSION))
REL := $(call select,3,$(VNR_TABLE),$$(call str-eq,$$2,RELEASE))
MODF := $(call select,3,$(VNR_TABLE),$$(call str-eq,$$2,MODIFICATION))
FIX := $(call select,3,$(VNR_TABLE),$$(call str-eq,$$2,FIX))
我无法测试,但我想你明白了


PS:使用GNUmake库只意味着将包含的文件放在makefile旁边。

您使用的是GNU make还是其他make?我使用的是GNU make重新阅读您的问题,您使用的是什么make版本?文件函数仅适用于4.2及以上版本正如我在上面的问题中提到的,我已经尝试了文件函数$file