4.编写规则

本系列文章均翻译自make官方文档:make Manual,github同步项目:question

Phony Targets

一个伪目标不是一个真正的文件名,只是一个当你明确的运行make请求时会被执行的recipe名字。有两个原因使用伪目标:

  • 避免同名文件冲突
  • 提升性能

解决的问题:

clean:
        rm *.o temp

这种写法在没有文件名冲突的时候可以通过make clean正常执行。但是如果在这个目录下有一个同名的文件cleanclean总是会被考虑是最新的文件,它的recipe不会执行。

添加一个伪目标即可解决这个问题:

.PHONY: clean
clean:
        rm *.o temp

与make的递归调用结合使用:

SUBDIRS = foo bar baz

subdirs:
        for dir in $(SUBDIRS); do \
          $(MAKE) -C $$dir; \
        done

这种写法的问题:任何在sub-make中的错误都会被忽视;不能并行构建目标。

改进后的写法:

SUBDIRS = foo bar baz

.PHONY: subdirs $(SUBDIRS)

subdirs: $(SUBDIRS)

$(SUBDIRS):
        $(MAKE) -C $@

foo: baz

最后一句声明了baz完成之后才能构建foo。

对于伪目标将跳过隐含规则的搜索。

伪目标不应该成为一个真实的目标文件的prerequisites,负责每次make更新文件都会执行伪目标的recipe

伪目标也可以有prerequisites

all : prog1 prog2 prog3
.PHONY : all

prog1 : prog1.o utils.o
        cc -o prog1 prog1.o utils.o

prog2 : prog2.o
        cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o
        cc -o prog3 prog3.o sort.o utils.o

一个伪目标的prerequisites是另一个伪目标时,表现为另一个的子程序:

.PHONY: cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff
        rm program

cleanobj :
        rm *.o

cleandiff :
        rm *.diff

执行顺序:rm *.o -> rm *.diff -> rm program

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值