python - 使用 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.cc
和MyExample.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})
解决方案
您可以以cp或cat工具的形式使用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标志,假设您需要将其生成为标准构建过程的一部分(当然,启用此目标也可以是有条件的)。
推荐阅读
- java - 收集基于相似索引的列表集合
- python - 弹出构象后,kivy将值从一个屏幕传递到另一个屏幕
- jquery - Jquery - 如果模糊存在,则不是来自输入的值
- html - 如果是空的,则填充空白空间
- android - 使用意图 android 发送短信后返回我的应用程序
- javascript - 从文档 getElementById 重置数据
- macos - 我可以在 Docker Desktop for Mac 上运行 Windows 容器吗?
- java - 查找学生参加的最大课程的算法| 活动选择问题
- python-3.x - 迭代由两个单独的 zip() 对象组成的嵌套循环。这两个 zip 对象包含彼此之间具有不同长度的列表
- eigen - Eigen3 栈还是堆?