【问题标题】:Makefile generic rule where target and prerequisite names differ目标和先决条件名称不同的 Makefile 通用规则
【发布时间】:2017-04-07 15:03:08
【问题描述】:

我目前正在尝试构建一个混合 C/Java 构建基础架构,该基础架构大量使用设置为正常工作的协议缓冲区。当 Ant 进行最终的 Java 构建时,在此之前在 Autoconf/Make 中完成了许多 JNI 先决条件,然后从我的 makefile 中调用 Ant。

这是我正在尝试的工作的 sn-p:

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 可以不同,或者这是否可能?

【问题讨论】:

    标签: makefile protocol-buffers automake


    【解决方案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/

    【讨论】:

      猜你喜欢
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      相关资源
      最近更新 更多