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

转自:http://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html

在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验

新建一个Makefile,内容为:
ifdef DEFINE_VRE
    VRE = “Hello World!”
else
endif

ifeq ($(OPT),define)
    VRE ?= “Hello World! First!”
endif

ifeq ($(OPT),add)
    VRE += “Kelly!”
endif

ifeq ($(OPT),recover)
    VRE := “Hello World! Again!”
endif

all:
    @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!

从上面的结果中我们可以清楚的看到他们的区别了
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值

之前一直纠结makefile中“=”和“:=”的区别到底有什么区别,因为给变量赋值时,两个符号都在使用。网上搜了一下,有人给出了解答,但是本人愚钝,看不懂什么意思。几寻无果之下,也就放下了。今天看一篇博客,无意中发现作者对于这个问题做了很好的解答。解决问题之余不免感叹,有时候给个例子不就清楚了吗?为什么非要说得那么学术呢。^_^

1、“=”

make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:

x = foo
            y = $(x) bar
            x = xyz

在上例中,y的值将会是 xyz bar ,而不是 foo bar 。

2、“:=”

“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

x := foo
            y := $(x) bar
            x := xyz

在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

时间: 2024-09-28 16:37:02

Makefile 中:= ?= += =的区别的相关文章

Makefile 中:= ?= += =的区别【转】

转自:http://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html 在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验 新建一个Makefile,内容为: ifdef DEFINE_VRE VRE = “Hello World!” else endif ifeq ($(OPT),define) VRE ?= “Hello World! First!” endif i

Makefile 中:= ?= += =的区别 和条件执行

一:在Makefile中经常看到obj-m    := scull.o和KERNELDIR ?= /lib/modules/等不同的赋值方式,现在总结他们的区别: = 是最基本的赋值 := 是覆盖之前的值 ?= 是如果没有被赋值过就赋予等号后面的值 += 是添加等号后面的值 例: 1."=" make会将整个makefile展开后,再决定变量的值.也就是说,变量的值将会是整个makefile中最后被指定的值.看例子: x = foo y = $(x) bar x = xyz 在上例中,

[转]Makefile 中:= ?= += =的区别

转自:http://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html 在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验 新建一个Makefile,内容为:ifdef DEFINE_VRE    VRE = “Hello World!”elseendif ifeq ($(OPT),define)    VRE ?= “Hello World! First!”endif

Makefile中的%标记和系统通配符*的区别

Makefile中的%标记和系统通配符*的区别在于,*是应用在系统中的,%是应用在这个Makefile文件中的. (本文的测试环境是Windows7下使用MinGW提供的make.exe) 例如,如果你想编译一个文件夹下的所有.c文件,你可能会这样写: 1 %.o:%.c 2 gcc -o [email protected] $< 但是如果整个文件只有这两行的话,就会出现这样的错误: Make: *** target not found. stop. 要知道原因,我们先来看看另一个makefil

(转)makefile中的自动依赖规则

Makefile生成自动依赖的方法有两种: 1.  将所有.o文件的依赖关系写入单独文件,然后在Makefile中调用该文件 2.  每个.c文件对应一个.d文件,将依赖关系写入.d文件中 一.对于第一种方法,Makefile的写法如下: #file start CC = gcc SRCS := $(wildcard *.c) OBJS := $(patsubst %.c,%.o, $(SRCS)) all: main main: $(OBJS) $(CC) -o main $(OBJS) .d

[转]Makefile中使用$$的使用

http://blog.chinaunix.net/uid-12072359-id-2960866.html 在makefile中,会经常使用shell命令,也经常见到$var 和 $$var的情况,有什么区别呢,区别大了.不要认为在makefile的规则的命令行中使用$var就是将makefile的变量和shell共享了,这里仅仅是读取makefile的变量然后扩展开,将其值作为参数传给了一个shell命令.而$$var是在访问一个shell命令内定义的变量,而非makefile的变量.此外,

makefile编写---:= ?= += =的区别

在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验 新建一个Makefile,内容为:ifdef DEFINE_VRE    VRE = “Hello World!”elseendif ifeq ($(OPT),define)    VRE ?= “Hello World! First!”endif ifeq ($(OPT),add)    VRE += “Kelly!”endif ifeq ($(OPT),recover)   

makefile中的自动化变量[email&#160;protected],$%,$

转自:http://www.2cto.com/os/201302/191344.html 自动化变量 模式规则中,规则的目标和依赖文件名代表了一类文件名:规则的命令是对所有这 一类文件重建过程的描述,显然,在命令中不能出现具体的文件名,否则模式规则失去 意义.那么在模式规则的命令行中该如何表示文件,将是本小节的讨论的重点. 假如你需要书写一个将.c 文件编译到.o 文件的模式规则,那么你该如何为gcc 书写 正确的源文件名?当然了,不能使用任何具体的文件名,因为在每一次执行模式规则时 源文件名都

Makefile中wildcard的介绍

在Makefile规则中,通配符会被自动展开.但在变量的定义和函数引用时,通配符将失效.这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTERN...) .在Makefile中,它被展开为已经存在的.使用空格分开的.匹配此模式的所有文件列表.如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空.需要注意的是:这种情况下规则中通配符的展开和上一小节匹配通配符的区别. 一般我们可以使用“$(wildcard *.c)”来获取工作目录下的