【问题标题】:Generate Protobuf Python source with Meson使用 Meson 生成 Protobuf Python 源代码
【发布时间】:2019-05-12 21:02:41
【问题描述】:

刚刚学习如何使用 Meson 并希望为多种语言生成 protobuf 源/标头 - C++、Python、Java、Javascript。使用我的 meson.build 文件中的生成器函数,C++ 非常简单:

project('MesonProtobufExample', 'cpp')
protoc = find_program('protoc', required : true)
deps = dependency('protobuf', required : true)
gen = generator(protoc, \
  output    : ['@BASENAME@.pb.cc', '@BASENAME@.pb.h'],
  arguments : ['--proto_path=@CURRENT_SOURCE_DIR@', '--cpp_out=@BUILD_DIR@', '@INPUT@'])
generated = gen.process('MyExample.proto')
ex = executable('my_example', 'my_example.cpp', generated, dependencies : deps)

这会产生MyExample.pb.ccMyExample.pb.h 文件。我认为 Python 会同样简单,但我有点难过,因为我的 Python 脚本没有 executable() 步骤,因为它不需要编译。我注意到介子(结果是 CMake)在调用 executable() 之前实际上不会生成 protobuf 文件,所以我不能跳过这一步,否则不会生成 MyExample_pb2.py 文件。经过几个小时的搜索,我没有找到一起使用 meson/python/GPB 的示例。难道不应该像 CMake 那样有一种简单的方法将生成的源“链接”到 python 文件/模块吗?

protobuf_generate_python(PROTO_PY MyExample.proto)

# This command causes the protobuf python binding to be generated
add_custom_target(my_example.py ALL DEPENDS ${PROTO_PY})

【问题讨论】:

    标签: python protocol-buffers meson-build


    【解决方案1】:

    您可以使用 custom_target() 的技巧和 cpcat 工具形式的“假编译器”(当然,在 -nix 环境中,如果您愿意要支持 Windows,那么您可以使用条件 find_program())。这是 cp 的示例:

    py_gen = generator( ... )
    py_generated = gen.process('MyExample.proto')
    py_proc = custom_target('py_proto',
                            command: [ 'cp', '@INPUT@', '@OUTPUT@' ],
                            input : py_generated,
                            output : 'MyExample_pb2.py',
                            build_by_default : true)
    

    我添加了 buid_by_default 标志,假设您需要在标准构建过程中生成它(当然,启用此目标也可以是有条件的)。

    【讨论】:

    • 鉴于生成了.pb.cc' and .pb.h`,我不明白如何解决它,但在这里您将output 指定为单个文件。另外,如何使用此自定义目标将.pb.h 安装到安装前缀中的include/ 中?
    • @nh2 确切地说,这只是复制解决相关问题的 python 文件:“......我的 Python 脚本的步骤,因为它不需要编译”。答案与 .pb.cc / .pb.h 无关
    • 对不起,你完全正确。为了弄清楚github.com/mesonbuild/meson/issues/2451,我完全误读了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    相关资源
    最近更新 更多