GNU Make documentation:ifdef中的矛盾?

时间:2015-11-16 06:09:39

标签: makefile gnu-make

以下是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),)。

1 个答案:

答案 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仅测试变量是否具有值。它不测试变量以查看该值是否为非空。