【发布时间】:2023-04-09 16:23:02
【问题描述】:
我是一个项目的一部分,该项目使用 protobufs 在基于 Python 的客户端和基于 c++ 的服务器之间进行通信。我们也在使用 CMake。
使用 CMake,我正在寻找一种方法,以便仅在 *.proto 文件更改时有条件地调用 protoc 程序。我当前的目录结构(这似乎是问题的一部分)有一个*.proto 文件的目录,以及生成的*.pb.{h|cc} 和*_pb2.py 文件的单独目录:
build/
Messages/proto/ <--- .proto files are here
Messages/cpp/ <--- would like the auto generated c++ files here
Messages/py/ <--- would like the auto generated Python files here
Server/Main.cpp
Client/Main.py
CMakeLists.txt
(根)CMakeLists.txt 文件(下)在执行build/cmake .. 命令时运行protoc 程序:
project(AAA)
MESSAGE("Protobuf autogeneration STARTED")
file(GLOB proto_packages "${AAA_SOURCE_DIR}/Messages/proto/*.proto")
execute_process(COMMAND protoc -I=${AAA_SOURCE_DIR}/Messages/proto --cpp_out=${AAA_SOURCE_DIR}/Messages/cpp/ --python_out=${AAA_SOURCE_DIR}/Messages/py/ ${proto_packages})
MESSAGE("Protobuf autogeneration COMPLETED")
cmake_minimum_required(VERSION 2.8)
find_package(Boost)
find_package(Protobuf REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
include_directories(${PROTOBUF_INCLUDE_DIR})
add_subdirectory(Messages/proto)
add_subdirectory(Messages/cpp)
add_subdirectory(Server)
Messages/proto/CMakeLists.txt 文件(我不确定它是否有任何影响):
file(GLOB proto_packages "${AAA_SOURCE_DIR}/Messages/proto/*.proto")
execute_process(COMMAND protoc -I=${AAA_SOURCE_DIR}/Messages/proto --cpp_out=../cpp --python_out=../py ${proto_packages}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
理想情况下,protoc 程序应作为build/make 命令的一部分运行,并且仅(重新)生成*.pb.{h|cc} 和*_pb2.py 文件当 *.proto 文件更改时。
Server/ 目录中的某些文件具有#include <Messages/cpp/Xxxx.pb.h> 指令。
对于奖励积分,我希望将*.pb.{h|cc} 和*_pb2.py 文件生成到它们各自的目录中(分别为Messages/cpp/ 和Messages/py/)。但是,如果有人能够帮助解决问题的依赖部分,我很高兴 *.pb.{h|cc} 和 *_pb2.py 文件与 *.proto 文件共存。
提前感谢您的任何建议!
【问题讨论】:
标签: c++ python cmake protocol-buffers