makefile目标覆盖

    读到一篇文章"内核映像的形成——寻找第一个目标",作者在行文中提到了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# 
看结果,果然是后来的规则覆盖了前面的规则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值