2012-06-30 53 views
4

我设法编译我.proto文件是这样的:整合协议缓冲区到WAF

def build(bld): 
    bld(rule='protoc --cpp_out=. -I.. ${SRC}', source='a.proto b.proto', name='genproto') 

似乎工作不错,当我修改的源文件,他们正在重新编译等。但结果是,我需要包括到我的主要程序的源列表文件名为build/a.pb.ccbuild/b.pb.cc。我当然知道如何手动构建它们从我的协议缓冲区的文件名,但我不认为这是一段路要走。任何人都可以提供给我一个提示吗?

最好的问候,菲利普

UPDATE

与患者的帮助下从IRC的人,我能设法建立一个工具,如下建议。

#!/usr/bin/env python 
# encoding: utf-8 
# Philipp Bender, 2012 

from waflib.Task import Task 
from waflib.TaskGen import extension 

""" 
A simple tool to integrate protocol buffers into your build system. 

    def configure(conf): 
     conf.load('compiler_cxx cxx protoc_cxx') 

    def build(bld): 
    bld.program(source = "main.cpp file1.proto proto/file2.proto", 
      target = "executable") 

""" 

class protoc(Task): 
    run_str = '${PROTOC} ${SRC} --cpp_out=. -I..' 
    color = 'BLUE' 
    ext_out = ['.h', 'pb.cc'] 

@extension('.proto') 
def process_protoc(self, node): 
    cpp_node = node.change_ext('.pb.cc') 
    hpp_node = node.change_ext('.pb.h') 
    self.create_task('protoc', node, [cpp_node, hpp_node]) 
    self.source.append(cpp_node) 
    self.env.append_value('INCLUDES', ['.']) 

    self.use = self.to_list(getattr(self, 'use', '')) + ['PROTOBUF'] 

def configure(conf): 
    conf.check_cfg(package="protobuf", uselib_store="PROTOBUF", 
      args=['--cflags', '--libs']) 
    conf.find_program('protoc', var='PROTOC') 

你也可以找到它在错误追踪:

https://code.google.com/p/waf/issues/detail?id=1184

回答

1

这种处理在WAF书(寻找 “IDL”)进行了说明。

不过,我敢肯定,一个protobuf的工具,会受到社会的欢迎,所以我建议你尝试创建一个,并提交审查的bug跟踪或IRC。这样,你将减少维护负担,缩短wscript。

我希望使用的工具是这样的:

bld(
name="protobufs", 
features="protoc cxx", 
source=["protobuf/a.proto", "protobuf/b.proto"], 
includes=["protobuf", "..."], 
) 

bld(
target="test", 
features="cxx cxxprogram", 
source="test.cpp", 
use="protobufs", # uses the generated C++ code, links to -lprotobuf 
) 

或者类似的东西。

+0

谢谢你的建议,我想我会来挖成。 –