Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313459
  • 博文数量: 66
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 509
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-29 13:56
文章分类
文章存档

2018年(2)

2017年(6)

2016年(34)

2015年(24)

我的朋友

分类: 嵌入式

2015-07-28 18:05:01

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) |
给主人留下些什么吧!~~