[英]Makefile: ifeq directive compares special variable to constant does not work
我的Makefile有點問題。 我想make改變有關工作目錄的命令。 我在測試當前目標的目錄($(* D))的規則中添加了條件指令。
問題是make總是進入我的測試的第二個分支,即使我的文件在mySpecialDirectory中並且echo確實打印了“mySpecialDirectory”。
.c.o .cpp.o .cc.o:
ifeq ($(*D),mySpecialDirectory)
@echo "I'm in mySpecialDirectory! \o/"
$(CC) $(DEBUG_FLAGS) $(MYSPECIALFLAGS) -c $< -o $@
else
@echo "Failed! I'm in $(*D)"
$(CC) $(DEBUG_FLAGS) $(NOTTHATSPECIALFLAGS) -c $< -o $@
endif
這是預期的行為。
條件陳述
條件語法的所有實例都是立即解析的; 這包括ifdef,ifeq,ifndef和ifneq表單。 當然,這意味着自動變量不能在條件語句中使用,因為在調用該規則的命令腳本之前,不會設置自動變量 。 如果需要在條件中使用自動變量,則必須在命令腳本中使用shell條件語法,對於這些測試,不要使用條件。
$(*D)
是一個自動變量。
相反,考慮做:
.c.o .cpp.o .cc.o:
$(CC) $(DEBUG_FLAGS) $(if $(subst mySpecialDirectory,,$(*D)),$(NOTTHATSPECIALFLAGS),$(MYSPECIALFLAGS)) -c $< -o $@
這個想法是通過用空字符串替換mySpecialDirectory
來濫用$(subst)
進入某些相等測試。 然后,如果$(*D)
擴展等於mySpecialDirectory
,它將被空字符串完全替換,而$(if)
的else部分將按以下方式進行評估:
$(if condition,then-part[,else-part])
if函數在函數上下文中提供對條件擴展的支持(與GNU make makefile條件如ifeq相反(參見條件語法)。
第一個參數condition首先將所有前導和尾隨空格剝離,然后展開。 如果它擴展為任何非空字符串,則認為該條件為真。 如果它擴展為空字符串,則該條件被視為false。
注意這個hack在then-part
和else-part
之間的翻轉。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.