2016-02-28 51 views
2

就這個問題而言,通過條件變量賦值我的意思是?=運算符和標準賦值我的意思是:=運算符。爲什麼條件變量賦值會設置一個值,但標準賦值不會?

我想通過將它分配給一個變量來檢查命令是否存在,然後使用ifdef來檢查它,但是我看到了不同的行爲,這取決於我用來執行初始分配的兩個運算符中的哪一個。

這是一個蒸餾的Makefile示例。請注意,我的系統上不存在foobar,因此我希望這兩種檢查都會觸發「未找到」分支。

FOO := $(shell which foo) 
BAR ?= $(shell which bar) 

all: 
ifdef FOO 
    echo "FOO found with value '${FOO}'" 
else 
    echo "FOO not found" 
endif 
ifdef BAR 
    echo "BAR found with value '${BAR}'" 
else 
    echo "BAR not found" 
endif 

當我運行make,我得到這樣的結果:

FOO not found 
BAR found with value '' 

GNU make documentationifdef尋找一個非空值。

爲什麼這兩個賦值運算符在行爲和它們產生的不同?

回答

2

諮詢GNU Make documentation注意 一個遞歸擴展變量簡單擴展型變量之間的差異。

FOO := $(shell which foo) 

限定FOO$(shell which foo), 的簡單擴展值,它是空字符串。因此ifdef FOO將評估錯誤。

BAR ?= $(shell which bar) 

定義BAR,除非它已經定義,如$(shell which bar)。它簡寫爲

ifndef BAR 
    BAR = $(shell which bar) 
endif 

通知=,不:=

假設BAR是不是已經定義的,它的定義變得$(shell which bar),不是空字符串。 因此,在:

ifdef BAR 
    echo "BAR found with value '${BAR}'" 
else 
    echo "BAR not found" 
endif 

BAR被發現有一個定義和 其定義的遞歸擴展值相呼應,這是「」。

要想從BARFOO相同的行爲,請嘗試:

FOO := $(shell which foo) 
BAR ?= $(shell which bar) 
BAR := $(BAR) 

all: 
ifdef FOO 
    echo "FOO found with value '${FOO}'" 
else 
    echo "FOO not found" 
endif 
ifdef BAR 
    echo "BAR found with value '${BAR}'" 
else 
    echo "BAR not found" 
endif 
+0

這是偉大的。感謝您的解釋。我認爲我只遇到過簡單的擴展變量,之前這就是爲什麼這種行爲讓我困惑。 –