防止 GNU Make 在每次构建时生成 protobuf 代码
Prevent GNU Make from generating protobuf code each build
我有下面的 Makefile,其中 运行s Google 的 protoc
在某些 proto
文件上,生成代码并构建库
一切正常,除了它每隔 make
运行 生成代码这一事实,尽管 proto
文件或其他文件没有任何变化。我该如何预防?
GEN_FLAG:=$(PROJECT_ROOT)/build/.etcd_protocols_gen
ETCD=$(PROJECT_ROOT)/ext/etcd/
PROTOCOLS=$(ETCD)proto/
PROTO_FILES=$(shell find $(PROTOCOLS) -name \*.proto)
FILES=$(wildcard *.cc)
OBJS=$(patsubst %.cc,%.o,$(FILES))
LIB=$(BUILD_LIB_DIR)/libetcdclient.so
DIRS=proto
.PHONY: all
all: etcd-gen $(LIB)
-include $(FILES:.cc=.d)
.PHONY: etcd-gen
etcd-gen:
$(Q)echo "Generating ETCD gRPC C++ sources"
@ln -sf $(PROTOBUF_DIR)/libprotoc.so.16.0.0 $(PROTOBUF_DIR)/libprotoc.so.16
@ln -sf $(PROTOBUF_DIR)/libprotobuf.so.16.0.0 $(PROTOBUF_DIR)/libprotobuf.so.16
@LD_LIBRARY_PATH=$(PROTOBUF_DIR) $(PROTOBUF_DIR)/protoc -I $(PROTOCOLS) --cpp_out=. $(PROTO_FILES)
@LD_LIBRARY_PATH=$(PROTOBUF_DIR) $(PROTOBUF_DIR)/protoc -I $(PROTOCOLS) --grpc_out=. --plugin=protoc-gen-grpc=$(PROJECT_ROOT)/ext/grpc/bin/grpc_cpp_plugin $(PROTO_FILES)
@touch $(GEN_FLAG)
%.o: %.cc
@echo "CC $<"
$(Q)$(CC) $(CFLAGS) -c -o $@ $< -ldl
$(Q)$(CC) -MM $(CFLAGS) -MF $*.d -MT $*.o $*.cc
$(LIB): $(OBJS)
@echo "LD $@"
$(Q)$(CXX) $(CXXFLAGS) -shared -Wl,-soname,$(notdir $(LIB)) -o $(LIB) $(OBJS) $(LFLAGS) -L$(PROTOBUF_DIR) -l:libprotobuf.so.16
clean:
$(Q)rm -f *.d *.o *.pb.cc *.pb.h
$(Q)rm -f $(BUILD_LIB_DIR)/libetcdclient.so
$(Q)rm -f GEN_FLAG
make
认为目标是要生成的文件。因此,任何用于确定是否重建该文件的时间戳比较都是依赖项与目标时间戳的比较。
在你的情况下,make 正在检查一个不存在的文件的时间戳 etcd-gen
,因为它不存在或与源没有任何关系(源未列为依赖项)每次都会触发重建。
你可以做的是重新构造你的 makefile,这样你的 proto
源是 $(GEN_FLAG)
和 [=13] 的内容的依赖项=] 是一个目标。然后你可以声明 $(GEN_FLAG)
对 etcd-gen
.
的依赖
我有下面的 Makefile,其中 运行s Google 的 protoc
在某些 proto
文件上,生成代码并构建库
一切正常,除了它每隔 make
运行 生成代码这一事实,尽管 proto
文件或其他文件没有任何变化。我该如何预防?
GEN_FLAG:=$(PROJECT_ROOT)/build/.etcd_protocols_gen
ETCD=$(PROJECT_ROOT)/ext/etcd/
PROTOCOLS=$(ETCD)proto/
PROTO_FILES=$(shell find $(PROTOCOLS) -name \*.proto)
FILES=$(wildcard *.cc)
OBJS=$(patsubst %.cc,%.o,$(FILES))
LIB=$(BUILD_LIB_DIR)/libetcdclient.so
DIRS=proto
.PHONY: all
all: etcd-gen $(LIB)
-include $(FILES:.cc=.d)
.PHONY: etcd-gen
etcd-gen:
$(Q)echo "Generating ETCD gRPC C++ sources"
@ln -sf $(PROTOBUF_DIR)/libprotoc.so.16.0.0 $(PROTOBUF_DIR)/libprotoc.so.16
@ln -sf $(PROTOBUF_DIR)/libprotobuf.so.16.0.0 $(PROTOBUF_DIR)/libprotobuf.so.16
@LD_LIBRARY_PATH=$(PROTOBUF_DIR) $(PROTOBUF_DIR)/protoc -I $(PROTOCOLS) --cpp_out=. $(PROTO_FILES)
@LD_LIBRARY_PATH=$(PROTOBUF_DIR) $(PROTOBUF_DIR)/protoc -I $(PROTOCOLS) --grpc_out=. --plugin=protoc-gen-grpc=$(PROJECT_ROOT)/ext/grpc/bin/grpc_cpp_plugin $(PROTO_FILES)
@touch $(GEN_FLAG)
%.o: %.cc
@echo "CC $<"
$(Q)$(CC) $(CFLAGS) -c -o $@ $< -ldl
$(Q)$(CC) -MM $(CFLAGS) -MF $*.d -MT $*.o $*.cc
$(LIB): $(OBJS)
@echo "LD $@"
$(Q)$(CXX) $(CXXFLAGS) -shared -Wl,-soname,$(notdir $(LIB)) -o $(LIB) $(OBJS) $(LFLAGS) -L$(PROTOBUF_DIR) -l:libprotobuf.so.16
clean:
$(Q)rm -f *.d *.o *.pb.cc *.pb.h
$(Q)rm -f $(BUILD_LIB_DIR)/libetcdclient.so
$(Q)rm -f GEN_FLAG
make
认为目标是要生成的文件。因此,任何用于确定是否重建该文件的时间戳比较都是依赖项与目标时间戳的比较。
在你的情况下,make 正在检查一个不存在的文件的时间戳 etcd-gen
,因为它不存在或与源没有任何关系(源未列为依赖项)每次都会触发重建。
你可以做的是重新构造你的 makefile,这样你的 proto
源是 $(GEN_FLAG)
和 [=13] 的内容的依赖项=] 是一个目标。然后你可以声明 $(GEN_FLAG)
对 etcd-gen
.