现在的位置: 首页 > 技术文章 > 正文

Makefile 中的.PHONY

2014年12月22日 技术文章 ⁄ 共 1167字 ⁄ 字号 Makefile 中的.PHONY已关闭评论 ⁄ 阅读 2,082 次

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

×