2017-04-07 6 views
1

現在、プロトコルバッファを正しく使用するように設定したハイブリッドC/Javaビルドインフラストラクチャを取得しようとしています。 Antは最終的なJavaビルドを行っていますが、これに先立ってAutoconf/Makeで多くのJNI前提条件が実行されています。そしてAntは私の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が呼び出されるたびにprotoファイル(したがって、protoファイルに依存するもの)が再構築されます。

%.javaと%.protoが異なる場合がありますが、これも可能ですか?

答えて

1

OK、私はevalと定義されたマクロを使ってそれを行う方法を見つけました。 http://make.mad-scientist.net/the-eval-function/

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

に触発

関連する問題