2013-07-12 89 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

這兩個答案都很棒。感謝您解釋爲什麼它不起作用。我一定會牢記這一點! –