2013-05-20 129 views
0

在下面的Makefile不同輸出

f = echo $(1) 

t: 
    $(call f,"a \ 
     b"); \ 
    $(call f,"a \ 
     b") 
  • 只有一個TAB,在第4行(第一呼叫F)的
  • 沒有空格的線的端部開始

輸出是

a b 
a b 

這兩個調用是相同的(除了最初的TAB)。爲什麼輸出不同?

+0

我無法重現您的結果。 – Beta

+0

GNU'make' 3.81不會重現您的結果(在Mac OS X 10.8.3上使用當前XCode進行測試)。 –

+0

使用GNU Make 3.81(在OS X 10.7.5上)和vanilla 3.82,在第5行的'b「)之前有9個空格;沒有出現8或更少的問題 –

回答

0

我懷疑爲什麼輸出不同的答案是這是GNU Make的反斜槓 - 換行符空白崩潰時的一個小錯誤。相關的代碼是new_job()

/* Discard any preceding whitespace that has 
    already been written to the output. */ 
while (out > ref 
     && isblank ((unsigned char)out[-1])) 
    --out; 

我不知道這個代碼,但inref指針步調一致操作,所以比較outref似乎是錯誤的。用out > cmds->command_lines[i]代替out > ref可以解決您的問題,並且可能不會對代碼做出完全不正確的更改。

無論這是否是一個GNU Make錯誤,對於makefile來說,如何密切依賴於空白的移除是不是一個好主意。如果空白是在你的食譜真正顯著,你可以爲

f = echo $(strip $(1)) 

防禦性代碼,這一點,避免中風的任何問題。

+0

這個例子不是真實的,但是隻是爲了突出我的問題。真正的代碼是用於一個mylog子例程,就像'log = echo'\'$(now)\'['''basename $(MAKE)\'($ @)]「$(1)>> $(logf)'我使用傳遞一個字符串。有時字符串參數很長,我用\分解它。 –

+0

@BraMo:Make文檔沒有詳細描述什麼特別是在鄰接\ \轉義的換行符的空白處,並且不同版本的make可能會以不同的方式執行 - 絕對如果您現在報告的這個bug得到修復。所以,除非你想讓你的日誌輸出取決於你正在使用的Make版本,否則要避免用\來避免打破長字符串參數的實用性(儘管這很糟糕)或者添加'$(strip $ (1))'到你的'log'子程序,從而務實地避免了這個問題。 –