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等于AA, VIR_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