makefile规则之order-only依赖 ----- |

最近在看caffe的代码,首先不得不说caffe的代码写的这是结构清晰,代码简洁。后续我也会写关于caffe源码解析的博文。今天主要是看一下makefile规则里面的一个order-only依赖规则。


我们都知道makefile构建工程的基本语句是:

targets : prerequisites
    command

这句构造语句可以简单理解为,根据prerequisites中的文件,利用command构造规则,构造得到target。makefile的好处只有是当prerequisites中有任何文件发生改变时才重新构造target。但是,有时候我们希望只有当prerequisites中的部分文件改变时才重新构造target。
这就是order-only prerequisites产生的目的。

具有order-only prerequisites的prerequisites具有如下的形式:

targets : normal-prerequisites | order-only-prerequisites

它的功能是,只有第一次构造targets时才会使用order-only-prerequisites,后面即使order-only-prerequisites发生改变,也不会重新构造targets,而只有normal-prerequisites中的文件发生改变时才重新构造targets。

具体我们看一下caffe的makefile里面的一小段用于生成protobuf代码的构造语句:

$(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \
        | $(PROTO_BUILD_DIR)
    @ echo CXX $<
    $(Q)$(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \
        || (cat $@.$(WARNS_EXT); exit 1)
    @ cat $@.$(WARNS_EXT)

这句话的意思是,在第一次构造(PROTO_BUILD_DIR)/%.pb.o时,要先构造PROTO_BUILD_DIR,也就是创建这个目录。后面如果这个目录发生改变,则不需要再重新构造(PROTO_BUILD_DIR)/%.pb.o了。

参考:
Make Doc

猜你喜欢

转载自blog.csdn.net/swartz2015/article/details/79828841