使用shell函数时缺少分隔符?

使用shell函数时缺少分隔符?,shell,makefile,solaris,gnu-make,sunstudio,Shell,Makefile,Solaris,Gnu Make,Sunstudio,我正在使用Solaris 11,完全修补。我试图通过在ISA下转储预处理器宏来确定编译器是否支持ISA 由于缺少分隔符,Make正在消亡。当与GNU make一起使用时,我很难找到有关缺少分隔符的信息 这是简化的情况。没有空格,所以不像在和朋友中那样是空格/选项卡问题 $cat-n GNUmakefile测试 1鹭?=鹭 2 SUN|u编译器:=$(shell$(CXX)-v2>&1 |$(EGREP)-i-c“CC:(SUN| Studio)”) 3. 4#开始SunCC 5 ifeq($(S

我正在使用Solaris 11,完全修补。我试图通过在ISA下转储预处理器宏来确定编译器是否支持ISA

由于
缺少分隔符,Make正在消亡。当与GNU make一起使用时,我很难找到有关
缺少分隔符的信息

这是简化的情况。没有空格,所以不像在和朋友中那样是空格/选项卡问题

$cat-n GNUmakefile测试
1鹭?=鹭
2 SUN|u编译器:=$(shell$(CXX)-v2>&1 |$(EGREP)-i-c“CC:(SUN| Studio)”)
3.
4#开始SunCC
5 ifeq($(SUN_编译器),1)
6$(信息“Sun编译器”)
7$(shell$(CXX)$(CXXFLAGS)-E-xarch=ssse3-xdumpmacros/dev/null 2>/dev/null)
8 ifeq($(.SHELLSTATUS),0)
9美元(信息“SSSE3”)
10 SSSE3_标志=-xarch=SSSE3-D_uSSSE3_uu=1
11 endif
12 endif
13#完SunCC
14
15所有:
16美元(信息“不做任何事”)
上面的想法是,SunCC不为ISA提供宏,如
\uuuuu AES\uuuuu
\uuuu SHA\uuuu
。但是,如果不支持ISA,SunCC将出错,如SunCC 12.4上的
-xarch=sha
。如果我没有得到错误,那么我知道编译器支持ISA,比如SUNCC12.4上的
-xarch=aes
。如果有错误,我可以从中提取。(SunCC在这方面与Clang、GCC、Intel ICC或MSVC不同)

结果如下:

$CXX=/opt/solaristudio12.4/bin/CC gmake-f GNUmakefile测试
“Sun编译器”
GNUmakefile测试:7:**缺少分隔符。停止
丢失的分隔符在哪里?或者,不报告的真正错误是什么?也许是别的什么


我很抱歉问了这个问题,因为它以前被问过多少次

我添加标签是为了安抚make。它产生了同样的错误

$cat-n GNUmakefile测试
1鹭?=鹭
2 SUN|u编译器:=$(shell$(CXX)-v2>&1 |$(EGREP)-i-c“CC:(SUN| Studio)”)
3.
4#开始SunCC
5 ifeq($(SUN_编译器),1)
6$(信息“Sun编译器”)
7$(shell$(CXX)$(CXXFLAGS)-E-xarch=ssse3-xdumpmacros/dev/null 2>/dev/null)
8 ifeq($(.SHELLSTATUS),0)
9美元(信息“SSSE3”)
10 SSSE3_标志=-xarch=SSSE3-D_uSSSE3_uu=1
11 endif
12 endif
13#完SunCC
14
15所有:
16美元(信息“不做任何事”)

shell
功能的工作方式(如手册中所述)是运行命令,然后扩展到命令的输出。这就是为什么,当你看到:

SUN_COMPILER := $(shell $(CXX) -V 2>&1 | $(EGREP) -i -c "CC: (Sun|Studio)")
变量
SUN\u COMPILER
设置为该shell命令的输出

所以当你写这篇文章时:

$(shell $(CXX) $(CXXFLAGS) -E -xarch=ssse3 -xdumpmacros /dev/null 2>/dev/null)
运行命令,然后替换输出。之后,make尝试将结果解析为make语法。但是该命令的输出显然不是make语法,所以您会得到这个错误

如果您不关心输出,而只关心退出代码,则需要丢弃输出:

$(shell $(CXX) $(CXXFLAGS) -E -xarch=ssse3 -xdumpmacros /dev/null >/dev/null 2>&1)
或者将其分配给虚拟变量:

_x := $(shell $(CXX) $(CXXFLAGS) -E -xarch=ssse3 -xdumpmacros /dev/null 2>/dev/null)

因此make将结果分配给变量,而不是认为它是make语法。

shell函数的工作方式(如手册中所述)是运行命令,然后扩展到命令的输出。这就是为什么,当你看到:

SUN_COMPILER := $(shell $(CXX) -V 2>&1 | $(EGREP) -i -c "CC: (Sun|Studio)")
变量
SUN\u COMPILER
设置为该shell命令的输出

所以当你写这篇文章时:

$(shell $(CXX) $(CXXFLAGS) -E -xarch=ssse3 -xdumpmacros /dev/null 2>/dev/null)
运行命令,然后替换输出。之后,make尝试将结果解析为make语法。但是该命令的输出显然不是make语法,所以您会得到这个错误

如果您不关心输出,而只关心退出代码,则需要丢弃输出:

$(shell $(CXX) $(CXXFLAGS) -E -xarch=ssse3 -xdumpmacros /dev/null >/dev/null 2>&1)
或者将其分配给虚拟变量:

_x := $(shell $(CXX) $(CXXFLAGS) -E -xarch=ssse3 -xdumpmacros /dev/null 2>/dev/null)

因此make将结果分配给一个变量,而不是认为它是make语法。

我们决定避免使用
.SHELLSTATUS
,因为它似乎有一些问题。我们回到
grep
和字符串
“非法值被忽略”


我们不确定。目前,我们正在努力找出需要什么。

我们决定避免使用
.SHELLSTATUS
,因为它似乎有一些问题。我们回到
grep
和字符串
“非法值被忽略”


我们不确定。目前,我们正试图找出需要什么。

非常稀疏,但我会尝试消除
2>
重定向,看看这是否是问题的原因。非常稀疏,但我会尝试消除
2>
重定向,看看这是否是问题的原因。谢谢@madscitifist。为了清楚起见,我在提问之前查阅了手册。本手册未说明这些要求。但是,它确实说我可以使用
.SHELLSTATUS
。(这个无用的错误消息是怎么回事?可能已经坏了好几年了。)
shell
功能的工作方式(如手册中所述)。。。文档中没有明确说明扩展的结果很可能作为命令执行。简单地说,“shell
函数执行的功能与反引号(“`”)在大多数shell中执行的功能相同:它执行命令扩展……”我不确定“无用的错误消息”是什么意思。这就是make在无法理解makefile的行时给出的错误消息。由于makefile的自由格式语法,make所能说的就没有那么多了。手册中的内容与我所说的一模一样:
shell
函数的计算结果是命令的输出。与任何函数一样,结果的解释方式取决于引用在makefile中出现的位置。诚然,如果不理解本章关于GNU如何使函数工作的其余部分,单独阅读可能并不完全清楚。谢谢@MadScientist。为了清楚起见,我在提问之前查阅了手册。手册中没有说明这些问题