Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Makefile条件指令_Linux_Makefile - Fatal编程技术网

Linux Makefile条件指令

Linux Makefile条件指令,linux,makefile,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 $(fr

下面是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的值被选中
  • 在第二种情况下,ifdef的参数直接为foo,因此会检查foo的值,因此语句ifdef会检查foo的值,即$(bar)
首先,我想知道我的口译是正确的,还是我感觉错了

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

  • Makefile1
首先,请注意,根据您的赋值,foo被设置为bar而不是true,但是如果您希望在foo中保存的不是bar的值,而是变量bar本身的名称,那么这可能是您想要的

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

  • Makefile2
ifdef不展开变量以查看该值是否为非空,只测试变量是否有值。所以

如果我得到的是正确的,那么第二种情况下的bar值是 空的,所以它应该给出no而不是yes

这是不对的。该值为空,但有一个值

因此,使用ifdef的测试对于除 像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

它意味着FIFCKECK只有FO具有值$(bar),它不进一步扩展它,或者扩展它,但它认为空的是空的。@ abijaTyasaseh是的,换句话说,它测试FO是“定义的”,如IFDF所建议的操作。您可以使用函数origin()来测试变量是否未定义,即它检查foo是否有值$(bar),并且它不会进一步展开以检查bar的值,或者它允许定义空值,就像bar=。请澄清。@AbhijatyaSingh Yes表示它检查foo是否已被分配到某个值,并且不会进一步扩展。感谢@pmod澄清疑问。