Makefile include 遇到的小问题

项目中有个Makefile, 但是调用 make 不跟任何参数时候执行了一个奇怪的target, 这个target并没有出现在当前的Makefile中,而根据本Makefile的意图,它是想在不跟任何参数时执行一个叫做rpms的target:
摘自Makefile:
.PHONY: rpms
default: rpms
仔细查看了一遍Makefile发现在文件的开头有这么一句代码:
include $(TOPDIR)/make-help.mk
赶紧查看make-help.mk发现那个奇怪的target是在这个文件中的,可是为什么呢?
先说结论:
1. make会自动执行Makefile中的第一个不是以 “.”开头的target

2. 当make遇到include这个关键字,会暂停读取当前的Makefile而转去读取include进来的内容。

因为“include”在“default: rpm” 之前,所以make读取了include的内容然后才继续读取“default: rpm”, 好死不死在include进来的内容中有target,这个target被当做了第一个target并且首先执行。

修改办法很简单,把include放到“default: rpms”之后就没问题了。

这里顺便夹带写make的知识,以便后用:

1. default: rpms 知识一个普通的target,default并不是一个关键字,因为作为第一个定义的target才被首先执行。真正实现定义首先执行的target关键字是:.DEFAULT_GOAL:= your target name

2. .PHONY 首先要明白的是make中target执行的先决条件实际上是文件,比如说有个target叫做clean

clean:
        rm *.o temp

当你执行make clean期待它总会执行,一般也没什么问题,但是当在当前目录中有叫做clean的文件,那么make clean将不会执行,为什么呢,因为文件clean的存在满足了先决条件,所以不用做事情了,怎么避免这种情况:用.PHONY

.PHONY: clean
clean:
        rm *.o temp

猜你喜欢

转载自blog.csdn.net/pushme_pli/article/details/79885980