我有一个名为" 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
包含意外的文本,它很容易出错。