在GNU make中运行grep

7
我需要使用grep查找文本'ifeq ($(Param1)'。我尝试将搜索结果分配给make变量,但问题在于单引号不能转义make中的文本,因此当我尝试执行以下操作时:
GrepResult:= $(shell grep 'ifeq ($$(Param1)' TextFile)

I get:

Makefile:214: *** unterminated call to function `shell': missing `)'.  Stop.

$可以用$$转义,但我如何在makefile中转义括号?谢谢。

注意:$GrepResult 在$(error)函数中使用,而不是在规则命令中使用。


1
我也无法让那个帮助命令起作用。你找到解决方法了吗?$(shell grep ...)?就将grep、awk、sort、pr分别使用小写字母? - tarabyte
2个回答

8
欺骗Make和grep的技巧是将特殊字符偷偷传递。
GrepResult := ${shell grep 'ifeq (\$$(Param1)' TextFile}
Make会将$$转换为$,然后grep将\$转换为$。同时请注意,此赋值使用花括号 "{}" 而不是圆括号 "()",以免被匹配结果混淆。(也许有更加稳健的处理字符串的方式,但是暂且不管它。)
当你使用结果时,请使用单引号:
all:
    @echo '$(GrepResult)'
这同样也可以在$(error...)中使用:
    $(error '$(GrepResult)')
此方法已经在GNUMake 3.81上进行了测试。

1
你真的需要使用 $(shell) 吗?
GrepResult:= `grep 'ifeq (\$$(Param1)' TextFile`

all:
  echo ${GrepResult}

已在GNU Make 3.81上进行过测试。


抱歉,我没有提到,但我使用带有$(error)的grep结果,并且使用反引号只是输出变量内容而不执行命令。 - jackhab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接