以下是GNU Make中ifdef条件的文档。这个假设告诉我什么?
conditional-directive
text-if-true
else
text-if-false
endif
ifdef表单将变量的名称作为其参数,而不是对变量的引用。 该变量的值具有非空值,text-if-true有效; 否则,text-if-false(如果有)有效。从未定义过的变量具有空值。文本变量名称已扩展,因此它可以是扩展为变量名称的变量或函数。
请注意, ifdef仅测试变量是否具有值。它不会扩展变量以查看该值是否为非空。因此,使用ifdef的测试对于除了likefoo =之外的所有定义都返回true。要测试空值,请使用ifeq($(foo),)。
答案 0 :(得分:1)
ifdef
表单将变量的名称作为其参数,而不是对变量的引用。该变量的值具有非空值, text-if-true 有效;否则, text-if-false (如果有)是有效的。从未定义过的变量具有空值。
假设我们有一个变量foo
,那么分配的值足以使ifdef
认为它true
,它不关心foo
}的实际价值。有些人可能会认为0
或空字符串是假的,但不是ifdef
。
foo = 0 # or even ''
ifdef foo # true, bar will be set to 1
bar = 1
else
bar = 0
endif
请注意,
ifdef
仅测试变量是否具有值。它不会扩展变量以查看该值是否为非空。
因此,当它已经有变量时,不再进行进一步的扩展(如上所述)。
文本变量名已扩展,因此它可以是扩展为变量名称的变量或函数。
但是,当我们传递对变量或函数的引用时,则完成扩展。 same document中给出的示例澄清了这一点:
bar = true
foo = bar
ifdef $(foo)
frobozz = yes
endif
变量引用
$(foo)
被扩展,产生bar
,这被认为是变量的名称。变量bar
未展开,但会检查其值以确定它是否为非空。
混淆是由于这一行:
请注意,
ifdef
仅测试变量是否具有值。它不会扩展变量以查看该值是否为非空。
这会更好:
请注意,
ifdef
仅测试变量是否具有值。它不测试变量以查看该值是否为非空。