2016-11-08 58 views
0

我想在我的Makefile中创建一个变量。它将在ifeq声明中进行比较。但我的变量名被当作命令:将变量视为命令和ifeq语句的语法错误(括号)

make: dif: Command not found 

我:

dif := $(shell diff file1 <(./myprog < file2)) 

我一直在阅读一些手册和测试,但没有奏效。我的非工作效果如上所述。

编辑:

取得了一些进展,但第二个问题是IFEQ语句

$(eval dif = diff ./test0.out <(./rozwiązanie < ./test0.in)) // OK 

ifeq ($(dif),null) 

给出错误:

ifeq (diff ./test0.out <(./rozwiązanie < ./test0.in),null) 
Syntax error: word unexpected (expecting ")") 
Makefile:18: recipe for target 'test' failed 

回答

0

这里有许多问题。首先,请说明您使用的操作系统以及制作的版本;上面的一些错误似乎不是由GNU make(这是您使用的makefile语法)生成的,而有的则是其他错误。所以这很奇怪。请运行make --version并显示输出。其次,您使用的shell函数的语法特定于bash shell,但默认情况下,GNU make(与make的所有版本一样)使用POSIX sh shell。您在那里使用的输出重定向语法(<(./myprog <file2))不支持sh。如果您必须使用非标准的bash特定语法,则必须直接调用bash;例如:

dif := $(shell bash -c 'diff file1 <(./myprog <file2)') 

三,您使用eval不正确。 eval用于扩展makefile语法,而不是shell语法。本声明:

$(eval dif = diff ./test0.out <(./rozwiązanie < ./test0.in)) 

在各方面都对这种说法绝对相同的:

dif = diff ./test0.out <(./rozwiązanie < ./test0.in) 

所以你不实际运行shell命令不惜一切,你只需设置变量dif本静态字符串。

最后,从diff的输出绝不会只是字符串null,所以if语句:

ifeq ($(dif),null) 

永远不会为真。