如何在 Makefile 中的 shell 命令中使用 echo?

如何在 Makefile 中的 shell 命令中使用 echo?

我有一个GNU 生成文件它在 Linux、Solaris 和 OS X 上运行良好。然而,在 Cygwin-32、Cygwin-64 和 MinGW 下,它会产生:

/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `echo 2.0.4(0.287/5/3) | egrep -i -c "fc22.i686"'

没有第 0 行;而针对 Fedora 22 的测试实际上发生在第 73 行:

IS_FEDORA22_i686 = $(shell echo $(RELEASE) | $(EGREP) -i -c "fc22.i686")

Cygwin 和 MinGW 发生了什么?更重要的是,我该如何修复它?


我知道这听起来有点夸张,所以这里是屏幕截图。左上角是 MinGW。中间是 Cygwin-32。右下角是 Cygwin-64。

在此处输入图片描述

答案1

问题在于,shell 认为括号位于$RELEASE任何引号之外,因此尝试解释它们。可以尝试以下两种方法:将引用括在双引号中$(RELEASE),并使用:=per。 例如:

SHELL:=/bin/bash.  #at the top of the makefile
IS_FEDORA22_i686 := $(shell echo "$(RELEASE)" | $(EGREP) -i -c "fc22.i686")

编辑: 尤纳姆带有开关的输出-m通常没有任何 shell 元字符。任何带有元字符的变量都可能出现同样的问题。这就是为什么SHELL在 makefile 中设置很有用的原因 - 如果用户正在运行csh,您将遇到与不同的问题bash

相关内容