读到一篇文章"内核映像的形成——寻找第一个目标",作者在行文中提到了makefile目标覆盖,内容如下:
"好了,我们跳过若干行变量定义,看到105行,我们的故事开始了:
105 # That's our default target when none is given on the command line
106 PHONY := _all
107 _all:
看到105行的注释,如果make后什么参数都没有,就到这里。在继续往下走之前,我们先来看个前提条件,就是97行对KBUILD_SRC有个判断,即KBUILD_SRC为空才会来到这里。我们看到注释,KBUILD_SRC当然是空的,所以我们敲击make之后,首先来到的是第107行。
当然,你可以做个试验,比如在107行后面添加一行,然后写一个@echo “hello, world!”命令,看看make以后会不会打印出来。试验的结果很令人诧异,什么也没有,看来我们的GNU make基本功还不扎实,还需要继续刻苦学习。看到142行:
142 ifeq ($(KBUILD_EXTMOD),)
143 _all: all
144 else
145 _all: modules
146 endif
这里怎么又出现了一个_all目标呢?这里引出一个非常重要的GNU make知识,那就是如果出现了相同的Target,那么后面的Target将会把前面的Target覆盖,并且执行后一个Target的命令和依赖。所以,当你make的时候,虽然会首先来到107行的_all目标,但紧接着,make会发现后面143或145还有一个_all,那么后面这一个_all就会覆盖它,所以我们看到142行。"
第一次见到这种规则,于是动手测试一下,手写了一个over.mk
all:
@echo "first"
all:
@echo "second"
运行结果:
root@ubuntu:~# cd Desktop/
root@ubuntu:~/Desktop# make -f over.mk
over.mk:4: warning: overriding commands for target `all'
over.mk:2: warning: ignoring old commands for target `all'
second
root@ubuntu:~/Desktop#
看结果,果然是后来的规则覆盖了前面的规则