本文共 1019 字,大约阅读时间需要 3 分钟。
最近在看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了。
参考:
转载地址:http://ipqxi.baihongyu.com/