2016-12-01 51 views
0

當我運行make clean時,我得到了syntax error: unexpected end of file當存在括號時,makefile中的變量會導致意外的文件結尾

當我刪除導致錯誤的變量的括號時,我成功地擺脫了該錯誤。

我想知道爲什麼會發生這種情況。

我使用:

  • 的Windows XP SP2 64位
  • CYGWIN
  • KSH R48

我的變量稱爲TARGET,是這樣的,但程較長:

./ShowEnumContentsPrefAPI.o ./ShowEnumsPrefAPI.o

當錯誤發生的路線是:

rm -f $(TARGET)

當我刪除了括號中的錯誤不見了,它的工作:

rm -f $TARGET

另一條線,以及爲:

if [ "$(TARGET)" != "" ]; then \

當我刪除了括號中的錯誤不見了,它的工作:

if [ "$TARGET" != "" ]; then \

============================ ==================================

  • 這裏發生了什麼?
  • 如何在不更改導致錯誤的每一行的情況下防止發生這種情況(本makefile中有超過1000行)?
  • 這是如何工作mks 5.2 sh.exe並且不會在cygwin ksh上工作?

============================================ ==================

UPDATE:

這是實際的代碼:

clean: 
    if [ "$TARGET" != "" ]; then \ 
     rm -rf $(TARGET); \ 
    fi 

這就是產生的錯誤syntax error: unexpected end of file

clean: 
    if [ "$(TARGET)" != "" ]; then \ 
     rm -rf $(TARGET); \ 
    fi 

唯一的區別是圍繞目標的括號。


做好

echo "T:$T"; \ 
echo "TARGET:$TARGET"; \ 

生產

T: 
TARGET:ARGET 

echo "(TARGET):$(TARGET)";\再次產生的syntax error: unexpected end of file


今天我試着切斷了一些TARGET變量。故意手工縮短,rm -f $(TARGET)工作正常。我懷疑這是cygwin的問題rm[ exes。我會嘗試升級到cygwin的最新版本,看看問題是否存在。

回答

1

它看起來就像你分配一個值$T而不是$(TARGET)

與慶典,在化妝的$僅適用於下一個字符或bracketted表達。因此, '$TARGET' 解析爲 '$T' 加文字 'ARGET' ......爲了說明擴大,考慮以下因素:

X := _X_ 
XX := _YY_ 
$(info - $XX -) 
$(info - $(XX) -) 

你:

- _X_X - 
- _YY_ - 

希望有所幫助。

+0

我明白你的意思了。但是我發生在我身上的是相反的情況。而令人懷疑的是,我在文件的其他地方使用了$(),並且它工作正常。非常感謝。 –

+2

您必須發佈更完整的代碼 - 具體說明TARGET是如何設置的,以及更多關於它被引用位置的上下文(我假設它在配方中,如果它位於Makefile外調用的shell腳本中,然而,那是一個完全不同的問題)。 – John

+0

是的,它在配方中。我很抱歉,我會盡快更新問題。感謝幫助。 –

相關問題