在下面的Makefile不同輸出
f = echo $(1)
t:
$(call f,"a \
b"); \
$(call f,"a \
b")
- 只有一個TAB,在第4行(第一呼叫F)的
- 沒有空格的線的端部開始
輸出是
a b
a b
這兩個調用是相同的(除了最初的TAB)。爲什麼輸出不同?
在下面的Makefile不同輸出
f = echo $(1)
t:
$(call f,"a \
b"); \
$(call f,"a \
b")
輸出是
a b
a b
這兩個調用是相同的(除了最初的TAB)。爲什麼輸出不同?
我懷疑爲什麼輸出不同的答案是這是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;
我不知道這個代碼,但in
和ref
指針步調一致操作,所以比較out
到ref
似乎是錯誤的。用out > cmds->command_lines[i]
代替out > ref
可以解決您的問題,並且可能不會對代碼做出完全不正確的更改。
無論這是否是一個GNU Make錯誤,對於makefile來說,如何密切依賴於空白的移除是不是一個好主意。如果空白是在你的食譜真正顯著,你可以爲
f = echo $(strip $(1))
防禦性代碼,這一點,避免中風的任何問題。
這個例子不是真實的,但是隻是爲了突出我的問題。真正的代碼是用於一個mylog子例程,就像'log = echo'\'$(now)\'['''basename $(MAKE)\'($ @)]「$(1)>> $(logf)'我使用傳遞一個字符串。有時字符串參數很長,我用\分解它。 –
@BraMo:Make文檔沒有詳細描述什麼特別是在鄰接\ \轉義的換行符的空白處,並且不同版本的make可能會以不同的方式執行 - 絕對如果您現在報告的這個bug得到修復。所以,除非你想讓你的日誌輸出取決於你正在使用的Make版本,否則要避免用\來避免打破長字符串參數的實用性(儘管這很糟糕)或者添加'$(strip $ (1))'到你的'log'子程序,從而務實地避免了這個問題。 –
我無法重現您的結果。 – Beta
GNU'make' 3.81不會重現您的結果(在Mac OS X 10.8.3上使用當前XCode進行測試)。 –
使用GNU Make 3.81(在OS X 10.7.5上)和vanilla 3.82,在第5行的'b「)之前有9個空格;沒有出現8或更少的問題 –