make是如何工作的
在默认的方式下,也就是我们只输入make命令。那么,
1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
3、如果edit文件不存在,或是edit所依赖的后面的 .o
文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
4、如果edit所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o
文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
make的退出码
make命令执行后有三个退出码:
0 —— 表示成功执行。
1 —— 如果make运行时出现任何错误,其返回1。
2 —— 如果你使用了make的“-q”选项,并且make使得一些目标不需要更新,那么返回2。
最近为了编译所有子目录,写了如下makefile
app :
@for i in $(SUBDIRS); do \
echo -e "\033[44;37;1m +++ Compiling $$i...\033[0m"; \
make -C $$i ; \
done
clean :
@for i in $(SUBDIRS); do \
echo -e "\033[44;37;1m +++ Cleaning $$i...\033[0m"; \
make -C $$i clean;\
done
.PHONY : all clean
在make时候,发现如果某个子目录编译错了,make不会停在下来,而是继续往下执行,于是想到了判断make的返回值,
来决定是否执行,修改位如下代码后,当发生错误时候,make会退出.
app :
@for i in $(SUBDIRS); do \
echo -e "\033[44;37;1m +++ Compiling $$i...\033[0m"; \
make -C $$i || exit $$?; \
done
当某个子目录编译失败的时候,会返回非零值,此时条件判断失败,从而会执行exit语句
阅读(13240) | 评论(0) | 转发(0) |