Сгенерируйте исходный код Protobuf Python с помощью Meson

Просто изучаю, как использовать 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    : ['@[email protected]', '@[email protected]'],
  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 нет шага executeable (), поскольку его не нужно компилировать. Я заметил, что meson (и, как оказалось, CMake) на самом деле не генерируют файлы protobuf, пока вы не вызовете исполняемый файл (), поэтому я не могу просто пропустить этот шаг, иначе файл 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})

person timcardenuto    schedule 12.05.2019    source источник


Ответы (1)


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

person pmod    schedule 24.05.2019
comment
Я не понимаю, как это решает проблему, учитывая, что создается .pb.cc' and .pb.h`, но здесь вы указываете output как один файл. Кроме того, как установить .pb.h в include/ в префиксе установки, используя эту настраиваемую цель? - person nh2; 20.02.2020
comment
@ nh2 точно, это просто копирует файл python, который решает проблему, о которой идет речь: ... шаг для моего сценария Python, поскольку его не нужно компилировать. Ответ не имеет отношения к .pb.cc / .pb.h - person pmod; 20.02.2020
comment
Ах, извините, вы совершенно правы. В своем стремлении выяснить github.com/mesonbuild/meson/issues/2451 я полностью неверно истолковал вопрос. - person nh2; 20.02.2020