2016-02-28 54 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

这是伟大的。感谢您的解释。我认为我只遇到过简单的扩展变量,之前这就是为什么这种行为让我困惑。 –