Генерация исходного кода Protobuf Python с помощью Meson - PullRequest
0 голосов
/ 13 мая 2019

Просто учитесь использовать Meson и хотите создавать исходные / заголовочные файлы protobuf для нескольких языков - C ++, Python, Java, Javascript.C ++ был достаточно прост с использованием функции генератора в моем файле meson.build:

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 нет шага execute (), поскольку его не нужно компилировать.Я заметил, что meson (и, как выясняется, CMake) на самом деле не генерируют файлы protobuf, пока вы не вызовете executeable (), поэтому я не могу просто пропустить этот шаг, иначе файл MyExample_pb2.py не будет сгенерирован.Я не нашел примера для совместного использования meson / python / GPB после нескольких часов поиска.Не должен ли быть простой способ «связать» сгенерированные источники с файлом / модулем Python, как это делает CMake?

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})

1 Ответ

0 голосов
/ 24 мая 2019

Вы можете использовать трюк с custom_target () и «поддельным компилятором» в виде инструментов cp или cat (конечно, в средах с 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 , предполагая, что вам необходимо сгенерировать его как часть стандартного процесса сборки (конечно, включение этой цели также может быть условным).

...