jww*_*jww 1 shell solaris makefile gnu-make sunstudio
我正在开发 Solaris 11,已打完补丁。我试图通过在 ISA 下转储预处理器宏来确定编译器是否支持 ISA。
Make 由于Missing Separator. Missing Separator当与 GNU make 的shell 函数一起使用时,我无法找到有关错误的信息。
这是简化的情况。没有空格,因此它不是像“ Make error:缺少分隔符和朋友”中那样的空格/制表符问题。
$ cat -n GNUmakefile-test
1 EGREP ?= egrep
2 SUN_COMPILER := $(shell $(CXX) -V 2>&1 | $(EGREP) -i -c "CC: (Sun|Studio)")
3
4 # Begin SunCC
5 ifeq ($(SUN_COMPILER),1)
6 $(info "Sun compiler")
7 $(shell $(CXX) $(CXXFLAGS) -E -xarch=ssse3 -xdumpmacros /dev/null 2>/dev/null)
8 ifeq ($(.SHELLSTATUS),0)
9 $(info "SSSE3")
10 SSSE3_FLAG = -xarch=ssse3 -D__SSSE3__=1
11 endif
12 endif
13 # End SunCC
14
15 all:
16 $(info "Do nothing")
Run Code Online (Sandbox Code Playgroud)
上面的想法是,SunCC 不提供 ISA 的宏,例如__AES__或__SHA__。但是,如果不支持 ISA,SunCC 将会出错,例如-xarch=sha在 SunCC 12.4 上。如果我没有收到错误,那么我就知道编译器支持 ISA,就像-xarch=aes在 SunCC 12.4 上一样。如果有错误我可以从 获取它.SHELLSTATUS。(SunCC 在这方面与 Clang、GCC、Intel ICC 或 MSVC 不同)。
结果如下:
$ CXX=/opt/solarisstudio12.4/bin/CC gmake -f GNUmakefile-test
"Sun compiler"
GNUmakefile-test:7: *** missing separator. Stop.
Run Code Online (Sandbox Code Playgroud)
缺少的分隔符在哪里?或者, make没有报告的真正错误是什么?也许还有别的事?
考虑到这个问题之前被问过多少次,我很抱歉问这个问题。
我添加了选项卡以试图安抚 make。它产生了同样的错误。
$ cat -n GNUmakefile-test
1 EGREP ?= egrep
2 SUN_COMPILER := $(shell $(CXX) -V 2>&1 | $(EGREP) -i -c "CC: (Sun|Studio)")
3
4 # Begin SunCC
5 ifeq ($(SUN_COMPILER),1)
6 $(info "Sun compiler")
7 $(shell $(CXX) $(CXXFLAGS) -E -xarch=ssse3 -xdumpmacros /dev/null 2>/dev/null)
8 ifeq ($(.SHELLSTATUS),0)
9 $(info "SSSE3")
10 SSSE3_FLAG = -xarch=ssse3 -D__SSSE3__=1
11 endif
12 endif
13 # End SunCC
14
15 all:
16 $(info "Do nothing")
Run Code Online (Sandbox Code Playgroud)
该函数的工作方式shell(如手册中所述)是它运行命令,然后扩展为命令的输出。这就是为什么,当你看到:
SUN_COMPILER := $(shell $(CXX) -V 2>&1 | $(EGREP) -i -c "CC: (Sun|Studio)")
Run Code Online (Sandbox Code Playgroud)
该变量SUN_COMPILER设置为该 shell 命令的输出。
所以当你写这个时:
$(shell $(CXX) $(CXXFLAGS) -E -xarch=ssse3 -xdumpmacros /dev/null 2>/dev/null)
Run Code Online (Sandbox Code Playgroud)
运行命令,然后替换输出。之后,make 尝试将结果解析为 make 语法。但该命令的输出显然不是 make 语法,因此您会收到此错误。
如果您不关心输出而只关心退出代码,则需要丢弃输出:
$(shell $(CXX) $(CXXFLAGS) -E -xarch=ssse3 -xdumpmacros /dev/null >/dev/null 2>&1)
Run Code Online (Sandbox Code Playgroud)
或者将其分配给虚拟变量:
_x := $(shell $(CXX) $(CXXFLAGS) -E -xarch=ssse3 -xdumpmacros /dev/null 2>/dev/null)
Run Code Online (Sandbox Code Playgroud)
这样 make 将结果分配给变量而不是认为它是 make 语法。
| 归档时间: |
|
| 查看次数: |
1679 次 |
| 最近记录: |