最简单的程序和makefile
先写一个最简单的C语言程序和makefile
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
对应的makefile如下
hello : main.c
gcc -o hello main.c
这就构成了最简单的程序和makefile组合,执行make后,就会编译出hello可执行程序。
如果我想加一个规则,可以删除hello的可执行程序,该如何做呢?
clean的尴尬
加一个可以删除hello的规则如下
hello : main.c
gcc -o hello main.c
clean :
rm -f hello
执行make clean
后确实可以删除hello。
但是由上一小节我们知道当目标对应的文件不存在时,会执行对应的命令。
那假如我们就有一个和clean
一样名字的文件,会发生什么呢?
不妨touch
一个clean文件,然后执行make clean
,make则会表明
make: 'clean' is up to date.
这就有点尬尴了,本来我是想删除hello文件的,现在无法删除。这就好像是在熟悉的环境里,你和别人撞了衫,很尴尬;更尬尴的是,他还比你帅。不能忍!
由此可以看出make的三个特点
- make默认认为目标对应的是文件
- make根据目标和依赖的时间戳的新旧,来决定是否执行命令
- make会优先处理文件
引入伪目标
如果我想在有clean文件的状态下,还可以执行目标clean下的命令,这就需要将clean设置成伪目标了。
伪目标也有着三个特点
- 通过
.PHONY
来声明伪目标 - 伪目标不对应文件
- 伪目标的依赖更新与否都会执行对应的命令
加上clean
伪目标的makefile如下
hello : main.c
gcc -o hello main.c
clean :
rm -f hello
.PHONY : clean
再次执行make clean
后,发现可以删除hello了,这就把尴尬消解了。
其实,伪目标还可以依赖伪目标,就可以起到规则调用的效果,有点类似函数调用。