首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止GNU生成每次生成的原型代码

防止GNU生成每次生成的原型代码
EN

Stack Overflow用户
提问于 2018-08-07 11:36:09
回答 1查看 231关注 0票数 0

下面是Makefile,它在一些protoc文件上运行Google的proto,生成代码和构建库--除了生成每个make运行的代码之外--尽管proto文件或其他文件没有任何更改。我怎么才能防止这种情况?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-07 11:43:19

make将目标视为要生成的文件。因此,对时间戳的任何比较,以确定是否重新构建该文件,都是对依赖项和目标的比较。

在您的示例中,make是检查不存在的文件etcd-gen的时间戳,而且由于它不存在或与源没有任何关系(源没有作为依赖项列出),每次都会触发重新构建。

相反,您可以做的是重新构造makefile,这样您的proto源就是$(GEN_FLAG)的依赖项,$(GEN_FLAG)的内容就是目标。然后,可以将$(GEN_FLAG)声明为etcd-gen的依赖项。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51725834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档