2011-11-09 74 views
4

我寫了一個相當簡單的測試Makefile,其中我定義了兩個目標,全部都是& clean。我有兩個不同的條件陳述。檢查是否存在$(MAKECMDGOALS)特殊變量,另一個檢測是否有任何命令行目標匹配變量(NODEPS)中列出的目標。我遇到的問題是我的條件中的任何分支都不會執行。最終,我想用一個條件來決定我提供的目標是否應該包含一些自動生成的依賴文件,但目前我正努力讓這兩個表達式甚至可以評估。我正在運行GNU make 3.81版本,我已經在Ubuntu和Mac OS X下嘗試過了,但無濟於事。在GNU Make中使用ifeq和ifndef製作

NODEPS := clean 
    INCLUDE = $(filter $(NODEPS),$(MAKECMDGOALS)) 

    .PHONY : all clean 

    ifndef $(MAKECMDGOALS) 
     @echo "$$(MAKECMDGOALS) is not defined" 
    else 
     @echo "$(MAKECMDGOALS) is defined" 
    endif 

    ifneq (0, $(words $(INCLUDE))) 
     @echo "INCLUDE = $(INCLUDE) != 0" 
    else 
     @echo "INCLUDE = $(INCLUDE) == 0" 
    endif 


    all : 
     @echo "all : $(MAKECMDGOALS)" 

    clean : 
     @echo "clean : $(MAKECMDGOALS)" 
+0

這聽起來好像你對糧食工作。如果你想傳入一個變量,把它作爲變量傳入,而不是作爲目標。如果你想包含一個依賴文件,就包含它。 – Beta

回答

13

我最終設法弄清了什麼是錯的。 @eriktous是對的,指出我應該使用$(info)而不是@echo。更微妙的是,問題的一部分是我用一個選項卡縮進@echo。看起來標籤對規則是強制性的,但在條件中不允許。另一個錯誤是我在測試條件下擴大了$(MAKECMDGOALS)變量,應該只寫成ifndef MAKECMDGOALS

+0

我剛剛被縮進問題咬傷。 – elias

11

makefile不是shell腳本。你不能隨意地將可執行語句放在任何你喜歡的地方,並期望它們被執行。

有從一個makefile內與外界溝通的各種方式:$(info ...)$(warning ...)$(error ...)$(shell @echo ...)(部分或全部的這些可能是GNU使擴展)。

ps:你拼寫錯了PHONY

+0

感謝您發現拼寫錯誤。在大多數Makefiles打印信息的例子中,@ @ echo似乎是最流行的形式。我沒有意識到它只是作爲規則的一部分纔有效。 – Alastair