在makefile中:从其他文本文件中读取版本,并将结果放入makefile中的变量中



我有一个名为" version.h"的文件,其内容:

#define APP_VERSION_MAJOR   5
#define APP_VERSION_MINOR   6
#define APP_VERSION_PATCH   0

我有一个makefile,我想根据" version.h"文件在makefile中分配一个变量,在这种情况下:

MY_APP_VERSION = 5.6.0

我设法通过以下命令找到了行:

@echo "The result is: $$(grep "#define APP_VERSION_MINOR    " Version.h)"

输出:

The result is: #define APP_VERSION_MINOR    6

那么,如何将版本放在makefile中的变量中?

谢谢!

要设置一个制造变量,您可以做这样的事情:

getnum = $(shell sed -n 's/.*$1  *([0-9*])/1/p' Version.h)
MY_APP_VERSION := $(call getnum,MAJOR).$(call getnum,MINOR).$(call getnum,PATCH)

这确实调用了SED 3次。

尝试将其放置是您的makefile:

all:
    @echo The result is: 
    $$(grep '#define APP_VERSION_MAJOR' Version.h | cut -d' ' -f5).
    $$(grep '#define APP_VERSION_MINOR' Version.h | cut -d' ' -f5).
    $$(grep '#define APP_VERSION_PATCH' Version.h | cut -d' ' -f5)

然后简单的make给您

$ make
The result is: 5.6.0

如果您设法在文件中读取变量(我的" make"版本无法使用$(file < version.h)读取,但您的版本可能会起作用),则可以使用GNU MAKE TABLE TOOLKIT。它是为此目的而设计的:

include gmtt.mk
tbl := 3 $(strip $(file < version.h)) # make a table with 3 columns from the file
versions := $(strip $(call select,3,$(tbl),t)) # select 3rd column from table, t(rue) as where-clause
MY_APP_VERSION := $(subst $(space),.,$(versions))

文件必须遵守您上面显示的格式,以便可以将其解释为具有三列的表。它具有您不必照顾哪个外壳(例如在Windows上)的额外好处。

尝试类似:

APP_VERSION_MAJOR := $(shell awk '// { if ($$2 = 'APP_VERSION_MAJOR) { print $$3 } }' < Version.h)

:=抑制了shell命令的重复扩展,awk命令提取分配的值。

使用更新的GNU制作版本,这也应该起作用(假设Version.h不使用选项卡):

$(foreach i, 
  $(shell sed 's/#define ([^ ]*)  *([^ ]*)/1:=2/' < Version.h), 
  $(eval $i))

它具有一个优势,它将翻译许多预处理器,无论具体细节是什么,但是如果Version.h包含意外的文本,它很容易出错。

最新更新