目标名称和先决条件名称不同的Makefile通用规则

时间:2017-04-07 15:03:08

标签: makefile protocol-buffers automake

我目前正在尝试使用混合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有所不同,或者这是否可能?

1 个答案:

答案 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)))

灵感来自:http://make.mad-scientist.net/the-eval-function/