c++ - 防止 GNU Make 在每次构建时生成 protobuf 代码

标签 c++ protocol-buffers gnu-make

我有下面的 Makefile,它在一些 proto 文件上运行 Google 的 protoc,生成代码并构建库 一切正常,除了它在每次 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) 内容的依赖项$(GEN_FLAG) 是一个目标。然后你可以声明 $(GEN_FLAG) 一个 etcd-gen 的依赖。

关于c++ - 防止 GNU Make 在每次构建时生成 protobuf 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51725834/

相关文章:

makefile - 如何抑制makefile中的回声?

C++ 指针 vector 和引用变量

c++ - 为什么这里打印的复数不正确?

go - 从 protobuf 中的其他包导入类型定义

protocol-buffers - 不要在可选的protobuf字段中设置默认值,以最大程度地减少通过网络发送的数据

go - 在Go中编译Google-Fhir Proto文件时出错

c++ - Makefile 似乎以错误的顺序编译文件

c++ - 通过 OpenMPI 进行非阻塞数据共享

c++ - 删除类成员的动态分配的内存的最佳方法是什么

c - 如何在makefile中正确编写模式规则?