Makefile中的 = ?= := +=直接的区别

来源:互联网 发布:预告片 知乎 编辑:程序博客网 时间:2024/06/07 07:16

  Makefile中在定义变量的时候,我们可以使用其它变量来构造变量的值,在Makefile中有两种方式来定义变量的值是=方式和:=方式。

  在说明两者直接的不同时,先来说明下使用的变量。在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字符串,

在Makefile中执行的时候其会自动原模原样地展开在使用的地方。其与C/C++所不同的是,你可以在Makefile中改变其值。在Makefile中,变量可以使用在“目标”,“依赖目标”,“命令”或是Makefile的其它部分中

  第一种方式:也就是简单的使用“=”号,在“=”左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何一处,也就是说,右侧中变量不一定非要是已定义好的值,其可以使用后面定义的值如:

foo = $(bar)bar = $(ugh)ugh = Huh?all:echo $(foo)

我们执行“make all”将会打出变量$(foo)的值是“Huh?”( $(foo)的值是$(bar),$(bar)的值是$(ugh),$(ugh)的值是“Huh?”)可见,变量是可以使用后面的变量来定义的。而对于上面重复定义的变量,要用最后更新的变量来确定值,例如:

  x = foo            y = $(x) bar            x = xyz      在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
第二种方式:也就是“:=”,表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值

x := fooy := $(x) barx := later其等价于:y := foo barx := later

前面的变量不能使用后面的变量,只能使用前面已定义好了的变量,例如:

y := $(x) bar
x := foo
那么,y的值是“bar”,而不是“foo bar”。


对于上其他两者的区别是:

?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值

例子:

ifdef DEFINE_VRE    VRE = “Hello World!”elseendififeq ($(OPT),define)    VRE ?= “Hello World! First!”endififeq ($(OPT),add)    VRE += “Kelly!”endififeq ($(OPT),recover)    VRE := “Hello World! Again!”endifall:    @echo $(VRE)敲入以下make命令:make DEFINE_VRE=true OPT=define 输出:Hello World!make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!make DEFINE_VRE=true OPT=recover  输出:Hello World! Again!make DEFINE_VRE= OPT=define 输出:Hello World! First!make DEFINE_VRE= OPT=add 输出:Kelly!make DEFINE_VRE= OPT=recover 输出:Hello World! Again!




0 0
原创粉丝点击