首页 > 解决方案 > 使用 Meson 生成 Protobuf Python 源代码

问题描述

刚刚学习如何使用 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})

标签: pythonprotocol-buffersmeson-build

解决方案


您可以以cpcat工具的形式使用custom_target()和“假编译器”的技巧(当然,在 -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标志,假设您需要将其生成为标准构建过程的一部分(当然,启用此目标也可以是有条件的)。


推荐阅读