以下是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)
在这两种情况下,输出都是相同的"是" 。
所以我得出的结论是:
首先,我想知道我是正确地解释还是我认为错了。
如果我正确地得到它,那么第二种情况下bar的值为空,所以它应该给出否而不是给予是。 请澄清......谢谢。
答案 0 :(得分:1)
首先,请注意,根据您的分配, foo 设置为 bar 而不是 true ,但它可能是预期的如果您想保存 foo 而不是 bar 的值,而是保存变量 bar 本身的名称。
然后,请注意, ifdef $(foo)指令实际上不适用于变量 foo 本身,而是适用于扩展后生成的变量$(foo),因为该指令的语法是 ifdef< variable_name> 。在您的情况下, ifdef $(foo)将等同于 ifdef bar 。
ifdef 不扩展变量以查看该值是否为非空,仅测试变量是否具有值。所以,
如果我正确地得到它,那么第二种情况下bar的值是 空的,所以它应该给予否定,而不是给予肯定。
不正确。该值为空,但它有一个值。
来自here的因此,使用 ifdef 的测试会返回 true 所有定义除外 那些像 foo = 。要测试空值,请使用 ifeq($(foo),)
。
因此,对于 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