include 的规则
Rule1 include 前面的减号,会忽略错误,当错误发生时,make 将忽略这些错误
实例代码
.PHONY:all
-include test.txt
all:
@echo "this is all."
当前目录下是没有 test.txt 的文件的, 执行make, 可以看到:
this is all.
去掉横杠
.PHONY:all
include test.txt
all:
@echo "this is all."
test.txt:
@echo " execuate test.txt"
包括,并终止makefile继续往下执行
makefile:2: test.txt: No such file or directory
make: *** No rule to make target `test.txt'. Stop.
Rule2 当包含的文件不存在时,make会去寻找同名的规则,这里的 test.txt,并执行规则下面的指令
来上一段实例代码,当前目录下面没有 test.txt 文件,但是我们增加了一条规则 test.txt,代码如下:
.PHONY:all
include test.txt
all:
@echo "this is all."
test.txt:
@echo "execuate test.txt"
直接看输出:
makefile:2: test.txt: No such file or directory
execuate test.txt
this is all.
可以看到执行第二条语句 include test.txt 的时候,打印没有找到文件或者目录,紧接着打印了test.txt规则下的内容。再继续执行了 all 规则。
Rule3 如果包含的文件存在,则会把文件内容加载到include指令处,并检查文件名对应的规则
前半句好理解,后半句,我们结合一个例子来说明
.PHONY:all
include test.txt
all:
@echo "this is all."
test.txt: b.txt
@echo "in test.txt"
执行结果如下
% make
this is all.
% touch b.txt
% ls
b.txt makefile test.txt
% make
in test.txt
this is all.
test.txt 没有内容,当 b.txt 不存在时,make 的时候,只打印了this is all, 还不能看出来test.txt规则有没有执行。这个时候我们touch b.txt ,显然,这个时候 test.txt 文件比 b.txt 要久了,再次make,这个时候先执行include,把 test.txt内容加载到当前位置,然后去检查test.txt规则,我们发现了** in test.txt**这段文字是打印了的。
基于这几个规则,我们后续可以通过识别.c文件的依赖,写入到文件中,同时make的时候,识别.c文件的依赖文件是否更新了,来触发改动文件的编译。
总结include 指令的规则如下:
-
当目标文件不存在时
以文件名为查找规则,并执行 -
当目标文件不存在,且查找到的规则中创建了目标文件
将创建成功的目标文件包含进当前makefile -
当目标文件存在
将目标文件包含进当前 makefile
以目标文件名查找是否有相应规则
有:比较规则的依赖关系,决定是否执行规则命令
否:无操作 -
当目标文件存在
当规则文件存在,且目标名对应的规则被执行
规则中的命令更新了目标文件
make 重新包含目标文件,替换之前包含的内容
目标文件未被更新
无操作
网友评论