2013-07-12 67 views
6

我正在尝试执行make语句来检查体系结构。我很接近得到它工作:Makefile条件错误

test: 
     ifeq ("$(shell arch)", "armv7l") 
       echo "This is an arm system" 
     else 
       echo "This is not an arm system." 
     endif 

我有一个问题:尽管这似乎决心ifeq ("i386", "armv7l")这应该是假的,我得到以下错误:

$ make 
ifeq ("i386", "armv7l") 
/bin/sh: -c: line 0: syntax error near unexpected token `"i386",' 
/bin/sh: -c: line 0: `ifeq ("i386", "armv7l")' 
make: *** [test] Error 2 

所以,解决了两个字符串相互比较,但是存在语法错误。这里有什么问题?

回答

9

您不能在配方中使用像ifeq这样的make语句。食谱(以TAB开头的行)被传递给shell。壳不懂ifeq;这是一个构造。

您将不得不在配方中使用shell if语句。而且,您不必在配方中使用$(shell ...),因为您在壳牌中已经有已经

test: 
     if [ `arch` = armv7l ]; then \ 
      echo "This is an arm system"; \ 
     else \ 
      echo "This is not an arm system."; \ 
     fi 

这可能是不处理的最佳方式,但因为你没有提供什么你真的想用这个做任何信息这一切都可以说。

+0

它是如何更清晰的可以吗?我只是想检查体系结构并有条件地执行语句。但谢谢你的答案。公认。 –

+0

如果你真的只想在每一个配方行中写一个if语句,那么我同意它很清楚。然而,大多数情况下,人们真的想做更多的事情,比如使用不同的编译器标志或者不同的编译器,添加不同的源文件等。有很多更好的方法来做这些事情,比添加大量if - 所有makefile文件中的语句。 – MadScientist

+0

顺便说一句'=='与'='同义' –

11

正如MadScientist所说,make正在将ifeq行传递给shell,但是如果您正确编写它,则可以在配方中将诸如ifeq之类的make结构与命令混合使用。你只需要了解如何make解析Makefile

如果一行以TAB开始,它被认为是一个命令外壳无论在哪里行是文件内。

如果不是以TAB开头,make将其解释为其自己语言的一部分。

所以,解决您的文件,只要避免与TAB开始make条件语句:

test: 
ifeq ("$(shell arch)", "armv7l") 
     echo "This is an arm system" 
else 
     echo "This is not an arm system." 
endif 
+1

这两个答案都很棒。感谢您解释为什么它不起作用。我一定会牢记这一点! –