Bash 允许覆盖的变量和;“简单可扩展”吗;?

Bash 允许覆盖的变量和;“简单可扩展”吗;?,bash,variables,makefile,gnu-make,Bash,Variables,Makefile,Gnu Make,关于第73行,我有以下内容: RELEASE ?= $(shell $(UNAME) -r) IS_FEDORA22_i686 = $(shell echo $(RELEASE) | $(EGREP) -i -c "fc22.i686") 它在BSD、Linux(Ubuntu和Fedora)、OSX和Solaris上运行良好。但是,在Cygwin和MinGW上,它会生成以下内容()。Cygwin和MinGW使用Bash shell: /bin/sh: -c: line 0: syntax er

关于第73行,我有以下内容:

RELEASE ?= $(shell $(UNAME) -r)
IS_FEDORA22_i686 = $(shell echo $(RELEASE) | $(EGREP) -i -c "fc22.i686")
它在BSD、Linux(Ubuntu和Fedora)、OSX和Solaris上运行良好。但是,在Cygwin和MinGW上,它会生成以下内容()。Cygwin和MinGW使用Bash shell:

/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"'
根据手册,我想我需要一个变量,如:

RELEASE ?::= $(shell $(UNAME) -r)
如何使变量既可选又可“简单扩展”?

一种方法是:

RELTEXT:=$(<whatever command>)
RELEASE?=$(RELTEXT)
RELTEXT:=$()
发布?=$(RELTEXT)

即使发布版不是简单地可扩展的,但您知道它将始终扩展为固定文本。

您的思路是正确的,谢谢。下面的工作没有任何问题:
RELEASE?=$(shell$(UNAME)-r)
,然后
是_FEDORA22_i686=$(shell echo$RELEASE |$(EGREP)-i-c“fc22.i686”)
(shell命令中的变量没有参数)。我认为这行不通!make将首先展开
$R
宏,生成(大概)一个空字符串。make然后将echo ELEASE |…传递到
$(shell)
。这里的问题不是make。uname的输出包括shell元字符。因此,您需要引用它们来保护它们不受shell的影响。类似于
$(shell echo'${RELEASE}'|…)
(该公式假定
${RELEASE}
中当然没有单引号)。