2017-04-07 94 views
1

我目前正試圖獲得混合C/Java構建基礎結構,以大量使用設置爲正常工作的協議緩衝區。在Ant完成最終的Java構建時,在此之前,Autoconf/Make中有很多JNI先決條件正在完成,然後Ant從我的makefile中調用。Makefile通用規則,其中目標名稱和前提條件名稱不同

這裏是什麼,我試圖讓工作的一個片段:

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時都會重新構建原始文件(以及因此取決於原始文件的任何內容)。

我該怎麼做才能讓%.java和%.proto可以有所不同,或者甚至有可能呢?

回答

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/