下面是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)在这两种情况下,输出都是相同的"yes"。
所以我的结论是:
首先,我想知道我是正确地解释了,还是我理解错了。
如果我得到的是正确的,那么在第二种情况下,bar的值是空的,所以它应该给出no,而不是给yes。请澄清..。谢谢。
发布于 2015-02-07 14:07:56
首先,请注意,根据您的赋值,foo设置为bar不为true,但如果您想在foo中保存bar的值而是变量bar本身的名称,则它可能与预期的一样。
然后,请注意,在中,ifdef $( foo )指令实际上并不适用于变量foo本身,而是应用于在展开$(foo)之后生成的变量,因为该指令的语法是ifdef< variable_name >。在您的情况下,ifdef $(foo)将等同于ifdef。
ifdef不展开变量以查看该值是否为非空值,只测试变量是否有值。所以,
如果我得到的是正确的,那么在第二种情况下,bar的值是空的,所以它应该给不,而不是给出是。
是不对的值是空的,但它有一个值。
因此,使用ifdef的测试将返回除foo =以外的所有定义的true。若要测试空值,请使用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 definedhttps://stackoverflow.com/questions/28382619
复制相似问题