我有一个打印消息的perl脚本。这个脚本由GNU make调用。在我的GNU make中,我想显示由脚本打印出的消息并将其存储在变量中。
我这样做。
result=`$(PERL) parse.pl report.log` #parse the report
echo $(result) #echo the message here
ifneq ($(strip $$(result)),) #check if message is empty
#if not empty, search for filepath string pattern and exit
echo filepath
exit 1
endif
但它没有显示来自parse.pl的字符串消息。
答案 0 :(得分:1)
你正在捕获一个shell变量,但后来尝试回显一个makefile变量(即使你试图回应shell变量,那也不会起作用,因为make在一个单独的shell进程中运行每一行)。
更改它以回显shell varible并且所有在一个shell中运行应该可以工作:
foo:
result=`$(PERL) parse.pl report.log`; \
echo $$result
但是你以后需要做的就是使用捕获的结果也需要在同一个shell执行中。
显然你也可以捕获到一个makefile变量,这可能更方便:
foo:
$(eval result := $(shell $(PERL) parse.pl report.log))
echo $(result)
答案 1 :(得分:0)
首先要记住make的重要一点,即在运行任何规则之前解析整个makefile,然后在makefile中有两个完全不同的语法:大部分makefile语法和shell语法食谱。 shell语法由shell运行,而不是由make:make只启动一个shell,移交配方,然后等待shell退出以查看它是否有效。
因此,你不能将像ifeq
这样的make结构与shell命令及其结果结合起来:它无法工作,因为所有的make构造都是先解析的,而makefile是在读取的,而shell命令直到很久以后,才会建立目标。
在您的情况下,您需要使用 shell 语法编写整个内容,因为您希望事情依赖于shell调用。
所以,就像这样:
foo:
result=`$(PERL) parse.pl report.log`; \
echo $$result; \
if [ "$$result" = "" ]; then \
echo filepath; \
exit 1; \
fi
注意每行以反斜杠结尾,因此它附加到前一行而不是单独的行:make在不同的shell中运行每个单独的行。
或者,如果你有足够新的GNU make,你可以使用one shell功能:
.ONESHELL:
foo:
result=`$(PERL) parse.pl report.log`
echo $$result
if [ "$$result" = "" ]; then
echo filepath
exit 1
fi