其他分享
首页 > 其他分享> > makefile "=", ":=", "?="

makefile "=", ":=", "?="

作者:互联网

makefile很久就知道,中间也学过一会。但是这个基本的赋值符号:=, :=, ?=老是忘了。所以今天网上看了写文章,自己也写下,做做总结。

背景

在学习u-boot的时候,接触到顶层的makefile文件。发现很多变量的引用,如:$(Q)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) \
MAKE是个变量,但是在该makefile中,没找到该变量的定义。在网上找到的资料说,这个是makefile的内部数据,
make -p可以查看得到:
-p, --print-data-base 打印 make 的内部数据库。

bian@bian-virtual-machine:~/linux/test$ make -p | grep MAKE
MAKEFILE_LIST :=  makefile
GNUMAKEFLAGS := 
MAKE_HOST := x86_64-pc-linux-gnu
MAKE_VERSION := 4.1
MAKELEVEL := 0
MAKE = $(MAKE_COMMAND)
MAKE_COMMAND := make
MAKEFLAGS = p
MAKEFILES := 
MAKEINFO = makeinfo
MAKE_TERMERR := /dev/pts/3
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
	$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
bian@bian-virtual-machine:~/linux/test$ 

再次这些"=",":="有点懵。

MAKE = $(MAKE_COMMAND)
MAKE_COMMAND := make

为什么MAKE_COMMAND还没赋值就被引用了,而且赋值是放在后面。于是

再次找 "=", ":=", "?="的资料

这三个赋值符号,之前已经看过好多遍了。但是makefile也是接触的少,过一段时间就忘。现在把它写下来,以后也能翻看。

以下内容很大部分参考网络文章

"="

"="应该算是最常见的符号了,但是确实很容易搞混。使用"="赋值时,变量的值是整个makefile中嘴后被指定的值

bian@bian-virtual-machine:~/linux/test$ cat makefile 
#makefile变量测试

VIR_A = A
VIR_B = $(VIR_A)B
VIR_A = AA

test:
	@echo $(VIR_A)
	@echo $(VIR_B)
bian@bian-virtual-machine:~/linux/test$ make
AA
AAB

VIR_B 引用了 VIR_A的值,这时使用的是”=“号,VIR_A应该是整个makefile展开后的最终值。

最终VIR_A = AA,所以VIR_B=AAB

”:=“

相对于”=“”:=“就比较简单点。根据当前变量的值给左值赋值,因此":="才是真正意义上的直接赋值

bian@bian-virtual-machine:~/linux/test$ cat makefile 
#makefile变量测试

VIR_A := A
VIR_B := $(VIR_A)B
VIR_A := AA

test:
	@echo $(VIR_A)
	@echo $(VIR_B)
bian@bian-virtual-machine:~/linux/test$ make
AA
AB
bian@bian-virtual-machine:~/linux/test$ 

VIR_B赋值时,由于当前VIR_A = A,直接忽略后续的展开。即使,最终VIR_A等于AAVIR_B等于AB也不会受到影响

"?="

"?="则比较简单,A ?= B 表示如果A没有被赋值,则等于B

解决u-boot makefile 中,变量MAKE的疑问

再次回到该问题:

MAKE = $(MAKE_COMMAND)
MAKE_COMMAND := make

可知MAKE等于最终MAKE_COMMAND展开后的值,即MAKE=make

标签:MAKE,makefile,bian,VIR,make,MAKEINFO
来源: https://www.cnblogs.com/bianbianbianbian/p/14375742.html