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

时间:2017-11-26 15:19:44

标签: bash 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中的变量?

谢谢!

4 个答案:

答案 0 :(得分:2)

要设置make变量,您可以执行以下操作:

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次。

答案 1 :(得分:0)

尝试类似:

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

:=禁止重复扩展shell命令,awk命令提取赋值的值。

使用更新的GNU make版本,这也应该有效(假设Version.h没有使用标签):

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

它的优势在于它可以一次性翻译许多预处理器定义,无论具体是什么,但如果Version.h包含意外文本,则很容易出错。

答案 2 :(得分:0)

如果您设法将文件读入变量(我的make版本无法使用$(file < version.h)阅读,但您的版本可能有效),那么您可以使用the 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))

该文件必须遵循您在上面显示的格式,以便可以将其解释为包含三列的表。它还有一个额外的好处,就是您无需关心哪个shell(例如在Windows上)可用。

答案 3 :(得分:-1)

尝试把这个作为你的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