簡體   English   中英

Makefile:ifeq指令將特殊變量與常量進行比較不起作用

[英]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-partelse-part之間的翻轉。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM