當我運行makefile
SHELL=/bin/bash
a = False
ifeq ("", "")
a = True
endif
#b = False
#ifeq("","")
# b = True
#endif
#c = False
#if [ "" == "" ] \
#then \
# c = True \
#fi
#d = False
#if [[ "" == "" ]] \
#then \
# d = True \
#fi
all :
@\
echo a = $(a); \
echo b = $(b); \
echo c = $(c); \
echo d = $(d); \
\
c_loc=False; \
if [ "" == "" ]; \
then \
c_loc=True; \
fi; \
\
d_loc=False; \
if [[ "" == "" ]]; \
then \
d_loc=True; \
fi; \
\
echo c_loc = $${c_loc}; \
echo d_loc = $${d_loc}; \
我得到輸出
a = True
b =
c =
d =
c_loc = True
d_loc = True
Makefile:n: *** missing separator. Stop.在 Ubuntu 20.04 上使用 GNU Make 4.2.1 時取消注釋 if 陳述句 c 或 d 會導致錯誤。n是 if 陳述句 c 或 d 的行號。
另一方面,如果我在帶有 GNU Make3.81 的 Mac OS Big Sur v11.6.1 上運行相同的 makefile(if 陳述句 c 和 d 未注釋),我會得到輸出
a = True
b =
c = False
d = False
c_loc = True
d_loc = True
取消注釋 if 陳述句 b 會導致兩種設定中缺少分隔符錯誤。
我的問題:
- 為什么我在一個設定中出現 if 陳述句 c 和 d 缺少分隔符錯誤,而在另一個設定中卻沒有?這是由于 GNU Make 3 和 GNU Make 4 之間的差異還是 Ubuntu 和 MacOs 之間的差異?
- 為什么我在兩種設定中都沒有得到 if 陳述句 c 和 d 的 True 輸出?我在哪里可以找到關于序言中使用哪個 shell 的資訊?
uj5u.com熱心網友回復:
我不知道您所說的“序言”是什么意思;makefile 中沒有“序言”之類的東西。Makefiles 不是 shell 腳本,盡管它們在配方中包含 shell 腳本。唯一可以使用 shell 腳本語法的地方是配方中。自從 1970 年代發明 make 以來,情況一直如此。像if [...]; then; fishell 腳本語法這樣的內容只能出現在食譜中。
如果你想在配方之外有 if 陳述句,你必須使用makefile 語法,而不是 shell 語法。
至于為什么它在 GNU make 3.81 中“作業”(注意,它并沒有真正c作業,因為無論你在條件中輸入什么值,它都不會重置變數的值),這是因為在舊版本的 GNU make創建由空格組成的變數名過去是合法的。所以這:
c = False
if [ "" == "" ] \
then \
c = True \
fi
被解釋為這兩行(在減少反斜杠換行之后):
c = False
if [ "" == "" ] then c = True fi
在舊版本的 GNU make 中,變數名可以包含空格,這會將名為的變數設定為if [ "" == "" ] then cvalue True fi。這是合法的語法,但它顯然不符合您的預期。
在較新版本的 GNU make 中,我們不允許變數名包含空格,因此上面的文本是無效的語法,并且您會得到 make 的標準語法錯誤缺少分隔符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417471.html
標籤:
上一篇:未找到相對路徑命令
