phony target有两种作用:
1,防止同名文件,使得规则总是被执行
2.改进性能
举例
1.PHONY:clean
这里clean目标没有依赖文件,如果执行make命令的目录中出现了clean文件,由于其没有依赖文件,所以它永远是最新的,所以根据make的规则clean目标下的命令是不会被执行的。如下的例子:
ld@Techbulo: cat Makefile obj = 1.c 2.c 3.c 4.c all: touch $(obj) clean: rm -rf $(obj) ld@Techbulo: ld@Techbulo: make touch 1.c 2.c 3.c 4.c ld@Techbulo: ls 1.c 2.c 3.c 4.c Makefile ld@Techbulo: make clean rm -rf 1.c 2.c 3.c 4.c ld@Techbulo: ls Makefile ld@Techbulo: make touch 1.c 2.c 3.c 4.c ld@Techbulo: touch clean ld@Techbulo: ls 1.c 2.c 3.c 4.c clean Makefile ld@Techbulo: make clean make: `clean' is up to date. ld@Techbulo: ls 1.c 2.c 3.c 4.c clean Makefile ld@Techbulo:
这个Makefile中all目标是创建空的1.c 2.c 3.c 和4.c 。 clean目标是删除这些文件,但是如果当前目录中出现了一个clean文件,在执行make clean时就不会在执行clean目标下的命令了。下面看看在clean目标前加上.PHONY之后的情况:
ld@Techbulo: cat Makefile obj = 1.c 2.c 3.c 4.c all: touch $(obj) .PHONY: clean clean: rm -rf $(obj) ld@Techbulo: ls 1.c 2.c 3.c 4.c clean Makefile ld@Techbulo: make clean rm -rf 1.c 2.c 3.c 4.c ld@Techbulo: ls clean Makefile ld@Techbulo:
2.改进性能
这是在调用子make的时候用的
SUBDIRS = foo bar baz subdirs: for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir; \ done
当其中一个出错的时候,make能就运行,一直到循环结束,假如我们需要在其中出错的时候,就停下,这个时候就需要借助用.PHONY
SUBDIRS = foo bar baz .PHONY: subdirs $(SUBDIRS) subdirs: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ foo: baz