我目前正在尝试使用混合C / Java构建基础架构,大量使用协议缓冲区设置为正常工作。虽然Ant正在进行最终的Java构建,但是在此之前有很多JNI先决条件在Autoconf / Make中完成,然后从我的makefile中调用Ant。
以下是我正在努力工作的片段:
PROTODIR = ../server/protos
PROTO_SOURCE = File_1.proto File_2.proto
BUILT_SOURCES = $(PROTO_SOURCE:.proto=.java)
# Tell make where to look for proto files
vpath %.proto $(PROTODIR)
# Build java from proto files
src/appname/proto/%.java: %.proto
protoc --java_out=src/ --proto_path=`dirname $<` $<
问题? protoc Java删除文件名中的下划线,因此%.java和%.proto文件名不匹配。构建最终会起作用,但每次调用Make时它都会重建proto文件(因此也会依赖于proto文件)。
我怎样才能使%.java和%.proto有所不同,或者这是否可能?
答案 0 :(得分:1)
好的,我找到了一种使用eval和定义的宏来实现它的方法。
PROTODIR = ../server/protos
PROTOGENDIR = src/appname/proto/
PROTO_SOURCE = File_1.proto File_2.proto
BUILT_SOURCES = $(subst _,,$(addprefix $(PROTOGENDIR), $(PROTO_SOURCE:.proto=.java)))
# Tell make where to look for proto files
vpath %.proto $(PROTODIR)
# Build java from proto files
define BUILDPROTO
$(subst _,,$(addprefix $(PROTOGENDIR), $(PROTONAME:.proto=.java))): $(PROTONAME)
protoc --java_out=src/ --proto_path=`dirname $$<` $$<
endef
$(foreach PROTONAME,$(PROTO_SOURCE),$(eval $(BUILDPROTO)))