Makefile Conditionals指令

时间:2015-02-07 13:23:23

标签: linux makefile

以下是Make文件的片段: Makefile1:

bar = true
foo = bar
ifdef $(foo)
frobozz = yes
endif
all = ; @echo The value of frobozz is $(frobozz)

Makefile2:

bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif

all = ; @echo The value of frobozz is $(frobozz)

在这两种情况下,输出都是相同的"是"

所以我得出的结论是:

  • 在第一种情况下,ifdef的参数是$(foo),最终变为bar意味着该语句实际上看起来像 ifdef bar ,因此bar的值被cheked。
  • 在第二种情况下,ifdef的参数直接为foo,因此检查foo的值,因此语句ifdef检查foo的值是$(bar)。

首先,我想知道我是正确地解释还是我认为错了。

如果我正确地得到它,那么第二种情况下bar的值为空,所以它应该给出而不是给予。 请澄清......谢谢。

1 个答案:

答案 0 :(得分:1)

  • Makefile1

首先,请注意,根据您的分配, foo 设置为 bar 而不是 true ,但它可能是预期的如果您想保存 foo 而不是 bar 的值,而是保存变量 bar 本身的名称。

然后,请注意, ifdef $(foo)指令实际上不适用于变量 foo 本身,而是适用于扩展后生成的变量$(foo),因为该指令的语法是 ifdef< variable_name> 。在您的情况下, ifdef $(foo)将等同于 ifdef bar

  • Makefile2

ifdef 不扩展变量以查看该值是否为非空,仅测试变量是否具有值。所以,

  

如果我正确地得到它,那么第二种情况下bar的值是   空的,所以它应该给予否定,而不是给予肯定。

不正确。该值为空,但它有一个值。

  

因此,使用 ifdef 的测试会返回 true 所有定义除外   那些像 foo = 。要测试空值,请使用 ifeq($(foo),)

来自here

因此,对于 ifdef foo bar 之间存在差异,我们可以从以下实验中看到:

 bar=
 foo=$(bar)
 $(warning origin=$(origin foo), flavor=$(flavor foo), value="$(value foo)")
 $(warning origin=$(origin bar), flavor=$(flavor bar), value="$(value bar)")

 ifdef foo
 $(warning foo defined)
 else
 $(warning foo is not defined)
 endif

 ifdef $(bar)
 $(warning bar defined)
 else
 $(warning bar is not defined)
 endif

输出:

 Makefile:3: origin=file, flavor=recursive, value="$(bar)"
 Makefile:4: origin=file, flavor=recursive, value=""
 Makefile:7: foo defined
 Makefile:15: bar is not defined

但是,您只需稍加改动就可以强制扩展:在分配变量foo时添加冒号: foo:= $(bar),两者都不会被定义:

 Makefile:3: origin=file, flavor=simple, value=""
 Makefile:4: origin=file, flavor=recursive, value=""
 Makefile:9: foo is not defined
 Makefile:15: bar is not defined