我有一个名为" 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中的变量?
谢谢!
答案 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