1. 版本说明
首先说一下我用的make版本:
GNU Make 4.2.1
2. 无PHONY无clean的情况(无clean指当前目录下不存在clean文件)
文件名:makefile (听说M必须大写,我用小写也可以执行成功)
文件内容:
且目录下只有这一个文件
make 和 mak clean的效果一样 (这两个命令有什么区别?待查明后补充)
3. 术语补充
这里补充一个makefile的术语:规则
规则:用于说明如何生成一个或多个目标文件
规则的格式:
targets:prerequisites
command(必须是一个tab键,不能多也不能少,但是可以设置一个tab=4个空格)
对应上面的makefile
targets为clean, 前置依赖为空, command为rm -rf test
4. 无PHONY有clean的情况
提示clean是最新的,为什么会出现这条提示呢?
因为targets无前置依赖的时候,总是认为targets为最新。
5. 有PHONY,有clean的情况
当我们make生成目标文件和一堆临时文件后,想清理这些文件,这么写make,明显不会删除。所以,PHONY来了,一旦声明为PHONY的前置依赖,那么,make 或 make clean将忽略targets是否存在,直接运行commands。
1. 当前目录下存在clean,和test文件。
2. 当声明.PHONY:clean后,忽略clean文件的存在,直接执行命令
3. 所以test文件被删除了。
补充:
一、make和make clean的区别
make
根据Makefile文件编译源代码、连接、生成目标文件、可执行文件。
make clean
清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。
上面举的例子不是一个正常的编译makefile,下面以一个正常的makefile举例。
test.c文件内容
#include<stdio.h>
void main()
{
printf("hello world/n");
}
makefile内容:
ALL:test
test.o:test.c
gcc -c test.c -o test.o
test:test.o
gcc test.o -o test
clean:
rm -rf test test.o
可以看到,执行make后,makefile的前3个规则都执行了,make clean后,最后一个规则执行了。
此时,有2个问题:
1. 为什么make的时候,clean规则没有执行
2. clean规则可以改成别的名字吗,此时,还是执行make clean 还是 make 别的名字。
先来看第二个问题:
makefile内容:
ALL:test
test.o:test.c
gcc -c test.c -o test.o
test:test.o
gcc test.o -o test
aaa:
rm -rf test test.o
make还是执行前3个规则,当clean改名后,再执行make clean是没有效果的,也就是说,make clean的clean是规则名,而不是约定的名称。再执行make aaa,则完成临时文件的清理。 即,我们也可以执行make test.o 或者make test,都是可以执行的。
此时,又产生了一个问题:
ALL规则没有command, clean 规则没有前置依赖, 在执行时,会怎么样?
这里再补充一个概念,默认目标。第一行的ALL就是默认目标。在这个脚本里,ALL同样还是一个伪目标,所以不会生成ALL文件,但是ALL的依赖文件会生成。
为什么clean没有执行?
当clean非第一行时,因为其没有依赖文件,所以,默认其为最新的,不需要编译,就无需执行。只能通过手动触发来执行。