Protocol buffers 将协议缓冲区集成到WAF中

Protocol buffers 将协议缓冲区集成到WAF中,protocol-buffers,waf,Protocol Buffers,Waf,我成功地编译了.proto文件,如下所示: def build(bld): bld(rule='protoc --cpp_out=. -I.. ${SRC}', source='a.proto b.proto', name='genproto') bld( name="protobufs", features="protoc cxx", source=["protobuf/a.proto", "protobuf/b.proto"], includes=["protobuf",

我成功地编译了
.proto
文件,如下所示:

def build(bld):
    bld(rule='protoc --cpp_out=. -I.. ${SRC}', source='a.proto b.proto', name='genproto')
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
)
看起来效果不错,当我对源文件进行更改时,它们会被重新编译等等。但是结果将是名为
build/a.pb.cc
build/b.pb.cc
的文件,我需要将这些文件包括在我的主程序源代码列表中。当然,我知道如何从协议缓冲区文件名手动构造它们,但我不认为这是一种方法。有人能给我一个提示吗

问候你,菲利普

更新

在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')
您也可以在bugtracker中找到它:


Waf手册中记录了这种处理(查找“idl”)

然而,我非常肯定protobuf工具会受到社区的欢迎,所以我建议您尝试创建一个protobuf工具,并将其提交到bug追踪器或IRC上进行审查。这样,您将减少维护负担,缩短wscript

我希望使用这样的工具:

def build(bld):
    bld(rule='protoc --cpp_out=. -I.. ${SRC}', source='a.proto b.proto', name='genproto')
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
)

或者类似的东西。

谢谢你的建议,我想我会深入研究的。