make的更新规则和.PHONY

一般执行Makefile的时候都会有 xxx is up to date

表示这个文件已经是最新的。而不需要重新编译。

这样就节约了一大堆时间。如果依赖是最新的,那么就可以节约时间。


最终就是 如果目标的依赖没有更新的话.那么目标是不需要更新的(如果目标存在).主要是通过检查依赖是不是比目标更加新.



但是如下的文件

all:

cc -o main main.c


这样每次执行make的时候文件总是被更新的。为什么呢?

因为make只认当前目录下和目标名字一样的文件。


由于cc 指令产生的是 main文件而不是all文件。所以每次都会执行cc命令

一旦把all改成 main。由于main.c这些都没有修改。

又目标目录下有了main。因此就会不会更新了。


而PHONY的第一个作用就是避免目录中出现和目标同名的冲突

PHONY指定这个目标是一个为目标

如果没有 .PHONY: test

那么当目录中有一个文件夹恰好为test的时候。由于make发现这个目录存在,并且他的依赖没有更新。所以就会一直认为这个目录就是已经生成的目标。不会再去执行makefile中的test命令

如果指定的了.PHONY的话。无论如何都会执行test命令


另一个就是当某些源文件不是需要构建的目标的直接依赖的时候.可能会出现问题

假定有一个main.c和一个Makefile

main:
gcc -o main main.c


如果此时目录中存在一个main文件.那么无论你如何修改main.c.都会是main is up to date

因为makefile中的main没有依赖.并且目标文件夹中又有main这个文件.因此始终是新的

如果此时前面加上.PHONY:main 那么就会重新编译了。



注意如果是隐式生成.o文件.那么相当于

obj.o: obj.c

 cc -o obj.o obj.c

因此始终是会去编译的.








你可能感兴趣的:(GNU,MAKE)